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

为什么即使在从ANSI转换为UTF-8之后,XML中也会出现未知字符?,xml,vba,encoding,utf-8,character-encoding,Xml,Vba,Encoding,Utf 8,Character Encoding,我这里有个问题。目前,我正在研究如何将编码的.xml文件从ANSI转换为UTF-8,幸运的是,我找到了解决方案。但有一个问题。xml文件包含许多西班牙语,当然还有许多反问号符号。为了使eclipse能够完美地显示.xml文件中的所有字符,我需要将.xml文件的编码从ANSI更改为UTF-8。我设法改变了密码。但这很奇怪。即使在更改编码后,contain本身也会显示未知字符。下面是我的代码: Dim objFso, objF As Object Set objFso = CreateObject(

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

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
Dim objFso,objF作为对象
设置objFso=CreateObject(“Scripting.FileSystemObject”)
xmlFile=NewFolderName&“\”&Application.Cells(5,j+1).Value
设置objF=objFso.CreateTextFile(xmlFile,True,False)
objF.Write“”
objF.WriteBlankLines(1)
i=11
Var=应用程序单元格(8,j+1).值
直到应用程序。单元格(i,2)。值=0
objF.Write“”&Application.Cells(i,j+1).Value&“
objF.WriteBlankLines(1)
i=i+1
环
objF.WriteBlankLines(1)
objF.写(“”)
objF.关闭
Set stream=CreateObject(“ADODB.stream”)
小溪,打开
stream.Type=2
stream.Charset=“utf-8”
stream.LoadFromFile xmlFile
stream.SaveToFile xml文件,2
关闭
设置流=无
上述代码的输出如下图所示:

<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>
No se recibi� 埃米西�n[E202]
没有干草�不可争辩
�Ver en Modo 3D?
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>
No se recibióemisión[E202]
没有什么可以争论的
你想看3D电影吗?

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

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

object.CreateTextFile(文件名[,覆盖[,unicode]))

CreateTextFile方法包含以下部分:

零件说明

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

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

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

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

然后将ASCII文件作为UTF-8加载。这对于ASCII字符来说很好(因为ASCII是UTF-8的一个子集),但是您正在丢失非ASCII字符,比如
。这就是为什么最终会出现
(Unicode代码点
U+FFFD替换字符
)字符在最终文件中

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

Set objF=objFso.CreateTextFile(xmlFile,True,True)”Unicode参数为True
' ...
Set stream=CreateObject(“ADODB.stream”)
stream.Type=2
stream.Charset=“utf-16”
小溪,打开
stream.LoadFromFile xmlFile“以Unicode格式加载”
stream.Charset=“utf-8”
stream.SaveToFile xmlFile,2'另存为UTF-8
关闭

经过研究,我终于找到了解决方案。我需要使用
LoadFromFile
加载我的unicode文件,并使用
stream.ReadText
使流读取内容,然后首先关闭它。然后我需要打开流,使用
stream.WriteText
将内容写回
utf-8
,并使用
SaveToFile
将其保存,然后永久关闭。下面是代码。事实上,我从他那里得到了推荐信


谢谢你的回答。我刚才试过你的解决办法,但还是没有解决问题。未知字符仍然出现,现在输出结构变得更加怪异。下面是输出:
� V e r e n M o d o 3 d?
结构似乎太奇怪了,不是吗?如果
Cells()
的输入字符串一开始格式不正确,我希望它在
CreateTextFile()
输出UTF-16时是这样的。我不希望它在输出UTF-8时看起来像这样。在将初始文件加载到
ADODB.Stream
之前,您是否验证了其文本是否正确?调用
SaveToFile()
之前,是否验证了
ADODB.Stream
包含正确的文本?是的。加载到ADODB.Stream之前的.xml文件采用unicode编码,所有字符均可见/正常显示。刚才我找到了解决问题的新方法。我使用“另存为utf-8”的方法代替“转换为utf-8”的编码。由于不需要使用
FileSystemObject
,所以这样做更容易,代码也更短。只需将我的代码从
i=11
放到
循环
流之间。打开
流。关闭
。但无论如何,再次感谢您的回复@Remy
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