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



我这里有一个问题。目前,我对如何将.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>

任何知道我的代码中错误的人,请放下您的答案。我非常感谢您的回答:):)

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

对象。CreateTextFile(filename[, overwrite[, unicode]])

方法具有以下部分:

零件描述

对象为必需。始终是文件系统对象或文件夹对象的名称。

文件名 必填。标识要创建的文件的字符串表达式。

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

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

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

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

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

经过一些研究,我终于找到了解决方案。我需要使用 LoadFromFile 加载我的 unicode 文件,并使流使用 stream.ReadText 读取内容,然后先关闭它。然后我需要打开流,使用 stream.WriteText 将内容写回utf-8并使用SaveToFile保存,然后永久关闭它。下面是代码。实际上,我从"ADODB"中获得了参考。流"将 ANSI 转换为 UTF-8,第一行缺少 1-2 个字符。

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

最新更新