1

我制作了一个程序,人们可以在其中输入 4 个字母,它会为您提供它插入到 textflow 元素中的相应 unicode 字符。现在我遇到了很多问题,但最终我在一些帮助下成功了。现在,当我输入“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 专家,也不知道如何测试它,因为有成千上万个字符,所以我可能错过了一个,这意味着用户可能会意外收到错误并有可能导致应用程序崩溃.

4

1 回答 1

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;0x2FFFE等等0x2FFFF)这些都是“非字符”。
  • 这同样适用于0xFDD0-0xFEDF- 也是“非字符”。

  1. AS3 实际上使用 UTF-16 来存储它的字符串,但即使没有,代理代码点在对之外仍然没有任何意义 -代码点是保留的,也不能用于其他 Unicode 编码(例如 UTF -8 或 UTF-32)
于 2013-07-30T21:42:12.307 回答