2011-08-19 11 views
25

ด้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้дด็็็็็้้้้้็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้爲什麼那些泰文字符在長尾巴的網頁上顯示?

我發現正如我粘貼上述這隻需3個空格寬度一些有趣的字符。然而字符串的實際長度是380

我檢查在python字符串,字符串編碼是如下:

「\ xe0 \ XB8 \ X94 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ XD0 \ XB4 \ xe0 \ XB8 \ X94 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \的x87 \ xe0 \ xb9 \ X89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89'

看來這個字符串是三個泰字符的組合:

ด \xe0\xb8\x94 THAI CHARACTER DO DEK 

้ \xe0\xb9\x89 THAI CHARACTER MAI THO 

็ \xe0\xb9\x87 THAI CHARACTER MAITAIKHU 

而且我的問題是:

  1. 爲什麼這些字符的行爲如此不同,它是一個錯誤嗎?
  2. 我該如何避免它在網站(也許有一些HTML過濾器)?

UPDATE

我有更多的瀏覽器測試的字符,長尾巴只出現在Chrome和Firefox在Windows平臺上。

以下是截圖我已經採取了:

勝7 IE8 win 7 ie8


Ubuntu的火狐 ubuntu firefox


勝7鉻 win 7 chrome


勝7火狐 win 7 firefox


因此,我想這是一個瀏覽器相關的bug。

+3

大聲笑,在上面的字符:P –

+2

輝煌,我想知道他們爲什麼也這樣顯示。 –

+0

編程相關如何? – paxdiablo

回答

4

你提到的代碼都是UTF-8,這就是每個字符需要3個字節的原因。的respectice Unicode codes是:

的後兩種在Mark, Nonspacing類別,並具有Combine屬性( Canonical_Combining_Class )設置爲107,這意味着代碼點在渲染中與前面的代碼點結合在一起。

您的示例以單個字符開始,並在其上添加大量非間距標記。

比較此C#代碼:

char DODEK = (char)0x0e14; 
char MAITHO = (char)0x0e49; 
char MAITAIKHU = (char)0x0e47; 

string thai = new string(new char[] { DODEK, MAITHO, MAITAIKHU }); 
Console.WriteLine("number of code points: " + thai.Length); 

var si = new System.Globalization.StringInfo(thai); 
Console.WriteLine("number of text elements: " + si.LengthInTextElements); 

輸出:

number of code points: 3 
number of text elements: 1 

.Net StringInfo class見。

8

有兩個問題,一個是輸出系統(字體渲染器),它不是泰國人意識到的,一個是輸入系統中的一個,它首先產生了這個文本。

如果你已經完成作業,你會知道UniCode稱爲非間距標記(NSM)的是mai tho和maitaikhu(UniCode名稱)。這意味着字體渲染器在顯示該字形時不應移動到下一個字符單元格。

爲了避免上面看到的混亂,泰國API聯盟(TAPIC)制定了WTT 2.0標準,該標準描述了字體呈現算法在接收輸入時如何處理泰語字母順序以及如何輸入方法應該允許輸入這些字符,如果您嘗試輸入它們。

Standardization and Implementations of Thai Language Overview

libthai包括輸入和輸出的方法。

thaicheck是一個小程序,可以檢測字母序列問題並修復它們。

順便說一句,你不能有一個序列(單詞)的do dek,mai tho和maitaikhu;輸入序列是噪聲。

請記住,有些編輯器已經打破了允許鍵入多個不能組合的NSM的輸入方法,但輸出方法只會呈現合法序列;結果是一個非法的輸入字符串,在用戶的他的系統上看起來OK。

+13

如果每個人都「做了功課」,我們不需要stackoverflow – devio

+0

我認爲在這裏發佈之前試圖找到問題的答案被認爲是禮貌的。 – koan

+4

我已經做了一些功課,但我是泰國人物的新手,因此我不能指出如何谷歌它。這就是我認爲這很棒的原因。 –

2

儘管unicode格式在技術上允許它,但您不應該將數百個unicode字符合併爲一個圖形字符。你通常不超過2或3個字符。

在泰語中,你有元音和音調標記,它們顯示在輔音字符上面(有時元音出現在下面,甚至在輔音字符的周圍......)。 這有點像法語中的元音(&eacute ;,è ...)或德語中的元音變音。在泰國有兩個以上的這種標誌是不正常的(法語或德語不止一種)。這意味着你的輸入是非法的泰文文字(可能是爲了提供一些有趣的圖形效果,如「ASCII藝術」)。根據瀏覽器的不同,我對此類非法文本的解釋並不感到驚訝。

相關問題