2011-01-26 99 views
1

長話短說:
+我正在使用ffmpeg檢查MP3文件的藝術家姓名。
+如果藝術家的名字中包含亞洲字符,則輸出爲UTF8。
+如果只是ASCII字符,則輸出爲ASCII。
確定沒有BOM的文本文件是UTF8還是ASCII

輸出在開始時不使用任何BOM指示。

問題是,如果藝術家的名字是「ä」,那麼它的名字就是ASCII,而不是US-ASCII,因此「ä」不是有效的UTF8並且被跳過。

如何判斷ffmpeg的輸出文本文件是否爲UTF8?該應用程序沒有任何開關,我只是覺得這是愚蠢的不總是與UTF8一起去。 :/

像這樣的事情將是完美的:

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

如果有人的Windows版本誰知道呢?

非常感謝前面的傢伙!

+0

* 「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

回答

0

你說,「ä」無效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" 
相關問題