你说,“ä”不是有效的 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"