Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel到XML的法语单词编码问题_Xml_Excel_Vba_Encoding_French - Fatal编程技术网

Excel到XML的法语单词编码问题

Excel到XML的法语单词编码问题,xml,excel,vba,encoding,french,Xml,Excel,Vba,Encoding,French,我已经在这里找到了用一些法语单词编码的部分解决方案 然而!很少有角色出现问题,我也不明白为什么。我曾经尝试过用单独的VBA脚本直接复制这个有问题的单词和这些字符,这很好,这对我来说是一个真正的谜 用我复杂的翻译代码(),在excel表格中,我有Français,在XML中,然后是错误的表达Français If intChoice <> 0 Then strPath = Application.FileDialog( _ msoFileDialogOpen).SelectedIt

我已经在这里找到了用一些法语单词编码的部分解决方案

然而!很少有角色出现问题,我也不明白为什么。我曾经尝试过用单独的VBA脚本直接复制这个有问题的单词和这些字符,这很好,这对我来说是一个真正的谜

用我复杂的翻译代码(),在excel表格中,我有Français,在XML中,然后是错误的表达Français

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"), True, True)
Set fItalianOutputFile = fso.CreateTextFile((strFolderPath & "_Italian.xml"), True, True)
Set fFrenchOutputFile = fso.CreateTextFile((strFolderPath & "_French.xml"), True, True)

Open strPath For Input As #1

