Vimに奇妙な文字<91>、<92>が表示される


26

SSHでVimを使用しているときに、WebページからSSH / Vimセッションにコンテンツをコピーして、次の結果を得ました。

SIZE=`df -h|grep $DISC|awk <91>{print $2}<92>`

どうやら<91>および<92>静置'しかし、どのように私はこのようなものを検索し、置き換えることができますか?そして、それが何をするか91/ 92意味ですか?これは、どのようにエンコードされている91/ 92ASCIIの平均に\[

回答:


23

ソースWebページのコンテンツが過度に再フォーマットされました。テキストは間違いなく使用(ストレート)単一引用符(ASCIIになっていた39/0x27U+0027)の代わりに(カール単一引用符U+2018U+2019され、0x91 and 0x92; Windowsの一般的な8ビット符号化)も、MS-ANSIおよびWindows-1252としても知られているCP1252に() 。

16進コードは、Vimが使用しているエンコード(おそらくUTF-8)で有効ではないため、Vimに表示されます。すでにファイルに保存されているテキストを編集している場合は、ファイルをCP1252としてリロードできます:e ++enc=cp1252。これにより、中引用符が表示されます。ただし、CP1252としてリロードする本当の理由はありません。単に0x91and 0x92文字を削除し、一重引用符に置き換えてください。


多くの場合、MS Wordからコピーされたコンテンツから中かっこ/アポストロフィを取得します。これにより、「スマートクォート」機能の一部として中かっこ/アポストロフィが自動的に挿入されます。フォントがこれらの文字をサポートしていない場合、文字の代わりに空のスペースを取得します。
lambacck

1
+1:e ++enc=cp1252
wfaulk

@ChrisJohnsen、と同じことを達成するフラグでviを呼び出す方法はあります:e ++enc=cp1252か?私は、コマンドラインからVIにMSワードの文字を含むファイルをしたい場合、かなりのviを開いて、その後でファイルをロードするよりも、1つのステップでそれを行うことができるようにいいだろう:eコマンド
レオ・サイモン

@LeoSimon:vim --cmd 'set fileencodings=cp1252' /path/to/file—コマンドは通常の前に実行され.vimrcfileencodingsオプションを設定します(末尾に注意してくださいs;短い名前を使用することもできますfencs)。Vimはファイルのロード時にCP1252のみを試行します。これは、そのようなファイルの1回限りの編集で機能するはずですが、Vimのそのインスタンスを使用して他のエンコーディングのファイルを編集する場合、問題が生じる可能性があります。
クリスジョンセン

ありがとう!、明確にするために、私は今使っていますvim -c"set fencs" /path/to/file
レオサイモン

27

91および92は、MS Windowsのデフォルトバージョンのlatin1 / ISO-8859-1エンコードのオープンおよびクローズ中アポストロフィ(単一引用符)の16進コードで、具体的にはcp1252 / Windows-1252(cpはコードを表します)ページ)。

これらの文字は、ほとんどの場合、「スマートクォート」機能の一部としてWord文書/ Outlookメールからコンテンツをコピーする人々によって挿入されます。このコードページの他の問題のある文字は、二重引用符で始まる16進数の93/94、箇条書き(•)、およびOEの合字(œおよびŒ)です。cp1252のウィキペダページで、緑色で強調表示された「問題文字」の完全なリスト(同じコードでISO-8859-1またはUTF-8に直接マップされない文字)を確認できます

正しいエンコーディングでファイルを開くだけであれば、:eコマンドに++ enc = cp1252オプションを使用します。

:e ++enc=1252 filename.txt

Vimの特定の不良な16進コードを、代替コマンド(:s)とコード置換のいずれかで置き換えることができます。

\d123   decimal number of character
\o40    octal number of character up to 0377
\x20    hexadecimal number of character up to 0xff
\u20AC  hex. number of multibyte character up to 0xffff
\U1234  hex. number of multibyte character up to 0xffffffff

16進数の91/92文字を変更するには、以下を行う必要があります。

:%s/[\x91\x92]/'/g

ディレクトリ内のすべてのファイルでこれらの文字を置き換えるbashコマンドがあると便利です。クイックグーグル検索でこれを思いつきましたsed -i "s/[\x91\x92]/\'/g" *.txtが、うまくいきませんでした。
バトルビュートス

コマンドラインで機能しているように見えるものを見つけました。これは、現在のフォルダー内のすべての.txtファイルを検索/置換します。しかし、これを使用する前にperlを再検索してください。スイッチが何をするのかわからないからです。perl -p -i -e "s/[\x91\x92]/'/g" *.txt
バトルビュータス

2
sed -i "s/\x92/'/g"私のために働いた。
カロリー・ホーバス

3

iconv開く前にテキストファイルをCP1252からUTF-8に変換するために使用します。

iconv -f cp1252 -t utf8 inputfile.csv > outputfile.csv

Mac OSではこれを使用します。

iconv -f cp1252 -t UTF8-MAC inputfile.csv  > outputfile.csv

-3

実際には、16進91および92を表しています。Windowsコードページでは、中括弧で一重引用符を開始および終了しています( 'および'-Alt-0145およびAlt-0146)。

次の検索/置換を試してください。

:s%/\<9[12]\>/'/g

1
私はポイントの不足のために投票できませんが、この置換コマンドはとても間違っているので、どこから始めるべきかわかりません:(
lambacck

1
これは私には機能しません:stackoverflow.com/questions/2798398/…は、機能するソリューションを提供します。
混乱

@lambacck:ファイルにリテラル文字列「91」と「92」が含まれていると仮定していました。その場合、このコマンドは正しいです。これらが16進文字である場合、あなたは正しいです、あなたはあなたの置換コマンドまたは同様のものが必要でしょう。
アレックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.