GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie rekodiere ich bedingt in UTF-8?

Diese Nachricht ist ziemlich alt, aber ich denke, ich kann zu diesem Problem beitragen:
Erstellen Sie zuerst ein Skript mit dem Namen recodeifneeded :

#!/bin/bash
# Find the current encoding of the file
encoding=$(file -i "$2" | sed "s/.*charset=\(.*\)$/\1/")

if [ ! "$1" == "${encoding}" ]
then
# Encodings differ, we have to encode
echo "recoding from ${encoding} to $1 file : $2"
recode ${encoding}..$1 $2
fi

Sie können es auf diese Weise verwenden:

recodeifneeded utf-8 file.txt

Wenn Sie es also rekursiv ausführen und alle *.txt-Dateicodierungen auf (sagen wir) utf-8 ändern möchten:

find . -name "*.txt" -exec recodeifneeded utf-8 {} \;

Ich hoffe, das hilft.


Dieses Skript, angepasst an die Idee von Harrymc, das eine Datei bedingt neu codiert (basierend auf der Existenz bestimmter UTF-8-codierter skandinavischer Zeichen), scheint für mich ziemlich gut zu funktionieren.

$ cat recode-to-utf8.sh 

#!/bin/sh
# Recodes specified file to UTF-8, except if it seems to be UTF-8 already

result=`grep -c [åäöÅÄÖ] $1` 
if [ "$result" -eq "0" ]
then
    echo "Recoding $1 from ISO-8859-1 to UTF-8"
    recode ISO-8859-1..UTF-8 $1 # overwrites file
else
    echo "$1 was already UTF-8 (probably); skipping it"
fi

(Stapelverarbeitung von Dateien ist natürlich eine einfache Sache von z.B. for f in *txt; do recode-to-utf8.sh $f; done .)

NB :Dies hängt vollständig davon ab, dass die Skriptdatei selbst UTF-8 ist. Und da dies offensichtlich eine sehr begrenzte Lösung ist, die für die Art von Dateien geeignet ist, die ich zufällig habe, fühlen Sie sich frei, bessere Antworten hinzuzufügen die das Problem allgemeiner lösen.


UTF-8 hat strenge Regeln darüber, welche Bytesequenzen gültig sind. Das bedeutet, wenn Daten könnten UTF-8 sein, werden Sie selten falsch positive Ergebnisse erhalten, wenn Sie davon ausgehen, dass es ist .

Sie können also so etwas tun (in Python):

def convert_to_utf8(data):
    try:
        data.decode('UTF-8')
        return data  # was already UTF-8
    except UnicodeError:
        return data.decode('ISO-8859-1').encode('UTF-8')

In einem Shell-Skript können Sie iconv verwenden Um die Konvertierung durchzuführen, benötigen Sie jedoch eine Möglichkeit, UTF-8 zu erkennen. Eine Möglichkeit ist die Verwendung von iconv mit UTF-8 als Quell- und Zielkodierung. Wenn die Datei gültiges UTF-8 war, ist die Ausgabe dieselbe wie die Eingabe.


Linux
  1. So konvertieren Sie Dateien in UTF-8-Codierung unter Linux

  2. So verwalten Sie Linux-Dateifunktionen

  3. Wie entferne ich die Bom aus einer UTF-8-Datei?

  4. So sortieren Sie eine Datei an Ort und Stelle

  5. Wie kopiere ich eine Datei transaktional?

So mounten Sie eine ISO-Datei unter Linux

So extrahieren (entpacken) Sie die tar.xz-Datei

So erstellen Sie eine Tar-Gz-Datei

So entpacken (öffnen) Sie die Gz-Datei

So verknüpfen Sie eine Datei unter Linux per Symlink

Wie Echo in Datei