【问题标题】:Determine if a text file without BOM is UTF8 or ASCII确定没有 BOM 的文本文件是 UTF8 还是 ASCII
【发布时间】:2011-06-16 01:06:06
【问题描述】:

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

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

问题是,如果艺术家的名字中有一个“ä”,那么它是 ASCII,而不是 US-ASCII,所以“ä”不是有效的 UTF8 并被跳过。

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

这样的东西会很完美:

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

如果有人知道 Windows 版本?

非常感谢各位前辈!

【问题讨论】:

  • "ASCII,只是不是 US-ASCII" 没有意义。如果'ä'表示为单个字节,则既不是ASCII(因为ASCII只能表示128个字符)也不是UTF-8(因为UTF-8使用2个字节来表示'ä')。它可能是 Latin-1 (ISO-8859-1) 或 Windows 代码页之一,例如 Windows-1252。如果一个文本文件没有超出 ASCII 128 值范围的字符,那么它同时是 ASCII UTF-8。

标签: validation utf-8 ascii extended-ascii


【解决方案1】:

这个程序/来源可能会帮助你:

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

【讨论】:

    【解决方案2】:

    你说,"ä" 不是有效的 UTF-8 ...这不正确...
    看来您对 UTF-8 是什么并没有清楚的了解。 UTF-8 是如何 编码Unicode 代码点 的系统。有效性问题不在于字符本身,而是如何编码的问题...
    有许多系统可以编码 Unicode 代码点; UTF-8 是一个,UTF16 是另一个..."ä" 在 UTF-8 系统中是相当合法的。实际上所有字符都是有效的,只要该字符具有 Unicode 代码点。

    但是,ASCII 只有 128 个有效值,这等同于 Unicode 代码点系统中的前 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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-01
      • 2012-05-31
      • 1970-01-01
      • 2015-12-12
      • 2017-11-04
      • 2012-08-04
      • 1970-01-01
      • 2011-01-30
      相关资源
      最近更新 更多