Excel到XML的法语单词编码问题
我已经在这里找到了用一些法语单词编码的部分解决方案 然而!很少有角色出现问题,我也不明白为什么。我曾经尝试过用单独的VBA脚本直接复制这个有问题的单词和这些字符,这很好,这对我来说是一个真正的谜 用我复杂的翻译代码(),在excel表格中,我有Français,在XML中,然后是错误的表达FrançaisExcel到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
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编写。然后在这里发回麻烦的代码,而不是一些实际有效的代码片段