【问题标题】:Big unicode problems - AS3大 unicode 问题 - AS3
【发布时间】:2013-07-31 05:20:10
【问题描述】:

我制作了一个程序,人们可以在其中输入 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 专家,也不知道如何测试它,因为有成千上万个字符,所以我可能错过了一个,这意味着用户可能会意外收到错误并有可能导致应用程序崩溃.

【问题讨论】:

    标签: actionscript-3 unicode actionscript hex


    【解决方案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 (当使用更高的平面时,任何以这些位“结束”的代码点,例如 0x1FFFE0x1FFFF0x2FFFE0x2FFFF 等)这些都是“非字符” .
    • 0xFDD0-0xFEDF 也是如此 - 也是“非字符”。

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

    【讨论】:

    • 没问题 - 不时重新审视 unicode 规范总是好的 - 现代语言之间共享的一些问题。 :-)
    猜你喜欢
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多