xsl1.0转换后的错误字符编码



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

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

据我所知,em破折号甚至不是"Unicode字符"。我不希望它有问题。但是,我可以通过更改VB.net应用程序中指定的编码来解决问题。

如果我使用这个,em破折号将被保留:

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

如果我使用这个,em破折号就会损坏为"â€":

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

真/假只是简单地告诉VB是否在文件的开头写入BOM表。据我所知,对于UTF-8,BOM既不是必需的,也不是推荐的。所以,我的偏好是错误,但后来我得到了奇怪的字符。

我有几个问题:

  1. 如何确定xml文件是UTF-8?有没有Windows工具可以告诉我这一点?

  2. 如何确定转换后的文件实际上是坏的?难道真正的问题是我用来看它的编辑器吗?EmEditor和UltraEdit都显示了相同的内容。

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

XML文件为650MB,最终的文本文件为380MB,因此在一定程度上限制了有用工具的列表。

你说‘据我所知,em破折号甚至不是"Unicode字符"。’你的意思是什么?Unicode字符集肯定包含em-dash:2014十六进制的代码。在UTF-8编码中,它将是3个字节:E2、80、94。

我怀疑Martin Honnen是对的,你的编辑只是没有正确地显示文件。几个建议:

我不熟悉你提到的编辑器,但处理不同编码的编辑器通常会默默地选择一种编码来解释文件(如果有BOM表,则基于BOM表,有时基于他们看到的字符代码)。他们通常也有某种方式来显示他们将文件解释为什么编码,并告诉他们将文件加载(或重新加载)为特定编码。如果你的编辑器没有这些功能,我建议你买一个有这些功能的,比如EditPlus或NotePad++。

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

查看文件的另一种方式可能会出错:即使编辑器将文件解释为UTF-8,也不是所有字体都包含所有unicode字符,对于那些不在字体中的字符,它们可能会显示一个小正方形或根本不显示。尝试几种不同的字体,或者找到一种声称支持unicode的字体(尽管没有字体支持所有unicode,而且unicode规范的几个修订版添加了更多字符)。我认为Lucida Sans Unicode将在大多数Windows系统上使用。

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

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

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

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

只有在前64 KB内没有BOM、没有UTF-8字符集或编码声明、没有UTF-8编码字符的UTF-8编码文件才会作为ANSI文件错误打开。在这种情况下,用户可以使用UltraEdit的增强的文件-打开命令,并在使用打开

为了完整性,还有一个配置设置可以手动添加到uedit32.ini中,这将导致将所有未被检测为UTF-16文件的文件打开为UTF-8编码文件。对于那些只想使用UTF-8编码文件的人来说,这是一个非常有用的设置,即使文件中通常没有代码值大于127的字符。

有关使用UTF-8编码文件的更多信息,请访问UltraEdit论坛。有几个主题提供了大量关于在UltraEdit中编辑UTF-8编码文件的信息。

相关内容

  • 没有找到相关文章