为什么即使在从ANSI转换为UTF-8后,XML中仍出现未知字符?

时间:2015-01-07 01:51:48

标签: xml encoding utf-8 character-encoding

我有一个问题。目前,我研究了如何将.xml文件的编码从ANSI转换为UTF-8,幸运的是我找到了解决方案。但是有一个问题。我的.xml文件包含许多西班牙语,当然还有许多倒置的问号符号。为了让eclipse能够完美地显示.xml文件中的所有字符,我需要将.xml文件的编码从ANSI更改为UTF-8。我设法改变编码。但它很奇怪。即使在更改了编码后,包含本身也会显示未知字符。以下是我的代码:

Dim objFso, objF As Object
Set objFso = CreateObject("Scripting.FileSystemObject")
xmlFile = NewFolderName & "\" & Application.Cells(5, j + 1).Value
            Set objF = objFso.CreateTextFile(xmlFile, True, False)
            objF.Write "<resources>"
            objF.WriteBlankLines (1)
            i = 11
            Var = Application.Cells(8, j + 1).Value
            Do Until Application.Cells(i, 2).Value = 0
                    objF.Write "     <string name=" & Chr(34) & Application.Cells(i, 2).Value & Var & Chr(34) & ">" & Application.Cells(i, j + 1).Value & "</string>"
                    objF.WriteBlankLines (1)
                i = i + 1
            Loop
            objF.WriteBlankLines (1)
            objF.Write ("</resources>")
            objF.Close
            Set stream = CreateObject("ADODB.Stream")
            stream.Open
            stream.Type = 2
            stream.Charset = "utf-8"
            stream.LoadFromFile xmlFile
            stream.SaveToFile xmlFile, 2
            stream.Close
            Set stream = Nothing

以上代码的输出如下所示:

<string name="BroadcastFailed">No se recibi� emisi�n [E202]</string>
<string name="NoInputSelect">No hay selecci�n de entrada disponible</string>
<string name="ThreeDModeQ">�Ver en Modo 3D?</string>

以上.xml输出以UTF-8编码,但仍会出现未知字符。我想要的是这样的:

<string name="BroadcastFailed">No se recibió emisión [E202]</string>
<string name="NoInputSelect">No hay selección de entrada disponible</string>
<string name="ThreeDModeQ">¿Ver en Modo 3D?</string>

任何知道我的代码中的错误的人都请回答你的问题。我非常感谢你的答案:):))

2 个答案:

答案 0 :(得分:0)

问题是您将初始文件保存为ASCII(您将Unicode CreateTextFile()参数设置为False)。根据{{​​3}}:

  

object.CreateTextFile(filename [,overwrite [,unicode ]])

     

CreateTextFile方法包含以下部分:

     

部分描述

     

对象必需。始终是FileSystemObject或Folder对象的名称。

     

filename必需。用于标识要创建的文件的字符串表达式。

     

覆盖可选。布尔值,指示是否可以覆盖现有文件。如果文件可以被覆盖,则值为True;如果无法覆盖,则返回false。如果省略,则不会覆盖现有文件。

     

unicode可选。布尔值,指示文件是创建为Unicode还是ASCII文件。如果文件是作为Unicode文件创建的,则值为True;如果它是作为ASCII文件创建的,则为False。如果省略,则假定为ASCII文件。

然后您将ASCII文件加载为UTF-8。这对于ASCII字符来说很好(因为ASCII是UTF-8的子集),但是您正在丢失非ASCII字符,例如ó¿。这就是您在最终文件中以(Unicode代码点U+FFFD REPLACEMENT CHARACTER)字符结尾的原因。

您需要将初始文件保存为Unicode,然后将其作为Unicode加载到ADODB.Stream,然后您不会丢失任何字符,然后可以将文本保存在您想要的任何字符集中:< / p>

Set objF = objFso.CreateTextFile(xmlFile, True, True) ' Unicode parameter is True
' ...
Set stream = CreateObject("ADODB.Stream")
stream.Type = 2
stream.Charset = "utf-16"
stream.Open
stream.LoadFromFile xmlFile ' load as Unicode
stream.Charset = "utf-8"
stream.SaveToFile xmlFile, 2 ' save as UTF-8
stream.Close

答案 1 :(得分:0)

经过一番研究,我终于找到了解决方案。我需要使用LoadFromFile加载我的unicode文件,并使用stream.ReadText使流读取内容,然后先将其关闭。然后我需要打开流,使用utf-8将内容写回stream.WriteText并使用SaveToFile保存,然后永久关闭它。下面是代码。实际上我从Use "ADODB.Stream" to convert ANSI to UTF-8, miss 1-2 character in the first row得到了参考。

Set stream = CreateObject("ADODB.Stream")
            stream.Type = 2
            stream.Charset = "unicode"
            stream.Open
            stream.LoadFromFile xmlFile
            strText = stream.ReadText
            stream.Close

            stream.Type = 2
            stream.Charset = "utf-8"
            stream.Open
            stream.WriteText strText
            stream.SaveToFile xmlFile, 2
            stream.Close
            Set stream = Nothing