我们已经编写了一个应用程序,它将打开 Microsoft Word 文档,读取里面的所有文本,然后将这些数据发送到外部系统进行处理。这在过去运行良好,但自从我们接受 Unicode 后,我们在阅读 Word 文档时遇到了一些问题。
我们看到的问题是我们无法显示任何占用多个代码单元的字符,例如(Surrogate Pair)或ā̈(Grapheme Cluster)。当我们尝试显示 时,我们得到两个 ??,而 ā̈,我们得到组成字素的每个单独的字符。
我有一种感觉,我们看到这些字符返回的原因是因为我们没有正确读取文件。但是我一直在寻找,还没有找到解决方案。
我创建了一个只包含一个值的 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% 确定。谁能引导我走正确的道路?