问题描述:
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/