确定没有BOM的文本文件是UTF8还是ASCII

时间:2011-01-26 18:14:26

标签: validation utf-8 ascii extended-ascii

长话短说:
+我正在使用ffmpeg来检查MP3文件的艺术家名称 +如果艺术家的名字中有亚洲字符,则输出为UTF8 +如果它只有ASCII字符,则输出为ASCII。

输出开头不使用任何BOM指示。

问题是如果艺术家在名称中有一个“ä”,它是ASCII,而不是US-ASCII,因此“ä”不是有效的UTF8而是被跳过。

如何判断ffmpeg的输出文本文件是否为UTF8?该应用程序没有任何开关,我只是认为不总是使用UTF8是愚蠢的。 :/

这样的事情会很完美:

http://linux.die.net/man/1/isutf8

如果有人知道Windows版本?

非常感谢前手们!

2 个答案:

答案 0 :(得分:0)

此计划/来源可能对您有所帮助:

  

检测没有BOM(字节顺序掩码)的文本编码,并选择最佳编码...

答案 1 :(得分:0)

你说,“ä”无效UTF-8 ......这不正确......
您似乎并不清楚UTF-8是什么。 UTF-8是如何编码 Unicode代码点的系统。有效性的问题不在于角色本身,而是一个如何被编码的问题...... 有许多系统可以编码 Unicode Codepoints ; UTF-8是一个而UTF16是另一个... "ä"在UTF-8系统中非常合法。实际上所有字符都是有效的,只要该字符具有Unicode代码点。

但是,ASCII只有128个有效值,它们与Unicode Codepoint系统中的前128个字符相同。 Unicode本身就是一个很大的查找表。编码系统的工作是什么;例如。 UTF-8。

因为128个ASCII字符与前128个Unicode字符相同,并且因为UTF-8可以表示这128个值是单字节,就像ASCII一样,这意味着ASCII文件中的数据是与具有相同日期但您称为UTF-8文件的文件相同。简单地说:ASCII是UTF-8的子集......它们与ASCII范围内的数据(即128个字符)无法区分。

您可以检查文件是否符合7位ASCII ..

# If nothing is output to stdout, the file is 7-bit ASCII compliant 
# Output lines containing ERROR chars -- to stdout

  perl -l -ne '/^[\x00-\x7F]*$/ or print' "$1"

以下是对UTF-8合规性的类似检查。

perl -l -ne '/
   ^( ([\x00-\x7F])              # 1-byte pattern
     |([\xC2-\xDF][\x80-\xBF])   # 2-byte pattern
     |((([\xE0][\xA0-\xBF])|([\xED][\x80-\x9F])|([\xE1-\xEC\xEE-\xEF][\x80-\xBF]))([\x80-\xBF])) # 3-byte pattern
     |((([\xF0][\x90-\xBF])|([\xF1-\xF3][\x80-\xBF])|([\xF4][\x80-\x8F]))([\x80-\xBF]{2}))       # 4-byte pattern
    )*$ /x or print' "$1"