AlarmString = "RESETNoTranslation"

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

    AllLine = strLine

    Alarm = InStr(1, strLine, AlarmString)

    intLastFoundChar = 0

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

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

        intFoundString = InStr(strLine, ArrStrOpeningTags(intI))

        If intFoundString <> 0 Then
            intI = 4
        End If

    Next intI

    If ((intFoundString <> 0) And (Alarm = 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  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

        If intJ = 2 Then
            strEndOfLine = Right(AllLine, Len(AllLine) - intLastFoundChar)
            strGermanLine = strGermanLine & strEndOfLine
            strFrenchLine = strFrenchLine & strEndOfLine
            strItalianLine = strItalianLine & strEndOfLine
        End If

    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   
End Sub
工作正常的代码

Sub EncodingRepair()

Dim strLine As String
Dim strPath As String

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

Dim strFolderPath As String

strFolderPath = "C:\Users\zema\Documents\"

Set fOutputFile = fso.CreateTextFile(strFolderPath & "EncodingRepair.xml", True)

strLine = ThisWorkbook.Worksheets("wording").Range("G16").Text

fOutputFile.WriteLine (strLine & vbCrLn)

End Sub
这里唯一的区别是加载字符串。。。在这段小代码中,我从直接单元格加载文本(仅供尝试),在我的复杂代码中,我从.Range对象加载文本,我将find.Row

我在最后几个词上遇到问题的复杂代码

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"), True, True)
Set fItalianOutputFile = fso.CreateTextFile((strFolderPath & "_Italian.xml"), True, True)
Set fFrenchOutputFile = fso.CreateTextFile((strFolderPath & "_French.xml"), True, True)

Open strPath For Input As #1

AlarmString = "RESETNoTranslation"

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

    AllLine = strLine

    Alarm = InStr(1, strLine, AlarmString)

    intLastFoundChar = 0

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

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

        intFoundString = InStr(strLine, ArrStrOpeningTags(intI))

        If intFoundString <> 0 Then
            intI = 4
        End If

    Next intI

    If ((intFoundString <> 0) And (Alarm = 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  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

        If intJ = 2 Then
            strEndOfLine = Right(AllLine, Len(AllLine) - intLastFoundChar)
            strGermanLine = strGermanLine & strEndOfLine
            strFrenchLine = strFrenchLine & strEndOfLine
            strItalianLine = strItalianLine & strEndOfLine
        End If

    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   
End Sub
如果选择0,则
strPath=Application.FileDialog(_
msoFileDialogOpen)。选择编辑项(1)
将strFolderPath设置为字符串
strFolderPath=Left(strPath,Len(strPath)-4)
设置fGermanOutputFile=fso.CreateTextFile((strFolderPath&“_derman.xml”),True,True)
设置fItalianOutputFile=fso.CreateTextFile((strFolderPath&“_意大利语.xml”),True,True)
Set-fFrenchOutputFile=fso.CreateTextFile((strFolderPath&“_French.xml”),True,True)
打开strPath作为#1输入
AlarmString=“ResetNotTranslation”
直到EOF(1)为止
行输入#1,strLine
AllLine=strLine
报警=仪表(1,strLine,报警字符串)
intLastFoundChar=0
strGermanLine=“”
strfrechline=“”
strItalianLine=“”
对于intI=0到(UBound(arrstOpeningTags,1)-1)
intFoundString=InStr(strLine,ArrStrOpeningTags(intI))
如果intFoundString为0,则
intI=4
如果结束
下一个因蒂
如果((intFoundString 0)和(Alarm=0)),则
对于intJ=0到(uBond(ArrStrParamsToReplace)-1)
strLine=Right(strLine,Len(strLine)-intlastfundchar)
strStringToLookFor=(ArrStrParamsToReplace(intJ)和“=”)
intFoundString=InStr(1,strLine,strStringToLookFor,vbBinaryCompare)
如果intFoundString为0,则
intStringSplitIndex=(intFoundString+Len(strStringToLookFor))
strStringToLookFor=右(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,“”)
如果intFoundString 0 strStrStringToLookFor=左(strStringToLookFor,intFoundString-1)
设置rngFoundString=rngEnglishDictionary.Find(strStringToLookFor)
如果(rngFoundString为Nothing),则
调试。打印“字符串”&strStringToLookFor&“未找到!”
strGermanLine=strGermanLine&strStrStringToLookfor&“”
strFrenchLine=strFrenchLine&strStrStringToLookfor&“”
strItalianLine=strItalianLine和strStringToLookFor&“
其他的
intWordToReplaceIndex=rngEnglishDictionary.Find(strStringToLookFor).Row-rngEnglishDictionary.Row+1
strGermanLine=strGermanLine&rngGermanDictionary(intWordToReplaceIndex)&“
strFrenchLine=strFrenchLine&rngFrenchDictionary(intWordToReplaceIndex)和“
strItalianLine=strItalianLine&rngItalianDictionary(intWordToReplaceIndex)和“
如果结束
intLastFoundChar=intLastFoundChar+Len(strStringToLookFor)
如果结束
如果结束
下一个intJ
如果intJ=2,则
strEndOfLine=Right(AllLine,Len(AllLine)-intlastfundchar)
strGermanLine=strGermanLine&strEndOfLine
strFrenchLine=strFrenchLine&strEndOfLine
strItalianLine=strItalianLine和strEndOfLine
如果结束
其他的
strGermanLine=strLine
strFrenchLine=strLine
strItalianLine=strLine
如果结束
fGermanOutputFile.WriteLine(strGermanLine和vbCrLn)
fFrenchOutputFile.WriteLine(strFrenchLine和vbCrLn)
fItalianOutputFile.WriteLine(strItalianLine和vbCrLn)
strGermanLine=“”
strfrechline=“”
strItalianLine=“”
环
如果结束
端接头

您的输入文件不是Unicode而是utf-8,因此
fso TextStream
方法不适用于读取,因为FileSystemObject只知道ASCII和Unicode,而不知道utf-8。对于后者,您需要对Microsoft ActiveX数据对象的引用和ADODB.Stream

下面是一个可以围绕代码构建的示例,该代码使用UTF-8作为输入编码,并将Unicode写入“EncodingRepair.xml”文件:


确保在读写时始终使用正确的编码。

在链接示例中看不到任何Unicode强制执行;这正是您需要做的:将
TriState
属性设置为true:
set fOutputFile=fso.CreateTextFile(strFolderPath&“EncodingRepair.xml”,true)
啊,对不起,我的错误。。。我试着不用它。但不管怎样,它还是奏效了。这在我复杂的代码中根本不起作用。(已编辑)请发布导致错误的代码。我无法重现你在这段代码中遇到的问题。请首先参阅旧帖子:不要为另一个线程中的代码问题创建线程。在这里张贴您的麻烦代码。第二:就像我说的:在
CreateTextFile
行中没有设置
,True
选项。请按照您的建议执行:指定以unicode编写。然后在这里发回麻烦的代码,而不是一些实际有效的代码片段