9

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

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

软件和硬件平台: 我在 Intel Mac 上运行 Mathematica 8。我尝试了 Mathematica 和 Mathematica notebook 的命令行版本,它们的行为相同。

谢谢你。


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

4

2 回答 2

9

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

只是为了澄清一些事情:

不需要32 位编码来处理超过 65000 个 Unicode 字符。用于 Unicode、UTF-8 和UTF-16的最常见编码是多字节编码,这意味着使用可变数量的字节来表示字符。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 他们有)。

也可以看看

请参阅我之前关于同一主题的问题: 在 Mathematica 中读取 UTF-8 编码的文本文件

If you are going to work with Chinese, you may come across this other problem too: Getting the Mathematica front end to obey the FontFamily option

于 2011-11-09T08:29:13.633 回答
5

根据Mathematica 8帮助中的这个页面:

Mathematica supports both 8- and 16-bit raw character encodings.

大概他们说他们不支持支持所需字符所需的 32 位编码。

作为进一步的证据(在文档中没有明确声明的情况下),同一页面上支持的编码列表没有 32 位编码。显然只有 MathLink 支持 32 位编码。我想没有足够的用户需求。

于 2011-11-09T01:18:44.110 回答