我遇到了一个简单的C#程序问题,该程序旨在从Web读取XML文档,提取一些元素,然后将这些元素的内容写入HTML文件(在简单的表中)。虽然XML文档被正确编码为UTF-8,但最终,我生成的所有HTML文件都无法正确转录非西方英文字符(例如解析日文时的“Wingdings”类似输出)。
由于XML文件非常大,程序通过让XmlReader在遇到匹配元素时产生匹配元素,然后使用StreamWriter将其写入HTML文件。
有没有人知道像这样的程序在哪里可能必须明确强制使用UTF-8编码?
答案 0 :(得分:4)
我将在这里猜测:您的浏览器使用错误的字符编码显示页面。
您需要回答:您的浏览器认为HTML是什么字符编码? (我敢打赌它不是UTF-8。)
尝试调整浏览器:例如,在Firefox中,这是视图→字符编码,然后选择与您的文档匹配的字符编码。
由于你似乎有一个非常多语言的文档,你的C#输出是UTF-8 - 它支持人类已知的每个字符,包括日语,中文,拉丁语等。然后尝试告诉Firefox,IE,无论如何,使用UTF-8。您的文档应该显示。
如果这是问题,您需要通知浏览器文档的编码。通过(see this):
这样做<meta>
标记中指定字符编码。你做的越多越好。
让我们来看看你提到的一些事情:
使用(StreamWriter sw = new StreamWriter(outputFile,true,System.Text.Encoding.UTF8))
和
发现使用Text.Encoding.Default使其他西方字符集带有重音符号(西班牙口音,德语变音符号),尽管日语仍有问题。
我要走出去,说你是美国的电脑用户。因此,对于您来说,Windows上的“默认”编码可能是Windows-1252。如果Web浏览器无法检测HTML文档的编码,则Web浏览器将使用的默认编码是ISO-8859-1。 ISO-8859-1和Windows-1252 非常类似,它们都显示ASCII加上一些常见的拉丁字符,如é,è等。更重要的是,重音字符编码相同,所以对于这些字符,这两个编码将解码相同的数据。因此,当您切换到“默认”时,浏览器正确解码您的拉丁字符,尽管编码错误。 ISO-8859-1或Windows-1252中都不存在日语,这两种情况都会导致日语只显示为随机字符。 ( “变为乱码”)
你注意到切换到“默认”修复了一些重音拉丁字符的事实告诉我你的浏览器正在使用ISO-8859-1,这不是我们想要的:我们想用UTF编码文本-8,我们需要浏览器这样读回来。请参阅有关如何执行此操作的简短说明。