2017-03-31 56 views
0

我已经如下所示,其编码为UTF-8的文本文件f.txt关于文本文件编码和如何在不同编码方法之间转换的混淆?

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 

然而,这两个词在此文件Windlike是diiferent,作为like可以通过grep命令来发现而Wind不能,这让我感到困惑:

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 

我的目标是将这个文件转换为一个格式,这个文件中的所有单词可以通过grepsed找到......就这些了。

+0

确保这两种格式都在我'的iconv -l'测试'的iconv -l' – Arash

+0

@Arash上市,无论是UTF-8和US-ASCII是在列表中。你甚至可以在这里复制这两个词:'W'nd','''看看你是否有同样的问题? –

+0

这适用于我:'printf'Word \ nlike \ n“| iconv -f UTF-8 -t US-ASCII“ – Arash

回答

0

UTF-8是Unicode字符集的编码。一些Unicode字符看起来很像子集,有时统称为“confusables”。所以,

f.txt | grep "Wind" 

会寻找LATIN SMALL LETTER I,而

f.txt | grep "Wіnd" 

将寻找CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I。您可以将它写为

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

由于不是ASCII字符集的成员,因此无法使用ASCII编码。

如果您想更进一步,我建议您不要放弃UTF-8作为文本文件编码,但您可能需要将易混淆的字母音译为Basic Latin,或者使用将音译转换为功能的搜索库。 grep只是给你你所要求的。

0

在我的示例中,我将在'Wind'中使用'i',其格式为CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I,格式为d196

为了找出符号十六进制表示可以使用xxdhexdump

$ 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符号替换点。您可以使用Unicode Utitilies

$ 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码之后,您可以将它们替换为ASCII等效文件。

$ sed -i 's/\xd1\x96/i/g' f.txt