我创建了一个程序,人们可以在其中输入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专家,也不知道如何测试它,因为有十万个字符,所以我可能错过了一个,这意味着用户偶然会得到错误并冒着使应用程序崩溃的风险
答案 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功能,但您可能还想测试下面的输入 - 您不会获得这些输入的代理错误,但可能会收到另一条错误消息:
0xFFFE
和0xFFFF
(当使用更高的平面时,也会使用这些位“结束”任何代码点,例如0x1FFFE
和0x1FFFF
; 0x2FFFE
和0x2FFFF
等)这些都是“非字符”。0xFDD0-0xFEDF
- 也是“非字符”。