【发布时间】:2012-12-17 17:15:05
【问题描述】:
我们已经编写了一个应用程序,可以打开 Microsoft Word 文档,读取里面的所有文本,然后将这些数据发送到外部系统进行处理。这在过去运行良好,但自从我们开始接受 Unicode 后,我们在阅读 Word 文档时遇到了一些问题。
我们看到的问题是我们无法显示任何占用多个代码单元的字符,例如???? (代理对)或ā̈(字素簇)。当我们尝试显示 ???? 时,我们得到两个 ??,而 ā̈ 则得到组成字素的每个单独的字符。
我有一种感觉,我们看到这些字符返回的原因是因为我们没有正确读取文件。但是我一直在寻找,还没有找到解决方案。
我创建了一个只包含一个值的 Word 文档:????。
我们在代码中做的第一件事就是将文件读入一个字节数组:
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
wordDocument = new byte[fileStream.Length];
fileStream.Read(wordDocument, 0, (int)fileStream.Length);
fileStream.Close();
经进一步调查,字节数组包含以下值:
{63, 63, 10, 13}, or in hex {0x3f, 0x3f, 0x0d, 0x0a}
通过查找十六进制值,我了解到 0x3f 与 ? 相关,这就解释了为什么我们要返回两个 ??。
然后,当我们尝试将数据转换回字符串时,我们最终得到了这两个 ??
textdata = System.Text.Encoding.Unicode.GetString(wordDocument);
我认为问题可能在于我们在文档中的阅读方式,但我不能 100% 确定。谁能指导我正确的道路?
【问题讨论】:
-
Word 文档不是纯文本。
-
对,当我拿回那双时我的想法是什么??而不是代理对。问题是,如何正确地从 Word 文档中获取所有数据?
-
您需要为 Word 文件格式(.doc 或 .docx)编写解析器。这并不容易。
标签: c# unicode surrogate-pairs