我有一个问题。目前,我研究了如何将.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>
任何知道我的代码中的错误的人都请回答你的问题。我非常感谢你的答案:):))
答案 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