wake-up-neo.com

Ändern Sie die Dateicodierung in utf-8 über vim in einem Skript

ich wurde gerade niedergeschlagen, nachdem unser Server von Debian 4 auf 5 aktualisiert wurde. Wir wechselten zur UTF-8-Umgebung und haben jetzt Probleme, den Text korrekt im Browser zu drucken, da alle Dateien in Nicht-UTF8-Kodierungen vorliegen wie iso-8859-1, ascii usw.

Ich habe viele verschiedene Skripte ausprobiert.

Der erste, den ich ausprobiert habe, ist "iconv". Das funktioniert nicht, es ändert den Inhalt, aber die enthaltenen Dateien sind immer noch nicht utf8.

Dasselbe Problem mit enca, encamv, convmv und einigen anderen Tools, die ich über apt-get installiert habe.

Dann fand ich einen Python-Code, der das Chardet Universal Detector-Modul zum Erkennen der Codierung einer Datei verwendet (was gut funktioniert), aber die Unicode-Klasse oder die Codec-Klasse zum Speichern als utf-8 funktioniert nicht ohne Fehler.

Die einzige Möglichkeit, die Datei und ihren Inhalt in UTF-8 zu konvertieren, ist vi.

Dies sind die Schritte, die ich für eine Datei mache:

vi filename.php
:set bomb
:set fileencoding=utf-8
:wq

Das ist es. Das funktioniert perfekt. Aber wie kann ich das über ein Skript zum Laufen bringen? Ich möchte ein Skript schreiben (linux Shell), das ein Verzeichnis durchläuft, in dem alle PHP-Dateien gespeichert sind, und dann mit den oben genannten Befehlen mit Hilfe von vi konvertiert wird starte die vi-app, ich weiß nicht, wie man so etwas macht:

"vi --run-command=':set bomb, :set fileencoding=utf-8' filename.php"

Hoffe, jemand kann mir helfen.

50
NovumCoder

Dies ist der einfachste Weg, den ich kenne, um dies leicht von der Kommandozeile aus zu tun:

vim +"argdo se bomb | se fileencoding=utf-8 | w" $(find . -type f -name *.php)

Oder noch besser, wenn erwartet wird, dass die Anzahl der Dateien ziemlich groß ist:

find . -type f -name *.php | xargs vim +"argdo se bomb | se fileencoding=utf-8 | w"
23
John Weldon

Sie können Ihre Befehle in eine Datei einfügen, nennen wir sie script.vim:

set bomb
set fileencoding=utf-8
wq

Dann rufen Sie Vim mit der Option -S (source) auf, um das Skript in der Datei auszuführen, die Sie reparieren möchten. Um dies für eine Reihe von Dateien zu tun, könnten Sie dies tun

find . -type f -name "*.php" -exec vim -S script.vim {} \;

Sie können die Vim-Befehle auch mit der +-Option in die Befehlszeile stellen, aber ich denke, dass es so lesbarer ist.

Hinweis: Ich habe das nicht getestet.

16
Hans W

Möglicherweise möchten Sie set nobomb(BOM = Byte Order Mark), insbesondere in der Welt [nicht Windows].

ich hatte beispielsweise ein Skript, das nicht funktionierte, da es am Anfang eine Bytereihenfolge gab. Es wird normalerweise nicht in Editoren (auch mit der Setliste in vi) oder auf der Konsole angezeigt, daher ist es schwer zu erkennen.

Die Datei sah so aus

#!/usr/bin/Perl
...

Aber ich versuche es zu laufen

./filename
./filename: line 1: #!/usr/bin/Perl: No such file or directory

Nicht angezeigt, aber am Anfang der Datei befindet sich die 3-Byte-Stückliste. In Bezug auf Linux beginnt die Datei also nicht mit #!

Die Lösung ist

vi filename
:set nobomb
:set fileencoding=utf-8
:wq

Dadurch wird die Stückliste am Anfang der Datei entfernt, sodass utf8 korrekt ist. 

Hinweis: Windows verwendet die Stückliste, um eine Textdatei als utf8 und nicht als ANSI zu identifizieren. Linux (und die offizielle Spezifikation) nicht.

3
Andrew Murphy

Die akzeptierte Antwort hält die letzte Datei in Vim geöffnet. Dieses Problem kann leicht mit der -c-Option von Vim gelöst werden.

vim +"argdo set bomb | set fileencoding=utf-8 | w" -c ":q" file1.txt file2.txt

Wenn Sie nur eine Datei bearbeiten müssen, funktioniert auch Folgendes: 

vim -c ':set bomb' -c ':set fileencoding=utf-8' -c ':wq' file1.txt
0
Libin Wen