我知道您不能在 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/