大unicode问题 - AS3

时间:2013-07-30 21:18:05

标签: actionscript-3 unicode actionscript hex

我创建了一个程序,人们可以在其中输入4个字母,它会为您提供相应的unicode字符,它将在textflow元素中插入。现在我有很多问题,但最后我成功了一些帮助。现在问题来自我输入“dddd”或“ddd1”作为测试。

我收到了错误 - “输入中遇到了未配对的Unicode代理。”

现在我花了2天的时间进行测试,绝对没有触发任何事件让我可以在错误发生之前测试错误。

代码:

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

当错误发生时,res等于“?”在控制台中......但如果用if(res ==“?”)测试它,则返回false。

我的问题: 现在我搜索和搜索,并且在adobes 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 个答案:

答案 0 :(得分: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)