2013-07-30 58 views
1

我做了一個程序,人們可以輸入4個字母,它會給你相應的unicode字符,它插入到textflow元素中。現在我遇到了很多問題,但最終我得到了一些幫助。現在,當我輸入「dddd」或「ddd1」作爲測試時,問題就出現了。大unicode問題 - AS3

我得到了錯誤 - 「在輸入中遇到了未配對的Unicode代理項」。

現在我花了2天時間來測試,並且絕對沒有任何事件觸發,這讓我可以在錯誤發生之前測試錯誤。

的代碼: 「?」

str = "dddd" 
num = parseInt(str,16) 
res = String.fromCharCode(num) 

NOTE:事實上當誤差occurres RES等於在控制檯中......但如果你用if(res ==「?」)測試它,它將返回false。

我的問題: 現在我找啊找和abolutly發現這個錯誤在磚坯AS3參考沒有說明,但2天之後,我發現這個頁面的JavaScript:http://scripts.sil.org/cms/scripts/page.php?item_id=IWS-Chapter04a

它說, - 該代碼單元然而,在範圍0xD800-0xDFFF中,服務於特殊用途。這些代碼單元,稱爲代理代碼單元

所以,現在我與測試:

if(num > 0 && num < uint(0xD800)) || (num > uint(0xDFFF) && num < uint(0xFFFF)){ 

    get unicode character. 
} 

我的問題很簡單,如果我理解這一點正確,這將實際防止錯誤的發生? - 我不是unicode專家,也不知道如何測試它,因爲有十個人的數千個字符,所以我可能錯過了一個,這意味着用戶偶然可能會得到錯誤,並有可能導致應用程序崩潰。

回答

1

你是對的。 0xD800-0xDBFF之間的代碼點(「高代理」)必須與0xDC00-0xDFFF之間的代碼點(「低代理」)配對。這些保留用於UTF-16 [1] - 當需要處理不適合16位的更高平面時 - 因此這些代碼點不能單獨出現。例如:

0xD802 DC01對應於(我離開了0x六角標記):

10000 + (high - D800) * 0400 + (low - DC00) 
    10000 + (D802 - D800) * 0400 + (DC01 - DC00) 
= 10000 +   0002 * 0400 +   0001 
= 10801 expressed as UTF-16 

...只是加入到萬一以後需要支持該位。

我沒有測試過,有如下AS3功能,但是你可能也想測試下面的輸入 - 你不會得到這些替代錯誤,但可能會收到其他錯誤消息:

  • 0xFFFE0xFFFF(當使用更高的平面時,還有任何代碼點以這些位「結束」,例如0x1FFFE0x1FFFF; 0x2FFFE0x2FFFF等)。這些是「非字符」。
  • 0xFDD0-0xFEDF也是如此 - 也是「非字符」。

  1. AS3實際使用UTF-16來存儲它的字符串,但即使沒有,替代代碼點仍然沒有任何意義以外對 - 的碼點被保留,不能在其他Unicode編碼中使用(例如UTF-8或UTF-32)
+0

cool - 感謝您的時間和幫助:D –

+0

ser du er fra dk。 Såmange tak for dinhjælp:D –

+0

沒問題 - 時常回顧unicode規範總是很好 - 現代語言之間共享的一些問題。 :-) – JimmiTh