StrConv()损坏Windows 2008服务器上的字符串

时间:2013-02-15 10:48:03

标签: encoding character-encoding vb6 windows-server-2008 codepages

我正在尝试将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开发机器上正常工作。

2 个答案:

答案 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)

现在有效。