【问题标题】:Excel data to XML makes wrong characters with French wordsExcel 数据到 XML 使用法语单词生成错误字符
【发布时间】:2017-06-23 12:51:51
【问题描述】:

我有测试脚本(XML 格式),我需要翻译(来自 Excel 表)。我正在从该 Excel 表中搜索英文单词,然后将它们翻译成德语、法语和意大利语。我对法语单词有疑问。

我在 VBA 中使用宏。当我在法语中为英语找到相应的单词时,我正在使用 function Find。当我在 Excel 工作表中找到法语单词时,我只是将 int 保存到 String 中。

代码

If intChoice <> 0 Then

strPath = Application.FileDialog( _
msoFileDialogOpen).SelectedItems(1)

Dim strFolderPath As String
strFolderPath = Left(strPath, Len(strPath) - 4)
Set fGermanOutputFile = fso.CreateTextFile((strFolderPath & "_German.xml"))
Set fItalianOutputFile = fso.CreateTextFile((strFolderPath & "_Italian.xml"))
Set fFrenchOutputFile = fso.CreateTextFile((strFolderPath & "_French.xml"))

    Open strPath For Input As #1


Do Until EOF(1)
    Line Input #1, strLine

    intLastFoundChar = 0

    strGermanLine = ""
    strFrenchLine = ""
    strItalianLine = ""

    For intI = 0 To (UBound(ArrStrOpeningTags, 1) - 1)

        intFoundString = InStr(strLine, ArrStrOpeningTags(intI))
        If intFoundString <> 0 Then
            intI = 3
        End If

    Next intI

    If intFoundString <> 0 Then

        For intJ = 0 To (UBound(ArrStrParamsToReplace) - 1)


            strLine = Right(strLine, Len(strLine) - intLastFoundChar)

            strStringToLookFor = (ArrStrParamsToReplace(intJ) & "=""")

            intFoundString = InStr(1, strLine, strStringToLookFor, vbBinaryCompare)

            If intFoundString <> 0 Then
                intStringSplitIndex = (intFoundString + Len(strStringToLookFor))

                strStringToLookFor = Right(strLine, Len(strLine) - intStringSplitIndex + 1)


                strDummyString = Left(strLine, intStringSplitIndex - 1)
                strGermanLine = strGermanLine & strDummyString
                strFrenchLine = strFrenchLine & strDummyString
                strItalianLine = strItalianLine & strDummyString

                intLastFoundChar = intLastFoundChar + intStringSplitIndex


                intFoundString = InStr(strStringToLookFor, """")

                If intFoundString <> 0 Then

                    strStringToLookFor = Left(strStringToLookFor, intFoundString - 1)


                    Set rngFoundString = rngEnglishDictionary.Find(strStringToLookFor)


                    If (rngFoundString Is Nothing) Then
                        Debug.Print "String " & strStringToLookFor & " not found!"


                        strGermanLine = strGermanLine & strStringToLookFor & """"
                        strFrenchLine = strFrenchLine & strStringToLookFor & """"
                        strItalianLine = strItalianLine & strStringToLookFor & """"
                    Else

                        intWordToReplaceIndex = rngEnglishDictionary.Find(strStringToLookFor).Row - rngEnglishDictionary.Row + 1


                        strGermanLine = strGermanLine & rngGermanDictionary(intWordToReplaceIndex) & """"
                        strFrenchLine = strFrenchLine & rngFrenchDictionary(intWordToReplaceIndex) & """"
                        strItalianLine = strItalianLine & rngItalianDictionary(intWordToReplaceIndex) & """"
                    End If

                    intLastFoundChar = intLastFoundChar + Len(strStringToLookFor)
                End If
            End If

        Next intJ               

    Else

    strGermanLine = strLine
    strFrenchLine = strLine
    strItalianLine = strLine

    End If                       

    fGermanOutputFile.WriteLine (strGermanLine & vbCrLn)
    fFrenchOutputFile.WriteLine (strFrenchLine & vbCrLn)
    fItalianOutputFile.WriteLine (strItalianLine & vbCrLn)

    strGermanLine = ""
    strFrenchLine = ""
    strItalianLine = ""         
Loop
End If

【问题讨论】:

  • 欢迎来到本站!你可以发布代码吗?好introduction is here
  • 非常感谢...因为我真的迷路了。我是 VBA 新手,甚至这段代码对我来说也很难。现在我不知道如何处理这个编码问题。顺便说一句,我怎么能把 IMAGE 直接放在这里? (一位版主在我之前的第一篇文章中更改了它)
  • 乐于助人。乍一看,你在哪里使用 rngFrenchDictionary 会是重点关注的地方吗?这本字典是否调用任何外部组件? windows-1552 是许多旧组件的默认编码。你能举一个字符输出不正确的例子吗?
  • @JimmySmith 你能打开我发布的图片上的链接吗?作为新成员,我只能发布链接...有一个错误解释的例子
  • @JimmySmith rngFrenchDictionary 实际上是 Excel 表中的 .Range 类型,定义为 G9:G1000 并且当我知道行数 (intWordToReplaceIndex) 时,我将此单元格中的字符串放入字符串 strFrenchLine。屏幕截图上的错误单词是“Très élevée”

标签: xml excel vba utf-8 character-encoding


【解决方案1】:

默认情况下,CreateTextFile 以 ASCII 编码创建文件。为了让它保存为 UTF-8,我们必须在创建文本文件时设置它,

Set fGermanOutputFile = fso.CreateTextFile((strFolderPath & "_German.xml"), True, True)
Set fItalianOutputFile = fso.CreateTextFile((strFolderPath & "_Italian.xml"), True, True)
Set fFrenchOutputFile = fso.CreateTextFile((strFolderPath & "_French.xml"), True, True)

第一个是你的文件名,第二个参数是 True 表示“覆盖”,第三个参数是 True 表示使用“Unicode”与“ASCII”。 According to this

【讨论】:

  • 非常感谢您,先生!它现在正在工作!你都不知道我现在有多开心!
猜你喜欢
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多