unicode - 如何输入非BMP Unicode(超过4个字符的十六进制)作为Mathematica的输入

标签 unicode wolfram-mathematica supplementary astral-plane

问题描述:
Mathematica使用"\:nnnn"作为unicode输入的语法。例如。,
如果我们进入"\:6c34",我们得到"水"(中文为“water”)。
但是,如果要输入"\:1f618"(脸部亲吻),该怎么办。
当我尝试这个时,我得到了"ὡ8",而不是"a face throwing a kiss"
因此,在我输入"\:1f61"之前,Mathematica会对"8"进行评估。

问题:
我们如何才能延迟评估或一般如何输入任何unicode输入
(至于超过4个字符的十六进制)?

软件和硬件平台:
我在Intel Mac上运行Mathematica 8。
我同时尝试了Mathematica和Mathematica笔记本的命令行版本,
他们的行为是一样的。

谢谢你。

的思考:
Unicode是extensible standard,它可以增长(并且确实会增长:)。实现此标准的软件系统只能实现此标准的子集,以便有效且有用(8位,16位或32位编码)。一个人,作为某个软件包的用户,不应假设一旦软件说它支持unicode,就支持通用的unicode集。

最佳答案

简短答案:您不能这样做,因为Mathematica不正确地支持这些字符。请参阅文章末尾的一些解决方法。

只是为了清除一些内容:

无需32位编码即可处理超过65000个Unicode字符。用于Unicode,UTF-8和UTF-16的最常见编码是multibyte encodings,这意味着使用可变数量的字节来表示字符。 UTF-16可以使用2或4个字节来表示一个字符。 Mathematica内核会将每个2字节序列解释为字符串中的单个字符,有时(在遇到4字节序列时)会导致一些无效字符。这可能被认为是一个错误。前端对于如何处理4字节序列非常烦恼,这绝对是一个错误。

有限的解决方法

当严格在内核中工作时(例如,从文件中读取Unicode数据),我有时将此功能用作解决方法,以获取2单位(4字节)UTF-16序列的实际Unicode代码点:

toCodePoint[{a_, b_}] /; 16^^d800 <= a <= 16^^dbff && 16^^dc00 <= b <= 16^^dfff := (a - 16^^d800)*2^10 + (b - 16^^dc00) + 16^4

您可以使用
Split[ToCharacterCode[str], If[16^^d800 <= # <= 16^^dbff, True] &]

正确地将UTF-16字符串分割为Unicode字符(长度为1或长度为2,具体取决于字符)。

这是一个丑陋且不便的解决方法,除非您也为此提出了一些建议,否则您将无法在前端显示这些字符中的任何一个。从unicode.org导入字形引用图像(至少对于CJK,它们具有它们)。

另请参阅

请参阅我先前关于同一主题的问题:
Reading an UTF-8 encoded text file in Mathematica

如果您要使用中文,也可能会遇到其他问题:
Getting the Mathematica front end to obey the FontFamily option

关于unicode - 如何输入非BMP Unicode(超过4个字符的十六进制)作为Mathematica的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8059153/

相关文章:

python - 当存在 unicode 数据时,Json 解码器不一致

wolfram-mathematica - 检查 Mathematica 中的绘图是否为空

list - 在 Mathematica 中将列表元素连接成一个数字

java - Eclipse 调试器错误地显示 cjk 字符 - Java

Java 读取带有补充 unicode 字符的字符流

java - 防止Gson转义Unicode符号

python - 在python中将任何编码转换为utf8?

r - 如何将希腊字母 delta (∆) 插入到 flextable 对象的标题中?

python - 为什么 NumPy 在对零填充数组求和时给出不同的结果?

java - Java补充开发工具