2017-03-31 5 views
0

私は下図のようにUTF-8としてエンコードされたテキストファイルf.txtた:Windながらlikegrepコマンドで見つけることができるようしかし、このファイルWindlikeで、この二つの言葉は、diiferentあるテキストファイルのエンコーディングについての混乱と、異なるエンコーディング方法間の変換方法について教えてください。

chengs-MBP:test cheng$ cat f.txt 
Wіnd 
like 
chengs-MBP:test cheng$ FILE -I f.txt 
f.txt: text/plain; charset=utf-8 

chengs-MBP:test cheng$ cat f.txt | grep like 
like 
chengs-MBP:test cheng$ cat f.txt | grep Wind 
chengs-MBP:test cheng$ 

をそして私はiconvコマンドによってus-asciiにこのファイルを変換したいが、私は失敗しました::、それは私を混同することはできません

chengs-MBP:test cheng$ iconv -f UTF-8 -t US-ASCII f.txt > new.txt 
conv: f.txt:1:0: cannot convert 

私の目標は、このファイル内のすべての単語がgrepまたはsedで見つかる可能性のある形式にこのファイルを変換することです。それだけです。

+0

私は 'のiconv -l'、UTF-8およびUS-ASCIIの両方で試験した両方のフォーマットは'のiconv -l' – Arash

+0

@Arashににに記載されていることを確認してリストにしています。この2つの単語をここにコピーすることもできますか?同じ問題があるかどうかを知るためには、「W'nd」、「like」? –

+0

これは私のためにうまくいく: 'printf" Word \ nlike \ n "| iconv -f UTF-8 -t US-ASCII' – Arash

答えて

0

UTF-8は、Unicode文字セットのエンコーディングです。いくつかのUnicode文字は、類似したサブセットにあります。時には集合的に "confusables"と呼ばれます。

f.txt | grep "Wіnd" 

CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN Iを探しますしながら、だから、

f.txt | grep "Wind" 

は、LATIN SMALL LETTER Iを探します。

f.txt | grep "W\xD1\x96nd" 

これはASCII文字セットのメンバーではないため、ASCIIでエンコードすることはできません。

これをさらに使いたい場合は、テキストファイルのエンコードとしてUTF-8を放棄しないでください。ただし、混乱させる文字をBasic Latinに訳すか、または翻字を扱う検索ライブラリを機能として使用することをおすすめします。 。 grepはちょうどあなたが求めるものをあなたに与えます。

0

私の例では、単語 'Wind'に 'i'を使用します。CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN Iは、d196です。あなたが見ることができるように

$ xxd -g 1 f.txt 
00000000: 57 d1 96 6e 64 0a 6c 69 6b 65 0a     W..nd.like. 

$ hexdump -C f.txt 
00000000 57 d1 96 6e 64 0a 6c 69 6b 65 0a     |W..nd.like.| 

、右側に、ASCIIセクションUTFシンボルでドットに置き換え:

シンボル16進数表現を見つけるために、あなたはxxdまたはhexdumpを使用することができます。

Unicode Utitiliesも使用できます。あなたは、ファイル内のシンボルはASCIIではない何かを見つけるの後

$ uniname f.txt 
character byte  UTF-32 encoded as  glyph name 
     0   0 000057 57    W  LATIN CAPITAL LETTER W 
     1   1 000456 D1 96   і  CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 
     2   3 00006E 6E    n  LATIN SMALL LETTER N 
     3   4 000064 64    d  LATIN SMALL LETTER D 
     4   5 00000A 0A      LINE FEED (LF) 
     5   6 00006C 6C    l  LATIN SMALL LETTER L 
     6   7 000069 69    i  LATIN SMALL LETTER I 
     7   8 00006B 6B    k  LATIN SMALL LETTER K 
     8   9 000065 65    e  LATIN SMALL LETTER E 
     9   10 00000A 0A      LINE FEED (LF) 

、あなたはASCII文字にファイルでそれらを置き換えることができます。

$ sed -i 's/\xd1\x96/i/g' f.txt 
関連する問題