你說,「ä」無效UTF-8 ...這是不正確的...
看來你對UTF-8的含義並不清楚。 UTF-8是一個系統如何來編碼Unicode Codepoints。有效性問題不在於字符本身,它是如何編碼的問題...
有很多可以編碼的系統Unicode Codepoints; UTF-8是一個,UTF16是另一個... "ä"
在UTF-8系統中是非常合法的。實際上,所有字符都是有效的,只要該字符具有Unicode Codepoint即可。
但是,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"
* 「ASCII,只是不US-ASCII」 *沒有意義。如果``ä``表示爲單個字節,則既不是ASCII(因爲ASCII只能表示128個字符),也不是UTF-8(因爲UTF-8使用2個字節表示``ä``)。它可能是Latin-1(ISO-8859-1)或Windows代碼頁之一,例如Windows-1252。如果文本文件沒有ASCII 128值範圍以外的字符,則它是ASCII *和* UTF-8。 – 2011-12-29 02:54:47