gpt4 book ai didi

wolfram-mathematica - 在 Mathematica 中读取 UTF-8 编码的文本文件

转载 作者:行者123 更新时间:2023-12-03 22:35:10 24 4
gpt4 key购买 nike

我如何阅读 utf-8 编码 Mathematica 中的文本文件?

这就是我现在正在做的:

text = Import["charData.txt", "Text", CharacterEncoding -> "UTF8"];

但它告诉我
$CharacterEncoding::utf8: "The byte sequence {240} could not be interpreted as a character in the UTF-8 character encoding"

等等。我不知道为什么。我相信该文件是有效的 utf-8。

这是我正在尝试阅读的文件:

http://dl.dropbox.com/u/38623/charData.txt

最佳答案

简短版本:Mathematica 的 UTF-8 功能不适用于超过 16 位的字符代码。如果可能,请改用 UTF-16 编码。但请注意,Mathematica 对 17 位以上字符代码的处理通常有问题。长版本如下...

正如许多评论者所指出的,问题似乎在于 Mathematica 对代码大于 16 位的 Unicode 字符的支持。引用的文本文件中的第一个这样的字符是 U+20B9B (𠮛) 出现在第 10 行。

某些版本的 Mathematica 前端(如 64 位 Windows 7 上的 8.0.1)可以在直接输入时处理有问题的字符:

In[1]:= $c="𠮛";

但是如果我们试图从它的 Unicode 创建字符,我们就会遇到麻烦:
In[2]:= 134043 // FromCharacterCode

During evaluation of In[2]:= FromCharacterCode::notunicode:
A character code, which should be a non-negative integer less
than 65536, is expected at position 1 in {134043}. >>
Out[2]= FromCharacterCode[134043]

然后有人想知道,Mathematica 认为这个字符的代码是什么?
In[3]:= $c // ToCharacterCode
BaseForm[%, 16]
BaseForm[%, 2]

Out[3]= {55362,57243}
Out[4]//BaseForm= {d842, df9b}
Out[5]//BaseForm= {1101100001000010, 1101111110011011}

我们得到两个恰好与该字符的 UTF-16 表示相匹配的代码,而不是像人们预期的那样使用单个 Unicode 值。 Mathematica 也可以执行逆变换:
In[6]:= {55362,57243} // FromCharacterCode

Out[6]= 𠮛

那么,Mathematica 对这个字符的 UTF-8 编码的概念是什么?
In[7]:= ExportString[$c, "Text", CharacterEncoding -> "UTF8"] // ToCharacterCode
BaseForm[%, 16]
BaseForm[%, 2]

Out[7]= {237,161,130,237,190,155}
Out[8]//BaseForm= {ed, a1, 82, ed, be, 9b}
Out[9]//BaseForm= {11101101, 10100001, 10000010, 11101101, 10111110, 10011011}

细心的读者会发现这是 UTF-8 encoding字符的 UTF-16 编码。 Mathematica 可以解码这个,嗯,有趣的编码吗?
In[10]:= ImportString[
ExportString[{237,161,130,237,190,155}, "Byte"]
, "Text"
, CharacterEncoding -> "UTF8"
]

Out[10]= 𠮛

是的,它可以!但是……那又怎样?

这个字符的真实 UTF-8 表达式怎么样:
In[11]:= ImportString[
ExportString[{240, 160, 174, 155}, "Byte"]
, "Text"
, CharacterEncoding -> "UTF8"
]
Out[11]= $CharacterEncoding::utf8: The byte sequence {240} could not be
interpreted as a character in the UTF-8 character encoding. >>
$CharacterEncoding::utf8: The byte sequence {160} could not be
interpreted as a character in the UTF-8 character encoding. >>
$CharacterEncoding::utf8: The byte sequence {174} could not be
interpreted as a character in the UTF-8 character encoding. >>
General::stop: Further output of $CharacterEncoding::utf8 will be suppressed
during this calculation. >>
ð ®

...但我们看到原始问题中报告的失败。

UTF-16 怎么样? UTF-16 不在有效字符编码列表中,但 "Unicode"是。由于我们已经看到 Mathematica 似乎使用 UTF-16 作为其原生格式,让我们试一试(使用带有字节顺序标记的大端 UTF-16):
In[12]:= ImportString[
ExportString[
FromDigits[#, 16]& /@ {"fe", "ff", "d8", "42", "df", "9b"}
, "Byte"
]
, "Text"
, CharacterEncoding -> "Unicode"
]
Out[12]= 𠮛

有用。作为一个比较完整的实验,我 re-encoded the cited text file从问题转换为 UTF-16 并成功导入。

Mathematica 文档在很大程度上对这个主题保持沉默。有趣的是,在 Mathematica 中提到 Unicode 似乎伴随着字符代码包含 16 位的假设。例如,参见 Raw Character Encodings 中对 Unicode 的引用。 .

由此得出的结论是 Mathematica 对 UTF-8 转码的支持对于长度超过 16 位的代码是缺失/错误的。 UTF-16,Mathematica 明显的内部格式,似乎可以正常工作。因此,如果您能够重新编码文件,并且您可以接受生成的字符串实际上是 UTF-16 格式,而不是真正的 Unicode 字符串,那么这是一种解决方法。

后记

写完这个回复后不久,我尝试重新打开包含它的 Mathematica 笔记本。笔记本中出现的所有问题字符都被清除,取而代之的是胡言乱语。我想还有更多 Unicode 错误需要解决,即使在 Mathematica 8.0.1 中也是如此;)

关于wolfram-mathematica - 在 Mathematica 中读取 UTF-8 编码的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5597013/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com