unicode - 如何像 Rebol 2 一样在 Rebol 3 字符串中使用 U+FFFF 以上的 Unicode 代码点?

标签 unicode rebol rebol3 astral-plane rebol2

我知道您不能在 Rebol 2 中对大于 ^(FF) 的代码点在字符串中使用插入符号样式转义,因为它不了解有关 Unicode 的任何信息。所以这不会产生任何好的结果,它看起来很困惑:

print {Q: What does a Zen master's {Cow} Say?  A: "^(03BC)"!}

但是代码可以在 Rebol 3 中运行并打印出来:

Q: What does a Zen master's {Cow} Say?  A: "μ"!

这很好,但 R3 显然在 U+FFFF 处最大限度地发挥了在字符串中保存字符的能力:

>> type? "^(FFFF)"
== string!

>> type? "^(010000)"
** Syntax error: invalid "string" -- {"^^(010000)"}
** Near: (line 1) type? "^(010000)"

这种情况比 Rebol 2 遇到它不知道的代码点时的随机行为要好得多。然而,如果您知道如何进行自己的 UTF-8 编码(或者通过从磁盘加载源代码来获取字符串),Rebol 中曾经有一个存储字符串的解决方法。您可以将单个角色组合起来。

所以 U+010000 的 UTF-8 编码是 #F0908080,你之前可以说:

workaround: rejoin [#"^(F0)" #"^(90)" #"^(80)" #"^(80)"]

您将获得一个使用 UTF-8 编码的单个代码点的字符串,您可以将其以代码块的形式保存到磁盘并再次读回。 R3里有类似的trick吗?

最佳答案

有一个使用字符串的解决方法!数据类型也是如此。在这种情况下,您不能使用 UTF-8,但可以使用 UTF-16 解决方法,如下所示:

utf-16: "^(d800)^(dc00)"

,使用 UTF-16 代理对对 ^(10000) 代码点进行编码。一般来说,以下函数可以进行编码:

utf-16: func [
    code [integer!]
    /local low high
] [
    case [
        code < 0 [do make error! "invalid code"]
        code < 65536 [append copy "" to char! code]
        code < 1114112 [
            code: code - 65536
            low: code and 1023
            high: code - low / 1024
            append append copy "" to char! high + 55296 to char! low + 56320
        ]
        'else [do make error! "invalid code"]
    ]
]

关于unicode - 如何像 Rebol 2 一样在 Rebol 3 字符串中使用 U+FFFF 以上的 Unicode 代码点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15077974/

相关文章:

rebol - 我怎样才能在 Rebol 中打开单词的换行状态?

ssl - 什么可能是这个 : ** Command Error: SSL Error: error:14077410:SSL routines:SSL23_GET_SERVER_HEL LO:sslv3 alert handshake failure 的原因

rebol - R3 如何使用脚本头的 Needs 字段?对命名空间有什么影响吗?

java - JVM 中的 Char 值表示

python - wsgi - 处理帖子中的 unicode 字符

REBOL 程序简单的 GUI 窗口,开始

android - 如何从 "Android Terminal Emulator"调用 Rebol 解释器?

filenames - 在 Rebol 3 GUI 中请求文件的正确方法(Saphir 版本)

java - 在java中读取unicode字符

Python unicode 正则表达式匹配因某些 unicode 字符而失败 - 错误或错误?