翻譯自Mozilla的網(wǎng)站。
這篇論文討論了組合三種不同的檢測方法來(lái)實(shí)現自動(dòng)字符集檢測。
A composite approach to language/encoding detection)
Shanjian Li (shanjian@netscape.com)
Katsuhiko Momoi (momoi@netscape.com)
Netscape Communications Corp.
[ 注:這篇論文最初發(fā)表在19屆國際Unicode會(huì )議(19th International Unicode Conference)(San Jose)。那以后,我們的實(shí)現經(jīng)受住了時(shí)間和實(shí)際應用的檢驗,并且,我們還作了許多改進(jìn)。一個(gè)主要的變化是我們現在使用正序列來(lái)檢測單字節字符集,參見(jiàn)4.7和4.7.1節。這篇論文寫(xiě)于通用字符集檢測代碼集成到Moailla主代碼前(參見(jiàn)第8節)。自此以后,字符集檢測代碼被合并到了代碼樹(shù)中。如想查看最新的實(shí)現,請在Mozilla的代碼樹(shù)中查看相應代碼。作者 - 2002年11月25日。]
這篇論文提供三種自動(dòng)檢測的方法來(lái)判定無(wú)明顯字符集聲明的文檔的編碼。我們將分別討論每種方法的優(yōu)點(diǎn)和缺點(diǎn),并且提供了一種復合后的,更有效的方法來(lái)檢測編碼,這樣,三種檢測方法就可以互為補充。我們認為自動(dòng)檢測在使瀏覽器用戶(hù)避免經(jīng)常使用編碼菜單手動(dòng)選擇編碼上很有用,同時(shí)在編碼菜單很少出現的情況下,提供了更合理的處理方式。我們假設,文檔轉化到Unicode對用戶(hù)是透明的。無(wú)論字符編碼采用的是某種Unicode編碼還是本地編碼,用戶(hù)僅需知道字符最終顯示是正確的就行。好的自動(dòng)編碼檢測能有效的幫助用戶(hù)處理大部分的編碼事項,而無(wú)需用戶(hù)手動(dòng)參與。
自從進(jìn)入計算機時(shí)代以來(lái),人們創(chuàng )造了許多使用計算機數據表示的編碼方案來(lái)表達不同的文字/字符集。隨著(zhù)全球化和Internet的發(fā)展,跨語(yǔ)言和區域的信息交換越來(lái)越重要。但是現存的多種編碼方案對此是一個(gè)屏障。Unicode提供了通用的編碼解決方案,但是,迄今為止,各種各樣的因素使它并沒(méi)有代替現存的區域編碼方案。除了W3C和IETF建議使用UTF-8作為缺省編碼,比如XML,XHTML,RDF。因此,現今的國際化軟件不僅要處理Unicode編碼,還要處理其它多種不同的編碼方式。
我們當前的工作是在開(kāi)發(fā)Internet瀏覽器的環(huán)境中開(kāi)展的。為了處理如今Web上使用不同編碼的各種語(yǔ)言,我們做了許多努力。為了獲取正確的顯示結果,瀏覽器需要利用HTTP服務(wù)器返回的編碼信息,網(wǎng)頁(yè)或者是最終用戶(hù)通過(guò)選擇編碼菜單而得到的編碼方式。此外,大部分用戶(hù)沒(méi)有能力手動(dòng)的通過(guò)編碼菜單來(lái)進(jìn)行操作。如果沒(méi)有編碼信息的話(huà),網(wǎng)頁(yè)有時(shí)就會(huì )顯示為“垃圾”字符,用戶(hù)就無(wú)法得到他們想要的信息。這最終會(huì )導致用戶(hù)認為他們的瀏覽器有故障或有Bug。
由于越來(lái)越多的Internet標準協(xié)議指定Unicode作為缺省的編碼方式,網(wǎng)頁(yè)將會(huì )不容置疑的轉向使用Unicode來(lái)編碼。好的通用自動(dòng)檢測方法可以對這種轉向提供重要的貢獻,因為它們工作很自然,無(wú)需用戶(hù)使用編碼菜單。在這種情況下,漸進(jìn)的轉向將會(huì )以用戶(hù)不易察覺(jué)的方式進(jìn)行,這是由于,對用戶(hù)來(lái)說(shuō),網(wǎng)頁(yè)總會(huì )顯示正確,他們無(wú)需考慮使用編碼菜單。這種平滑的轉變將使編碼對用戶(hù)來(lái)說(shuō)越來(lái)越不需要關(guān)注。自動(dòng)檢測在這種場(chǎng)景中將很關(guān)鍵。
讓我們從通用的模式開(kāi)始。對大多數的應用,下面的示例將代表一個(gè)自動(dòng)檢測使用的通用框架:
輸入數據 -> 自動(dòng)檢測器 -> 返回結果
應用/程序接受自動(dòng)檢測器返回的結果,并且將信息使用在不同用途上,比如,設置數據的編碼,顯示原始創(chuàng )建者的數據,將它傳給其他的程序,等等。
這篇論文中所討論的自動(dòng)檢測方法使用Internet瀏覽器作為應用環(huán)境,其他的應用也可以很容易的將其移植。
3.2. 瀏覽器和自動(dòng)檢測
瀏覽器可以使用某種檢測算法來(lái)自動(dòng)檢測網(wǎng)頁(yè)的編碼方式。一個(gè)程序可以潛在的在假定不同編碼的前提下,對一段文本做出隨意的解釋?zhuān)?,除了一些極端罕見(jiàn)的情況外,只有一種解釋才是網(wǎng)頁(yè)作者想要得。這就是為什么通常對用戶(hù)來(lái)說(shuō),只有指定的語(yǔ)言才能正確合理的顯示網(wǎng)頁(yè)。
為了列出設計自動(dòng)檢測算法中的主要因素,我門(mén)對輸入文本和步驟作如下假定,以網(wǎng)頁(yè)數據作例,
對自動(dòng)檢測來(lái)說(shuō),要包含所有已知語(yǔ)言和編碼方式幾乎是一項無(wú)法完成的任務(wù)。在現今的方法中,我們試圖包含所有東亞語(yǔ)言中常用的編碼,同時(shí),對單字符檢測也提供了一種通用模式。俄語(yǔ)編碼被選擇作為后一種檢測方法實(shí)現的例子,同時(shí)也作為單字符檢測測試的基礎。
4.1介紹
在這一節中,我們討論三種不同的檢測文本數據編碼的方法,它們是1)編碼模式方法(Coding scheme method,2)字符分布(Character Distribute),和3)雙字符序列分布(2-Char Sequence Distribute)。每種方法單獨使用的時(shí)候,都有它的長(cháng)處和不足,如果我們以互補的方式使用所有3種方法的話(huà),結果將是非常理想的。
4.2編碼模式方法
這種方法在檢測多字節編碼的時(shí)候也許是最顯而易見(jiàn)的方法,也是通常最容易使用的方法。在任何多字節編碼模式中,并不是所有可能的代碼點(diǎn)都被使用的。如果在驗證特定編碼的時(shí)候,碰到一個(gè)非法字節或非法字節序列(如,無(wú)用的代碼點(diǎn)),我們可以立即判斷出這種編碼猜測不是正確的。一小部分的代碼點(diǎn)同樣也能代表特定的編碼方式,這樣,我們也能利用這種事實(shí)立即做出正確的判斷。Frank Tang(Netscape Communications)開(kāi)發(fā)了一個(gè)非常有效的,基于編碼模式的,通過(guò)使用并行狀態(tài)機(parallel state machine)來(lái)檢測字符集的算法。他的基本思想是:
對每一個(gè)編碼模式,都有一個(gè)相應的狀態(tài)機被用來(lái)驗證這種特定編碼的字節序列。對檢測器收到的每一個(gè)字節,它將會(huì )被輸入到每一個(gè)可用的,活動(dòng)的狀態(tài)機中,每次一個(gè)字節。狀態(tài)機基于前一個(gè)狀態(tài)和它所收到的字節來(lái)改變它的狀態(tài)。自動(dòng)檢測器對狀態(tài)機的三種狀態(tài)感興趣:
我們當前工作中使用的PSM(Parallel State Machine)版本是Frank Tang原先工作改造后的版本。只要一個(gè)狀態(tài)機達到START狀態(tài),就意味著(zhù)它成功檢測了一個(gè)合法的字符序列,我們向狀態(tài)機查詢(xún)這種字符序列中總共有多少個(gè)字節。這個(gè)信息會(huì )用在2個(gè)方面:
無(wú)論哪種語(yǔ)言,總有一些字符比其它字符更常用。利用這個(gè)事實(shí),我們可以對每種語(yǔ)言建立起相應的數據模式。對那些字符數較多的語(yǔ)言,比如漢語(yǔ),日語(yǔ)和韓語(yǔ),尤其有用。我們經(jīng)常聽(tīng)到與此有關(guān)的分布統計,但是我們沒(méi)有找到太多的公布結果。因此,為了繼續討論,我們依賴(lài)自己搜集的數據。
4.3.1.簡(jiǎn)體中文:
我們對采用GB2312編碼的6763個(gè)字符研究的結果,顯示出如下的分布結果:
| Number of Most Frequent Characters | Accumulated Percentage |
| 10 | 0.11723 |
| 64 | 0.31983 |
| 128 | 0.45298 |
| 256 | 0.61872 |
| 512 | 0.79135 |
| 1024 | 0.92260 |
| 2048 | 0.98505 |
| 4096 | 0.99929 |
| 6763 | 1.00000 |
對于采用Big5編碼的繁體中文,臺灣普通話(huà)推廣委員會(huì )(Taiwan‘s Mandarin Promotion Council)年度研究顯示了類(lèi)似的結果。
| Number of Most Frequent Characters | Accumulated Percentage |
| 10 | 0.11713 |
| 64 | 0.29612 |
| 128 | 0.42261 |
| 256 | 0.57851 |
| 512 | 0.74851 |
| 1024 | 0.89384 |
| 2048 | 0.97583 |
| 4096 | 0.99910 |
Table 2. Traditional Chinese Character Distribution Table
對日語(yǔ),我們采用自己搜集的數據,并寫(xiě)了一個(gè)實(shí)用程序來(lái)分析它們。下面的表格顯示了結果:
| Number of Most Frequent Characters | Accumulated Percentage |
| 10 | 0.27098 |
| 64 | 0.66722 |
| 128 | 0.77094 |
| 256 | 0.85710 |
| 512 | 0.92635 |
| 1024 | 0.97130 |
| 2048 | 0.99431 |
| 4096 | 0.99981 |
| 1.00000 |
Table 3. Japanese Character Distribution Table
同樣,對于韓語(yǔ),我們采用自己從Internet上搜集的數據,并用我們自己的實(shí)用程序分析它們,結果如下:
| Number of Most Frequent Characters | Accumulated Percentage |
| 10 | 0.25620 |
| 64 | 0.64293 |
| 128 | 0.79290 |
| 256 | 0.92329 |
| 512 | 0.98653 |
| 1024 | 0.99944 |
| 2048 | 0.99999 |
| 4096 | 0.99999 |
Table 4. Korean Character Distribution Table
4.4.分布結果的通用特性:
對所有4種語(yǔ)言,我們發(fā)現在我們定義的應用范圍內,很少一部分的編碼點(diǎn)占據了較大的百分比。此外,對這些代碼點(diǎn)的更進(jìn)一步的考察顯示它們散布在一個(gè)很廣的編碼范圍中。這給了我們克服在編碼模式分析中遇到的通用問(wèn)題的一種途徑,如,不同國家的編碼有可能共享一些相互重疊的代碼點(diǎn)。由于這些語(yǔ)言中最常出現的字符集具有我們上面描述的特性,因此,在編碼模式方法中不同編碼有相互重疊的問(wèn)題,將在分布方法中變得無(wú)關(guān)緊要了。
4.5.分析算法
為了驗證某個(gè)語(yǔ)言基于字符出現頻率/分布的統計特性,我們需要一個(gè)從文本輸入流中計算出一個(gè)數值的算法。這個(gè)數值將表明文本是某種字符集編碼的可能性。一個(gè)很直觀(guān)的做法是用每個(gè)字符的出現頻率權重來(lái)計算這個(gè)值。不過(guò),從我們對不同字符編碼的經(jīng)驗上,我們發(fā)現這種做法并不是必須的,而且它占用了太多CPU處理能力和過(guò)多的內存。一個(gè)簡(jiǎn)單的版本同樣提供了很令人滿(mǎn)意的結果,并且使用非常少的資源,同時(shí)運行得很快。
在我們當前的方法中,一個(gè)給定編碼中的所有字符會(huì )被分到兩個(gè)類(lèi)別中,“經(jīng)常使用的”和“非經(jīng)常使用的”。如果一個(gè)字符是出現在出現頻率分布表中的前512個(gè)字符中,它會(huì )被分類(lèi)到“經(jīng)常使用”。之所以選擇512,是由于它在所有4種語(yǔ)言的輸入文本中都覆蓋了很大一部分的百分比,同時(shí)僅占據一小部分的代碼點(diǎn)。在輸入文本中,我們以批處理的方式統計每個(gè)類(lèi)別中字符的數量,然后計算一個(gè)我們稱(chēng)之為分布率(Distribuion Ratio)的浮點(diǎn)值。
分布率的定義如下
分布率 = 出現在512個(gè)最常用的的字符中的字符數量 / 出現在剩下的字符中的字符數量
每一種檢測過(guò)的多字節編碼方法都顯示了獨特的分布率。從分布率起,我們就可以對原始輸入的文本對一個(gè)給定的編碼方法來(lái)計算可信度。下面對每一種編碼方法的討論將會(huì )對這個(gè)問(wèn)題說(shuō)得更清楚一些。
4.6分布率和可信度(Confidence Level):
讓我們分別通過(guò)4種語(yǔ)言的數據來(lái)查看分布率的不同。注意,術(shù)語(yǔ)分布率代表兩個(gè)意思?!袄硐搿钡姆植悸适菍φZ(yǔ)言/字符集的定義而不是對編碼的定義。如果某種語(yǔ)言/字符集表現為多種編碼方式,那么,對每一種編碼,我們通過(guò)將輸入數據分類(lèi)為“經(jīng)常使用的”或“非經(jīng)常使用的”來(lái)計算“實(shí)際上的”分布率。然后將這個(gè)值和理想的語(yǔ)言/字符集分布率進(jìn)行比較?;趯?shí)際上獲得的分布率,我們可以計算輸入數據對每一種字符集的可信度,描述如下。
4.6.1.簡(jiǎn)體中文(GB2312)
GB2312包含兩級中文字符。1級包含3755個(gè)字符,2級包含3008個(gè)字符。1級字符比2級字符常用,同時(shí),不難得出512個(gè)最常用字符都包含在GB2312中的1級字符中。由于1級字符使用發(fā)音來(lái)排序,因此,512個(gè)最常用字符幾乎完全分散在3755個(gè)代碼點(diǎn)中。盡管這些字符占據1級字符所有代碼點(diǎn)中的13.64%,但是在典型的中文文本中,它卻有79.135%的出現機會(huì )。在理想的狀況下,一段包含足夠多字符的中文文本會(huì )返回給我們如下的結果:
分布率 = 0.79135/(1-0.79135) = 3.79
并且,對使用同樣編碼方案隨機生成的文本來(lái)說(shuō),不考慮2級字符的話(huà),比率大致為512/(3755-512) = 0.157。
如果我們將2級字符考慮進(jìn)去的話(huà),我們假定1級字符中每個(gè)字符出現的概率為p1,2級的為p2,計算公式將是:
512*p1/(3755*p1 + 3008*p2 – 512*p1) = 512/(3755 + 3008*p2/p1-512)
很明顯,這個(gè)值將更小。在后面的分析中,我們僅使用最壞的情況作為比較。
4.6.2.Big 5:
Big5和EUC-TW(如,CNS字符集)編碼具有類(lèi)似的情況。Big5同樣將中文字符編碼成2級。最常用的512個(gè)字符均勻的分布在5401個(gè)1級字符中。從Big5編碼文本中得到的理想分布率是
分布率 = 0.74851/(1-0.74851) = 2.98
并且,對隨即生成的文本,分布率為
512/(5401-512) = 0.105
由于Big5的1級字符基本上等同于CNS字符集的1級字符,所以對EUC-TW來(lái)說(shuō),可以適用同樣的分析。
4.6.3.日語(yǔ)Shift_JIS和EUC-JP:
對日語(yǔ)來(lái)說(shuō),平假名和片假名比日文漢字常用。由于Shift-JIS和EUC-JP將平假名和片假名編碼在不同的編碼區域,我們仍然可以使用這種方法將這兩種編碼區分開(kāi)。
那些在512個(gè)最常用的的字符中出現的的日文漢字字符仍然分布在2965個(gè)1級JIS日文漢字集中。同樣的分析得出如下的分布率:
分布率 = 0.92635/(1-0.92635) = 12.58
對隨即生成的日文文本數據,分布率最少為
512/(2965+63+83+86-512) = 0.191
上面的計算中包含 Hankaku 片假名(63個(gè)),平假名(83個(gè)),和片假名(86個(gè))。
4.6.4.韓語(yǔ) EUC-KR:
在EUC-KR編碼中,實(shí)際使用在典型韓語(yǔ)文本中的中文字符可以忽略不計。使用這種編碼的2350個(gè)韓語(yǔ)字符按照發(fā)音排列。在我們分析了很大數量的韓語(yǔ)文本數據后得出的頻率表中,最常用的字符均勻的分布在2350個(gè)代碼點(diǎn)中。用同樣的分析,在理想的情況下,我們得到
分布率 = 0.98653/(1-0.98653) = 73.24
對隨機生成的韓語(yǔ)文本,分布率為
512/(2350-512) = 0.279
4.6.5.計算可信度
從前面對每一種語(yǔ)言的討論,我們可以以如下的形式定義出每一種數據集的可信度
Confidence Detecting(InputText)
{
for each multi-byte character in InputText
{
TotalCharacterCount++;
if the character is among 512 most frequent ones
FrequentCharacterCount++;
}
Ratio = FrequentCharacterCount
/ (TotalCharacterCount-FreqentCharacterCount);
Confidence = Ratio / CHARSET_RATIO;
Return Confidence;
}
對每一種數據集的可信度定義為輸入數據的分布率除以從上面分析得出的理想分布率。
4.7.雙字符序列分布方法
對僅使用很少一部分字符的語(yǔ)言來(lái)說(shuō),我們需要比統計單字符出現率更進(jìn)一步。字符組合揭示了更多的語(yǔ)言-字符特性。我們定義雙字符序列為在輸入文本中接連出現的2個(gè)字符,在這種情況中,順序是非常重要的。由于在一種語(yǔ)言中,并不是所有字符都具有相同的出現率,雙字符序列分布非常傾向于與語(yǔ)言/編碼相關(guān)。這種特性可以用在語(yǔ)言檢測上。在檢測字符編碼的時(shí)候,這會(huì )導致更好的可信度,在檢測單字節編碼上很有用處。
用俄語(yǔ)舉例來(lái)說(shuō)。我們下載了20MB的俄語(yǔ)純文本,并且編寫(xiě)了一個(gè)程序來(lái)分析文本。這個(gè)程序發(fā)現了總共為21199528個(gè)雙字符序列。在我們發(fā)現的序列中,有一些是和我們的考察無(wú)關(guān)的,比如空格-空格組合。這些序列被認為是噪音序列,并且,它們的出現沒(méi)有被包含在分析中。在我們用來(lái)檢測俄語(yǔ)的數據中,去處這些噪音數據,剩下20134122個(gè)雙字符序列??偣舱紦覀儚臄祿兴l(fā)現序列的95%。用來(lái)建立我們語(yǔ)言模式的序列可以被分為4096個(gè)不同的序列,并且,其中的1961個(gè)序列在我們的20134122個(gè)樣本中出現次數少于3次。我們稱(chēng)這些序列為這種語(yǔ)言的負序列集。
4.7.1.可信度檢測算法
對單字節語(yǔ)言,我定義如下的可信度:
Confidence Detecting(InputText)
{
for each character in InputText
{
If character is not a symbol or punctuation character
TotalCharacters++;
Find its frequency order in frequency table;
If (Frequency order < SampleSize)
{
FrequentCharCount++;
If we do not have lastChar
{
lastChar = thisChar;
continue;
}
if both lastChar and thisChar are within our sample range
{
TotalSequence++;
If Sequence(lastChar, thisChar) belongs to NegativeSequenceSet
NetgativeSequenceCount++;
}
}
}
Confidence = (TotalSequence – NegativeSequenceCount)/TotalSequence
* FrequentCharCount / TotalCharacters;
return Confidence;
}
在這個(gè)算法中,需要對如下事情解釋一下。
首先,序列分析沒(méi)有對所有的字符都進(jìn)行。我們當然可以通過(guò)建立一個(gè)256 x 256的矩陣來(lái)包含所有的那些字符序列,但是,其中的許多對語(yǔ)言/編碼分析來(lái)說(shuō)是無(wú)關(guān)的。由于絕大多數的單字節語(yǔ)言?xún)H使用數量不多于64個(gè)的字母,而最常使用的64個(gè)字符幾乎包含了所有語(yǔ)言中都有的字符。因此,矩陣可以縮減成為更小的64 x 64。所以我們使用64作為我們工作中的采樣大小。我們選擇用來(lái)建立我們模式
的64個(gè)字符,是基于頻率統計并作了相應調整后的。一些字符,比如0x0d和0x0a,在我們的觀(guān)點(diǎn)中,和空格(0x20)很相似,所以,從我們的樣本中移除了。
其次,對所有被64 x 64矩陣模式包含的序列,許多序列同樣對用來(lái)檢測語(yǔ)言/編碼來(lái)說(shuō)是無(wú)關(guān)的。幾乎所有的單字節語(yǔ)言編碼都包含ASCII子集,在其它的語(yǔ)言數據中,英語(yǔ)單詞也會(huì )比較常見(jiàn),尤其在網(wǎng)頁(yè)中??崭?空格序列對任何的語(yǔ)言編碼來(lái)說(shuō),明顯是無(wú)關(guān)的。所有這些,在我們的檢測中都被認為是噪音數據,并且通過(guò)過(guò)濾被移除了。
最后,在計算可信度上,我們同樣需要統計出現在和不出現在我們采樣范圍內的字符數。如果一個(gè)小采樣數據中的大部分字符都出現在我們的采樣范圍內的話(huà),由于在這種情況下,負序列很少出現,因此序列分布本身將會(huì )返回一個(gè)較高的值。通過(guò)過(guò)濾,如果文本使用的是希望的編碼的話(huà),大部分提供給檢測器的字符將會(huì )落在采樣范圍內。因此,通過(guò)統計負序列獲得的可信度需要用這個(gè)數值調整一下。
對前面敘述的總結如下:
5.三種方法比較:
5.1.編碼模式:
對許多單字節編碼來(lái)說(shuō),所有使用到的代碼點(diǎn)都是均勻分布的。甚至對那些包含一些無(wú)用代碼點(diǎn)的編碼方式來(lái)說(shuō),這些無(wú)用的代碼點(diǎn)在其它的編碼方式中很少被使用,因此,不適合用于編碼檢測。
對其它多字節編碼方式,本方法能得到一個(gè)很好的結果,并且很有效。事實(shí)上,由于一些編碼方法,比如EUC-CN和EUC-KR幾乎有完全類(lèi)似的代碼點(diǎn),使用本方法很難區分將它們區分出來(lái)??紤]到瀏覽器通常不會(huì )包含大量文本的事實(shí),我們必須使用其它的方法來(lái)檢測編碼。
對7bit的編碼方式,如ISO-2022-xx和HZ來(lái)說(shuō),由于它們使用了容易識別的轉義序列或變換序列,本方法可以得出一個(gè)滿(mǎn)意的結果。對編碼模式方法概括如下,
5.2.字符分布:
對多字節編碼,尤其是那些編碼模式方法不能有效處理的多字節編碼來(lái)說(shuō),字符分布方法提供了很大的幫助,同時(shí)避免了對復雜上下文進(jìn)行深入分析的麻煩。對單字節編碼,由于輸入的數據量通常很少,而且,由于有太多可能的編碼方式,除非在特定的情況下,本模式不大可能取得理想的結果。由于雙字符序列分布方法對這種情況能獲得很好的檢測結果,因此,我們沒(méi)有在單字節編碼檢測中過(guò)多考慮使用本方法。對字符分布方法總結如下
5.3.雙字符序列分布:
在雙字符序列分布中,我們可以使用更多的數據信息來(lái)檢測語(yǔ)言/編碼。甚至在只有很少數據樣本的情況下,也能得到好的結果。但是由于使用序列代替了單詞(通過(guò)空格分隔),在處理多字節語(yǔ)言的時(shí)候,矩陣將會(huì )變得很大。因此,本方法:
6.復合方法:
6.1.組合三種方法:
在我們的字符集自動(dòng)檢測器所處理的語(yǔ)言/編碼中,既有單字節編碼,又有多字節編碼?;谏厦嫒N方法的定義,單獨使用其中的任一種都無(wú)法產(chǎn)生滿(mǎn)意的結果。因此我們建議使用復合的方法來(lái)處理所有這些編碼。
雙字符序列分布方法可用來(lái)檢測所有的單字節編碼。
編碼模式方法可以用在UTF-8,ISO-2022-xx和HZ檢測上。在UTF-8檢測中,對現有的狀態(tài)機作了一點(diǎn)修改。UTF-8檢測器的成功檢測是在對多個(gè)多字節序列驗證之后作出的。(詳見(jiàn) Martin Duerst‘s(1977))。編碼模式方法和字符分布方法一起作用在了對主要東亞字符編碼進(jìn)行檢測上,例如GB2312,Big5,EUC-TW,EUC-KR,Shift_JIS和EUC-JP。
對日語(yǔ)編碼,如Shift_JIS和EUC-JP,雙字符序列分布方法同樣也能用于檢測,這是由于它們包含許多具有明顯特征的平假名字符,這些平假名字符和單字節語(yǔ)言中的字母很相似。雙字符序列分布方法在很少文本的情況下也能得到精確的結果。
我們試驗了兩種方法,一種帶有雙字符分布方法,另一種不使用。它們都取得了滿(mǎn)意的結果。有一些網(wǎng)站包含許多漢字和片假名字符,但是僅有一些平假名字符。為了盡可能獲得最好的結果,我們在日語(yǔ)編碼檢測上既使用了字符分布方法,又使用了雙字符分布方法。
這里有一個(gè)這三種檢測方法結合在一起使用的例子。最上層的控制模塊(對自動(dòng)檢測來(lái)說(shuō))算法如下:
Charset AutoDetection (InputText)
{
if (all characters in InputText are ASCII)
{
if InputText contains ESC or “~{“
{
call ISO-2022 and HZ detector with InputText;
if one of them succeed, return that charset, otherwise return ASCII;
}
else
return ASCII;
}
else if (InputText start with BOM)
{
return UCS2;
}
else
{
Call all multi-byte detectors and single-byte detectors;
Return the one with best confidence;
}
}
對以上代碼片斷序列的概括如下,
很大一部分網(wǎng)站仍使用ASCII編碼。上層的控制算法從ASCII驗證開(kāi)始。如果所有字符都是ASCII的,除了ISO-2022-xx和HZ編碼外,其它檢測器就無(wú)需使用了。
ISO-2022-xx和HZ檢測器在遇到ESC或"~{"時(shí)會(huì )被載入,并且,在遇到8bit字節的時(shí)候,它們會(huì )被立即拋棄。
在驗證UCS2編碼的時(shí)候,會(huì )搜索BOM是否出現。我們發(fā)現有些網(wǎng)站在http流中發(fā)送0x00,但是,使用這個(gè)字節來(lái)驗證UCS2編碼被證明是不可信的。
如果任一處于激活狀態(tài)的檢測器接收到足夠的數據并且達到了很高的可信度,整個(gè)自動(dòng)檢測過(guò)程將被終止,同時(shí)字符編碼會(huì )作為結果返回。我們稱(chēng)之為快捷模式。
6.2.測試結果:
作為本文中極力推薦方法的測試,我們將我們的檢測器應用在了100個(gè)流行的,但是沒(méi)有基于文檔或服務(wù)器發(fā)送HTTP字符集信息的國際網(wǎng)站。對包含在我們檢測器中的全部編碼方式來(lái)說(shuō),我們可以或得100%的準確率。
例如,當我們訪(fǎng)問(wèn)一個(gè)沒(méi)有提供字符集信息的網(wǎng)站(例如,在http://www.yahoo.co.jp上的網(wǎng)站的服務(wù)器沒(méi)有發(fā)送字符信息前),我們的的字符檢測器生成如下的輸出:
[UTF8] is inactive
[SJIS] is inactive
[EUCJP] detector has confidence 0.950000
[GB2312] detector has confidence 0.150852
[EUCKR] is inactive
[Big5] detector has confidence 0.129412
[EUCTW] is inactive
[Windows-1251 ] detector has confidence 0.010000
[KOI8-R] detector has confidence 0.010000
[ISO-8859-5] detector has confidence 0.010000
[x-mac-cyrillic] detector has confidence 0.010000
[IBM866] detector has confidence 0.010000
[IBM855] detector has confidence 0.010000
因此,EUC-JP編碼對這個(gè)站點(diǎn)來(lái)說(shuō)是最可能的編碼方式。
7.結論:
在我們的環(huán)境中,利用編碼模式,字符分布和雙字符序列分布的復合方法來(lái)檢測語(yǔ)言/編碼被證明是非常有效的。我們覆蓋了Unicode編碼,多字節和單字節編碼方式。在我們當前的Internet數字文本中,這些編碼方式是很有代表性的。我們有理由相信,通過(guò)擴展,這種方法可以覆蓋沒(méi)有包括在這篇論文中的,余下的編碼方式。
盡管在當前,在我們的檢測中,只有編碼信息才是我們所需要的,在大多數的情況下,語(yǔ)言信息同樣也能被識別出。事實(shí)上,字符分布和雙字符分布方法都依賴(lài)于不同語(yǔ)言字符集的分布模式。只有在UTF16和UTF8的情況下,編碼方式能被識別出,而語(yǔ)言信息仍是未知的。即使是在這種情況下,我們的工作也可通過(guò)將來(lái)的被擴展以覆蓋語(yǔ)言信息的檢測。
這里列出的三種檢測方法在Netscape 6.1 PR1中已被實(shí)現了,并且作為后繼版本中的"Detect All"選項。我們希望我們在自動(dòng)檢測上的工作可以使用戶(hù)從麻煩的對字符編碼菜單操作中解脫出來(lái)。字符編碼菜單(或者其他形式的編碼菜單)與其它的Internet客戶(hù)端的界面元素不同,它們對一般的用戶(hù)暴露了部分國際化的信息。它的存在折射出了當前的網(wǎng)頁(yè)加入語(yǔ)言/編碼方式后是多么的凌亂。
我們希望通過(guò)提供缺省的好的編碼和通用自動(dòng)檢測能幫助用戶(hù)在處理網(wǎng)絡(luò )事務(wù)中可以避免大部分的問(wèn)題。Web標準正在向使用Unicode作為缺省編碼轉移,特別的,是在向UTF-8轉移。我們期望其在Web中逐漸地被使用。由于使用了自動(dòng)檢測,這種轉移可以悄然進(jìn)行,越來(lái)越多的用戶(hù)在瀏覽,或是在閱讀/發(fā)送消息的時(shí)候將從面對編碼事宜中解放出來(lái)。這也是為什么我們提倡互聯(lián)網(wǎng)客戶(hù)端要使用好的自動(dòng)檢測方法和好的缺省的編碼設置。
8.將來(lái)的工作:
我們的自動(dòng)檢是設計用來(lái)識別語(yǔ)言的。編碼判斷是這個(gè)識別的副產(chǎn)品。在當前工作中,在單字節實(shí)現中,我們用俄語(yǔ)舉例。由于它識別語(yǔ)言和這個(gè)語(yǔ)言下的編碼方式,因此語(yǔ)言數據越多,編碼檢測的質(zhì)量越高。
要想加入其它的單字節語(yǔ)言/編碼,我們需要每一種語(yǔ)言的,大量的文本采樣數據,同時(shí)需要對語(yǔ)言的認知/分析有一定的深度。我們當前使用腳本來(lái)對一種語(yǔ)言的所有編碼生成一種語(yǔ)言模式。
當前,我們的工作還沒(méi)有在Mozilla源代碼中體現出來(lái),但我們希望在不遠的將來(lái)我們的工作會(huì )變得公開(kāi)。我們希望有人在這個(gè)領(lǐng)域內做出貢獻。因為我們還沒(méi)有對許多單字節編碼做過(guò)測試,我們希望在處理其它語(yǔ)言/編碼的時(shí)候,我們在這里提出的模式可以得到更好的調整,修改甚至是重新設計。
9.引用
Duerst, Martin. 1977. The Properties and Promizes of UTF-8. 11th Unicode Conference.
http://www.ifi.unizh.ch/groups/mml/people/mduerst/papers/IUC11-UTF-8.pdf
Mandarin Promotion Council, Taiwan. Annual survey results of Traditional Chinese character usage.
http://www.edu.tw/mandr/result/87news/index1.htm
Mozilla Internationalization Projects. http://www.mozilla.org/projects/intl
Mozilla.org. http://www.mozilla.org/
Mozilla source viewing. http://lxr.mozilla.org/
版權所有 1998-2003 The Mozilla Organization
最后修改 November 26, 2002
Document History
聯(lián)系客服