Vim-Mastery: Komische Zeichen
vom 9. September 2009Ein Thema, mit dem sich eigentlich niemand gerne befasst, ist das Thema Encoding und Zeichen die nicht im ASCII-Zeichensatz definiert sind. Vim kann mit jeder Art von Zeichen umgehen und auch Tools wie dos2unix braucht man nicht mehr zu bemühen.
Ich hatte vor kurzem ein ziemlich hässliches Problem. Ich kopierte ein Stück Quellcode aus einer HTML E-Mail und es ließ sich einfach nicht ausführen. Ich zweifelte schon an meinen Tools und am Betriebssystem selbst. Hätte ich die folgenden Kniffe schon vorher gewusst, wäre mir sicher einiges erspart geblieben.
Zuerst einmal sollte man sich die Pflichtlektüre The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets von Joel Spolsky durchlesen, um Zeichensätzen, UTF-8 und den Einsatz dessen zu verstehen.
Öffnet man eine Datei in Vim, sieht man es der Datei zuerst nicht an, in welchem Zeichensatz die Datei ist und auch nicht, in welchem Format sie vorliegt. Das Format (DOS, Unix, Mac) lässt sich mit "set ff?" anzeigen. Den aktuellen Zeichensatz sieht man mit "set fenc?". Will man sich alle Zeichen (auch die Unsichtbaren) anzeigen lassen, setzt man die Option "invlist" (set invlist). Die Unsichtbaren Zeichen werden als $ dargestellt.
Nun weiß man mit was man es zu tun hat. Der nächste Schritt ist jetzt die Umkodierung des Formats oder/und des Zeichensatzes. Zuerst das Format. Dies geht recht einfach, da sich hier nur die Zeilenumbrüche unterscheiden. Linux macht ein \n (LF, Linefeed), während DOS/Windows \r\n (CR LF, Carriage Return, gefolgt von einem Linefeed) an das Ende jeder Zeile hängt. Dateien die von einem Mac kommen, haben wiederum nur ein \r (Carriage Return) am Zeilenende.
Um nun zwischen den Formaten zu wechseln, gibt es die Option "ff", die auf die Werte "unix", "dos" oder "mac" gesetzt werden können. Nach dem Speichern der Datei wird das neue Format verwendet. Selbiges gilt mit der Option "fenc" für das Encoding.
:set ff=unix :set fenc=utf-8
Nun haben wir alle Zeichen sichtbar gemacht und konvertiert, aber wie gibt man nun spezielle Sonderzeichen ein, für die auf einer deutschen Tastatur kein Platz mehr war? Hierzu gibt es für den Insert Mode die Tastenkombination "STRG+k". Will man beispielsweise ein é eingeben, drückt man "STRG+k", dann das "e" und am Ende das Zeichen "'". Zeichen, die aus zwei Characters bestehen wie z.b. die Zeichen aus dem Hiragana Zeichensatz, drückt man "STRG+k", gefolgt von den beiden Buchstaben "zu", um das Zeichen ず zu erhalten.
Notiz auf dem CheatSheet:
- set ff(?), set fenc(?) = Dateiformat/Encoding setzen, (anzeigen)
- set invlist = Unsichtbare Zeichen anzeigen
- STRG+k = Spezialzeichen einfügen
del.icio.us,
Ich hatte vor kurzem ein [ziemlich hässliches Problem][1]. Ich kopierte ein Stück Quellcode aus einer HTML E-Mail und es ließ sich einfach nicht ausführen. Ich zweifelte schon an meinen Tools und am Betriebssystem selbst. Hätte ich die folgenden Knif
Kommentare
Für alle die sich fragen welche Zeichen möglich sind. Das Teil heißt digraph[1]. Mit :digraph gibts ne Auflistung.
Und für die, die sich wundern was :invlist macht und in der Hilfe nix finden:
':set list'
':set nolist' #toggles back to normal mode
':set invlist' #toggles
Die anzeige lässt sich über 'listchars'[2] noch anpassen.
[1]http://www.vim.org/htmldoc/digraph.html
[2]http://www.vim.org/htmldoc/options.html#'listchars'
Ein Erbe aus der 8 Bit Zeit in der sogar bei Text gespart werden musste wo es nur möglich war. Eigentlich sollte man denken dass Alles schön auf UTF-8 oder andere Unicode Standards umgestellt wurde. Sogar bei Software wie den APIs in Java kann man in böse Probleme rennen.
Als ich wählbare Sprachen in meine Webseite eingebaut hatte, gabs massige Probleme mit:
Oracle - Für Unicode/UTF-8 muss die Datenbank komplett neu gemacht werden, konvertieren geht nicht Oo
Java FileInputStream
Ganz böse Ergebnisse bekommt man auch beim Abspeichern von JSPs in UTF-8. Netbeans motzt dann wenigstens dass das nicht vorgesehen ist. Bei Eclipse wirds einfach gespeichert und Tomcat compiliert die JSPs dann falsch beim ausführen und spuckt bei Sonderzeichen Müll aus.
Gute Erfahrungen in dieser Richtung habe ich mit Notepad++ gemacht. Hier konnte es meinen Übersetzern passieren dass der Editor beim speichern die Sonerzeichern zuerschießt (ganz böse im Russischen).
Wenn man einmal in diese probleme gerannt ist gehts :)
Auf jedenfall herrscht hier noch viel Nachholbedarf.