我正在尝试将Web应用程序从Windows 2008 vps迁移到专用的Windows 2008 vps(均为32位版本)。我注意到的问题(我现在已经与它斗争了超过24小时)是大多数文本以乱码形式出现(这会破坏所有应用程序)。该应用程序的工作方式如下:(html + js) - > php - > vb6 dll - >回复。
最初我认为它必须是编码和iis的问题,但我认为情况并非如此。我把问题缩小到了这个范围:
当调用.dll的函数时,首先解析函数的字符串参数并将其转换为适当格式的vb6:
Public Function getCorrectStringNoTrans(ByVal strWord As String) As String
If strWord <> "" Then
If isUTF8 = False Then
strWord = Trim$(strWord)
Else
Open "c:\log.txt" For Output As #1
Dim lol As Integer
For lol = 1 To Len(strWord)
Print #1, "bef:" & lol & ":" & Mid$(strWord, lol, 1) & ":" & AscW(Mid$(strWord, lol, 1)) & ":" & Asc(Mid$(strWord, lol, 1))
Next lol
strWord = StrConv(strWord, vbFromUnicode)
For lol = 1 To Len(strWord)
Print #1, "aft:" & lol & ":" & Mid$(strWord, lol, 1) & ":" & AscW(Mid$(strWord, lol, 1)) & ":" & Asc(Mid$(strWord, lol, 1))
Next lol
inData = strWord
Dim c As New crc
Dim lll As Long
lll = UBound(inData)
Print #1, c.CRC32(inData, lll)
Close #1
strWord = Trim$(ConvertUtf8BytesToString(inData))
'''strWord = Replace$(Trim$(ConvertUtf8BytesToString(inData)), "\'", "'")
End If
End If
getCorrectStringNoTrans = strWord
End Function
因此,在实时机器1(当前工作正常)中,特定字符串的输出是(最后一个数字是crc检查):
bef:1:Ξ:926:206
bef:2:Ί:906:186
bef:3:Ξ:926:206
bef:4:±:177:177
bef:5:Ξ:926:206
bef:6:»:187:187
bef:7:Ο:927:207
bef:8::140:140
bef:9:Ο:927:207
bef:10:‚:8218:130
aft:1:?:-17714:63
aft:2:?:-20018:63
aft:3:?:-17458:63
aft:4:?:-29489:63
aft:5:?:-32049:63
1958248078
但是在新机器中输出是:
bef:1:Ξ:926:206
bef:2:Ί:906:186
bef:3:Ξ:926:206
bef:4:±:177:177
bef:5:Ξ:926:206
bef:6:»:187:187
bef:7:Ο:927:207
bef:8::140:140
bef:9:Ο:927:207
bef:10:‚:8218:130
aft:1:?:16191:63
aft:2:?:-20161:63
aft:3:?:-17601:63
aft:4:?:16191:63
aft:5:?:-32193:63
523875602
所以ascw()显示字符串在我尝试迁移到新机器中的strconv()之后搞砸了。
我已经对控制面板中的设置进行了三重检查 - &gt; BOTH机器中的区域和语言选项以及所有设置都是相同的:
格式标签:当前格式:希腊
位置标签:当前位置:希腊
管理选项卡:非unicode程序的语言:greek
然后我认为这可能是SP2的一个问题,因为正常工作的机器是sp2,而我正在试验的这个是sp1,所以我更新但是唉,没有结果。
我不明白为什么strconv()不能正常工作。也许我在设置或安装中遗漏了一些东西。任何想法都将受到高度赞赏。
P.S。它也可以在带有iis5的windows xp开发机器上正常工作。
答案 0 :(得分:1)
你似乎误解了编码。如果你通过COM传递一个字符串,那么它已经是未编码的和“原始”unicode(UCS-2)字符串。 如果您使用UTF-8传递,则不能将其存储在字符串中,直到它被解码,否则它将被破坏。 您必须将非ANSI数据作为字节数组读取并根据需要进行解码。
VB6也没有UTF-8的原生支持。带有StrConv()
和vbUnicode
的{{1}}正在将包含ANSI / MBCS数据的字节数组转换为UCS-2中的VB字符串。
总之,假设您通过COM正确传递字符串,那么整个函数可以替换为vbFromUnicode
。
答案 1 :(得分:0)
尽管事实上我已经将语言用于非unicode程序设置为希腊语(代码页1032链接:http://msdn.microsoft.com/en-us/goglobal/bb964664.aspx),但两者都是:
Private Declare Function GetThreadLocale Lib "kernel32" () As Long
Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long
由于未知原因,请在该特定框中返回1033(美国英语)。在活动框中,尽管它是相同的操作系统和设置,但没有这样的问题
所以我所做的就是改变:
strWord = StrConv(strWord, vbFromUnicode)
到
strWord = StrConv(strWord, vbFromUnicode, 1032)
现在有效。