xsl 1.0转换后的错误字符编码

时间:2013-12-11 16:53:56

标签: vb.net xslt encoding xslt-1.0

我刚刚开始学习编码问题,而且我已经学到了足够的知识,它比我想象的要复杂得多(至少在Windows上),而且我还有很多东西需要学习。

我有一个我相信用UTF-8编码的xml文档。我正在使用VB.net应用程序将xml(XslCompiledTransform和XmlTextWriter)转换为特定于列的文本文件。 xml中的某些字符在输出文本文件中出现错误。示例:em-dash( - )将变为三个字符“ - ”。当发生这种情况时,文件中的列将被抛弃。

据我了解,em-dash甚至不是“Unicode字符”。我不希望它有问题。但是,我可以通过更改VB.net应用程序中指定的编码来解决问题。

如果我使用它,则保留em-dash:

Using writer = New XmlTextWriter(strOutputPath, New UTF8Encoding(True))

如果我使用它,那么em-dash就会被破坏为“—:

Using writer = New XmlTextWriter(strOutputPath, New UTF8Encoding(False))

True / False只是告诉VB是否在文件的开头写入BOM。据我了解,对于UTF-8既不需要也不推荐使用BOM。所以,我的偏好是 False - 但后来我得到了奇怪的角色。

我有几个问题:

  1. 如何确定xml文件是UTF-8?是否有可以告诉我的Windows工具?

  2. 如何确定转换后的文件实际上是坏的?可能是真正的问题是我用来看它的编辑器吗? EmEditor和UltraEdit都表现出同样的东西。

  3. 我尝试使用XVI32十六进制编辑器查看该文件。我想知道实际写入磁盘的是什么,而不是某些GUI程序向我显示的内容。但是,即使是在EmEditor中看起来很好的文件,XVI32也会向我展示糟糕的角色。可能是XVI32只是不理解非ASCII字符?你会为此目的推荐什么Windows十六进制编辑器?

  4. XML文件为650 MB,最终文本文件为380 MB - 因此限制了有用工具列表。

2 个答案:

答案 0 :(得分:1)

你说'据我所知,em-dash甚至不是“Unicode字符”。你是什​​么意思? Unicode字符集肯定包含em dash:2014 hex的代码。在UTF-8编码中,它将是3个字节:E2,80,94。

我怀疑Martin Honnen是对的,你的编辑器根本没有正确显示文件。几点建议:

我不熟悉你提到的编辑器,但是处理不同编码的编辑器通常会默默地选择用于解释文件的编码(如果存在,则基于BOM,有时基于字符代码)看到)。它们通常还有一些方法可以显示它们解释文件的编码方式,以及告诉它们将文件加载(或重新加载)为特定编码的方法。如果您的编辑器没有这些功能,我建议您使用这些功能,例如EditPlus或NotePad ++。

就十六进制编辑器而言,我不熟悉你提到的那个,但是十六进制编辑器的重点是查看原始字节。这样的编辑器通常也提供文本视图(通常与十六进制视图并排),如果他们这样做,我将不依赖于他们对编码的处理。只需使用它们来查看十六进制字节,并查看两个文件中em破折号的字节是否相同。

查看文件的另一种方法可能会出错:即使您的编辑器将文件解释为UTF-8,并非所有字体都包含所有unicode字符,对于那些不在字体中的字符,它们可能会显示一个小方块或者什么也没有。尝试一些不同的字体,或者找一个声称支持unicode的字体(虽然没有字体支持所有的Unicode,并且有一些Unicode规范的修订版增加了更多的字符)。我认为,Lucida Sans Unicode将出现在大多数Windows系统上。

另一个技巧:我强烈推荐实用程序BabelMap。您可以在那里查找任何unicode字符并查看unicode值是什么,并且可以从那里复制字符并将其粘贴到文本编辑器中的文件中,并查看它是如何显示的。

答案 1 :(得分:1)

UltraEdit提供了几种配置设置,用于处理UTF-8编码文件。 文件处理 - Unicode / UTF-8检测配置对话框中有自动检测UTF-8文件,默认情况下已启用。

启用此设置后,UltraEdit将搜索UTF-8 BOM。如果不存在,它会在前几KB中搜索通常出现在HTML / XHTML文件头部或XML文件第一行中的UTF-8声明。如果文件顶部没有BOM且没有标准化编码信息,UltraEdit会在前64 KB内搜索看起来像UTF-8编码字符的字节序列。如果可以找到这样的字节序列,则UltraEdit将该文件解释为UTF-8编码文件。例如,仅包含3个字节E2 80 94的文件被解释为UTF-8编码文件。

UltraEdit在主窗口底部的状态栏中指示检测到哪个编码并为活动文件激活(保存时)。状态栏中显示 UTF-8 U8 - ,具体取决于使用的状态栏(高级或基本)以及哪个版本的UltraEdit用作旧版本版本只有基本状态栏。

只有以UTF-8编码且没有BOM,没有UTF-8字符集或编码声明且前64 KB内没有UTF-8编码字符的文件被错误地打开为ANSI文件。在这种情况下,用户可以使用UltraEdit的增强文件 - 打开命令,并在使用按钮打开打开文件之前明确选择UTF-8编码。

对于completness,还有一个配置设置可以手动添加到uedit32.ini,这会导致所有未被检测为UTF-16文件的文件作为UTF-8编码文件。这个设置对于那些只想使用UTF-8编码文件的用户很有用,即使文件中通常没有任何字符的代码值大于127也是如此。

有关使用UTF-8编码文件的更多信息,请参阅UltraEdit论坛。有一些主题有很多关于在UltraEdit中编辑UTF-8编码文件的信息。