この記号で破損しているファイルがいくつかあるのですが、これはどうすればいいのでしょうか?
^@
これは文字列の一部ではありません。この記号を何もないものに置き換えたり、この記号を削除したりするにはどうすればいいのでしょうか?
ここでは、あるファイルからの一行の例を示します
^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@
67 mrt181 2009-11-25
試してみてはいかがでしょうか
%s/<CTRL-2>//g
(普通のPCで)%s/<CTRL-SHIFT-2>//g
(Mac PCの場合)
ここで、<CTRL-2>
は、通常のPCでは最初にCTRLを押し下げて、押し下げたままにして、2を打って、CTRLを解除することを意味します
で、<CTRL-SHIFT-2>
は、まずMacの場合はcontrolを押したまま、押したまま、shiftを押して、2を押して、controlとshiftを離して、2を押して、controlとshiftを離します
最後に、2つのコマンドのどちらも画面上に%s/^@//g
が表示されるようにします。^@
は1文字(NULLバイト、そうでなければ表示されない)を意味し、^
の後に@
が続くわけではないので、上のコマンドで^
と@
を並べて入力することはできません
このコマンドは、^@
をすべて削除します
60 phresus 2009-11-25
ファイルが破損しているとは思いません。あなたの例の行は、各文字間にヌルバイトを含む通常のテキストを含んでいるように見えます。これは、それがUTF-16でエンコードされたテキストファイルであることを示唆していますが、ファイルの先頭にバイトオーダーマークがないことを示しています。http://en.wikipedia.org/wiki/Byte-order_mark を参照してください
メモ帳を開いて「ファイル名」と入力し、ユニコード・ビッグエンディアンで保存したとします。このファイルの16進ダンプは次のようになります
fe ff 00 66 00 69 00 6c 00 65 00 6e 00 61 00 6d 00 65
このファイルを Vim で開いてみると、問題なく見えます – ‘fe ff’ バイトは、ファイルがどのようにエンコードされているかを Vim に教えてくれます。ここで、全く同じバイト列を含むファイルを作成したとしますが、先頭の ‘fe ff’ がないとします。Vim はヌルバイトの代わりに ^@ (設定によっては <00>) を挿入します
ですから、ヌルを削除するのではなく、Vimがファイルを正しく解釈するようにすることが必要です。Vim に正しいエンコーディングでファイルをリロードさせるには、次のコマンドを実行します
:e ++enc=utf16
51 jrb 2009-11-25
これは実際にvimの中で私のために機能しました
:%s/\%x00//g
40 jriggins 2012-07-16
この「シンボル」は、ASCII 値 000 の NULL 文字を表しています
vimでの削除は難しいです、試してみてください
tr -d '\000' < file1 > file2
13 pavium 2009-11-25
他の人が指摘しているように、これらはヌルバイト(ASCII 00)です。Linuxでは、vimにASCII値を入力する方法は、Ctrl-Vを押した後、任意の文字の3桁の8進数値を入力することです。すべてのヌルバイトを置き換えるには、次のようにします
:%s/
Ctrl-V000//g
(スペースを入れずに)
同様に、ヌルを検索するには、次のようにします
/
Ctrl-V000
どちらの場合も、ゼロを入力している間は表示されませんが、3つ全て入力すると^@
と表示されます。カラー端末では、制御文字であることを示すために青色で表示されます
8 TheAmigo 2014-09-12
FWIW, 私の場合、Macで作成したテキストファイルを編集するためにcygwin上でvimを使用しなければなりませんでした。受け入れられた解決策は、私のためには動作しませんでしたが、近くにありました。Vim wiki page about working with Unicodeによると、BOM バイトのビッグエンディアンとリトルエンディアンの違いがあるそうです。そのため、vim
に明示的にリトルエンディアン版のBOMエンコーディングを使うように指示しなければなりませんでした
正しいエンコーディングを選択して初めて、ファイル形式(行末)をdos
に変換し、Windowsのエディタで編集できるようになりました。エンコーディングを指定する前にファイルフォーマットをリセットしようとすると、私は悲惨な目に遭いました。使用したコマンドの完全なリストは以下の通りです
:e ++enc=utf16le
:w!
:e ++ff=mac
:setlocal ff=dos
:wq
6 rpyzh 2013-10-24
受け入れられた解決策は、私にとってはうまくいきませんでした。代わりにvimにtr
を経由してファイルをパイプさせてみました
:%!tr -d '\000'
これは、ビジュアルモード(:!tr -d '\000'
と入力するだけ)や行の範囲でもうまく機能するでしょう
# Remove nulls from current line:
:.!tr -d '\000'
# Remove nulls from lines 3-5:
:3,5!tr -d '\000'
3 We Are All Monica 2012-07-12
^@
きちんとしたエンコーディングをしていれば悪い文字ではありませんが、削除したい場合は削除してみてください
tr -d '\000'
sed 's/\000//g'
例のデータには^M文字があります
ファイルをUnix/Linux形式に変換してから処理するには、試してみてください
dos2unix filename
– ルエルなど
dos2ux filename [newfilename]
– HP-UX
2 user490343 2015-08-30
jrbさんの回答に加えて、Vimではファイルの文字コードはfileencodingsオプションに基づいて検出されます。(fileencodingsの最後にある’s’に注意)
つまり、Windowsでは、fileencodings
オプションのデフォルト値はucs-bom
になっています
ファイルの先頭にBOMが存在するかどうかをチェックします
BOMが存在する場合は、「BOMからファイルの文字エンコーディングを読み出す」
BOM が存在しない場合 (この場合は fileencodings
オプションで指定したすべての文字エンコーディングが一致しなかったことを意味します)、 encoding
オプションで指定した文字エンコーディングでファイルを読み込みます。encoding
オプションのデフォルトの文字エンコーディングは以下の通りです。latin1
.さて、latin1
は 1 バイト長の文字エンコーディングなので、ファイル内のすべてのバイトは有効な latin1
文字です (あなたが見ている Nul
文字 ^@
も)
*- 実際には、^@
はVimのバッファテキストの改行文字であり、Nul文字ではありません
ファイルの正しい読み方は、文字エンコーディングをUTF-16に手動で指定することです(この場合はUTF-16が適切な文字エンコーディングのようです)
1 colemik 2013-06-10