Ich habe einige Dateien, die mit diesem Symbol beschädigt sind:
^ @
Es ist nicht Teil der Zeichenfolge; es ist nicht durchsuchbar. Wie ersetze ich dieses Symbol durch nichts oder wie lösche ich dieses Symbol?
Hier ist eine Beispielzeile aus einer Datei:
^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@
quelle
Ich glaube nicht, dass Ihre Dateien beschädigt sind. Ihre Beispielzeile sieht so aus, als ob sie normalen Text mit Null-Bytes zwischen den einzelnen Zeichen enthält. Dies deutet darauf hin, dass es sich um eine Textdatei handelt, die in UTF-16 codiert wurde, aber die Markierung für die Bytereihenfolge am Anfang der Datei fehlt. Siehe http://en.wikipedia.org/wiki/Byte-order_mark
Angenommen, ich öffne Notepad, tippe das Wort 'Dateiname' und speichere es als Unicode-Big-Endian. Ein Hex-Dump dieser Datei sieht folgendermaßen aus:
Wenn ich diese Datei in Vim öffne, sieht es gut aus - die 'fe ff' Bytes teilen Vim mit, wie die Datei codiert ist. Nehmen wir nun an, ich erstelle eine Datei, die genau die gleiche Folge von Bytes enthält, jedoch ohne das führende 'fe ff'. Vim fügt ^ @ (oder <00>, abhängig von Ihrer Konfiguration) anstelle der Null-Bytes ein. Notepad fügt Leerzeichen ein.
Anstatt also die Nullen zu entfernen, sollten Sie wirklich versuchen, Vim dazu zu bringen, die Datei richtig zu interpretieren. Sie können Vim veranlassen, die Datei mit der richtigen Codierung mit dem folgenden Befehl neu zu laden:
quelle
Dies funktionierte tatsächlich für mich in vim:
quelle
<Ctrl-V><Ctrl-2>
(wie auch das mit<Ctrl-Shift-2>
) nicht arbeiten, aber das hat funktioniert.Dieses 'Symbol' steht für ein NULL-Zeichen mit dem ASCII-Wert 000.
Es ist schwierig, mit vim zu entfernen, versuchen Sie es
quelle
Wie andere angemerkt haben, sind dies Null-Bytes (ASCII 00). Unter Linux können Sie ASCII-Werte in vim eingeben, indem Sie Strg-V gefolgt vom dreistelligen Oktalwert eines beliebigen Zeichens drücken. Verwenden Sie zum Ersetzen aller Nullbytes Folgendes:
:%s/
Ctrl-V000//g
(ohne Leerzeichen).
Ebenso können Sie nach Nullen suchen mit:
/
Ctrl-V000
In beiden Fällen werden die Nullen bei der Eingabe nicht angezeigt, nach Eingabe aller drei wird sie jedoch angezeigt
^@
. Auf den Farbterminals wird blau angezeigt, um anzuzeigen, dass es sich um ein Steuerzeichen handelt.quelle
FWIW, in meinem Fall musste ich vim auf cygwin verwenden, um eine auf einem Mac erstellte Textdatei zu bearbeiten. Die akzeptierte Lösung hat bei mir nicht funktioniert, war aber nah. Laut der Vim-Wiki-Seite zum Arbeiten mit Unicode gibt es einen Unterschied zwischen der Big-Endian- und der Little-Endian-Version des BOM-Bytes. Daher musste ich ausdrücklich festlegen
vim
, dass eine Little Endian-Version der Stücklistencodierung verwendet werden soll.Erst nach Auswahl der richtigen Codierung habe ich das Dateiformat (Zeilenenden) in konvertiert,
dos
damit ich die Datei im Windows-Editor bearbeiten konnte. Der Versuch, das Dateiformat zurückzusetzen, bevor die Codierung angegeben wurde, machte mir Sorgen. Hier ist die vollständige Liste der Befehle, die ich verwendet habe:quelle
Die akzeptierte Lösung hat bei mir nicht funktioniert.
tr
Stattdessen habe ich vim die Datei durchgeleitet:Dies funktioniert auch im visuellen Modus (nur tippen
:!tr -d '\000'
) oder in einer Reihe von Zeilen:quelle
^@
Kein schlechtes Zeichen, wenn Sie eine ordnungsgemäße Codierung verwenden, aber wenn Sie entfernen möchten, versuchen Sie Folgendes:tr -d '\000'
sed 's/\000//g'
Um Ihre Datei vor der Verarbeitung in das Unix / Linux-Format zu konvertieren, versuchen Sie Folgendes:
dos2unix filename
- Rhel und anderedos2ux filename [newfilename]
- HP-UXquelle
Zusätzlich zur Antwort von @ jrb wird in Vim die Zeichenkodierung der Datei anhand der Option fileencodings ermittelt. (Beachten Sie das 's' am Ende der Dateikodierungen)
Dh unter Windows ist der Standardwert für die
fileencodings
Optionucs-bom
, was bedeutet:Überprüfen Sie, ob am Anfang der Datei eine Stückliste vorhanden ist.
Wenn Stückliste vorhanden ist, lesen Sie die Zeichenkodierung der Datei aus der Stückliste.
Wenn keine Stückliste vorhanden ist (und dies in diesem Fall auch bedeuten würde, dass alle in der
fileencodings
Option angegebenen Zeichenkodierungen nicht übereinstimmen), lesen Sie die Datei mit der in derencoding
Option angegebenen Zeichenkodierung . Die Standard - Zeichencodierung für dieencoding
Option ist:latin1
. Dalatin1
es sich nun um die Zeichencodierung mit einer Länge von einem Byte handelt , sind alle Bytes in der Datei gültigelatin1
Zeichen (auch dasNul
Zeichen^@
, das Sie sehen *).* - ist eigentlich
^@
das Newline-Zeichen im Puffertext des Vim, nicht das Nul-Zeichen.Die richtige Art, die Datei zu lesen, besteht darin, die Zeichencodierung manuell als UTF-16 anzugeben (da UTF-16 in diesem Fall die richtige Zeichencodierung ist).
quelle