Encoding StrConv()正在Windows 2008 server上损坏字符串

Encoding StrConv()正在Windows 2008 server上损坏字符串,encoding,character-encoding,vb6,windows-server-2008,codepages,Encoding,Character Encoding,Vb6,Windows Server 2008,Codepages,我正在尝试将web应用程序从windows 2008 vps迁移到专用的windows 2008 vps(均为32位版本)。我注意到的问题(到目前为止,我已经与之斗争了24个多小时)是大部分文本都是乱码形式的(这会破坏所有应用程序)。该应用程序的工作原理如下:(html+js)->php->VB6DLL->reply 起初我认为这一定是编码和iis的问题,但我认为情况并非如此。我把问题缩小到以下几点: 调用.dll函数时,首先解析函数的字符串参数,并将其转换为vb6正确格式: Public Fu

我正在尝试将web应用程序从windows 2008 vps迁移到专用的windows 2008 vps(均为32位版本)。我注意到的问题(到目前为止,我已经与之斗争了24个多小时)是大部分文本都是乱码形式的(这会破坏所有应用程序)。该应用程序的工作原理如下:(html+js)->php->VB6DLL->reply

起初我认为这一定是编码和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
但在新机器中,输出为:

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()之后,字符串变得混乱

我在控制面板->区域和语言选项中检查了三次设置,两台机器中的所有设置都相同:

“格式”选项卡:当前格式:希腊文

位置选项卡:当前位置:希腊

管理选项卡:非unicode程序的语言:希腊文

然后我想这可能是SP2的问题,因为正常工作的机器是SP2,而我正在试验的是sp1,所以我更新了,但可惜没有结果

我不明白strconv()为什么不能正常工作。也许我在设置或安装中遗漏了一些东西。任何想法都将不胜感激


p、 它在带有iis5的windows xp开发机器中也能正常工作。

您似乎误解了编码。如果您通过COM传递了一个字符串,那么它将已经是未编码的“原始”unicode(UCS-2)字符串。 如果在UTF-8中传递,则在解码之前不能将其存储在字符串中,否则它将被损坏。 您必须将非ANSI数据作为字节数组读取,并根据需要进行解码

VB6也没有对UTF-8的本机支持
StrConv()
vbUnicode
vbFromUnicode
在包含ANSI/MBCS数据的字节数组之间转换为UCS-2中的VB字符串


总之,假设通过COM正确地传递字符串,那么整个函数可以替换为
Trim$()

,尽管我已经将非unicode程序的语言设置为希腊文(代码页1032链接:),但这两个函数:

由于未知原因,请将1033(美式英语)返回该特定框中。在live box中,尽管操作系统和设置相同,但没有此类问题

因此,我所做的是改变:

strWord = StrConv(strWord, vbFromUnicode)


现在它可以工作了。

从strconv()之后的代码中可以看出,我使用的是ConvertUtf8BytesToString(),取材于此处:问题不在于此。如果你所说的是问题所在,那么它将不会工作超过一年…我对我们当前的live machine(windows2008)服务器VPS没有问题,它一直在发挥魅力,strconv()在我试图设置的新机器中产生不同的结果…它不工作,它将破坏不同地区的字符串。只有英国/美国地区才能完全“工作”。您的代码正在执行以下操作:1)使用本地代码页将VB6/UCS-2字符串转换为MBCS(可能会损坏,这是不安全的);2)将MBCS字符串从UTF-8(不是UTF-8)转换回VB6/UCS-2字符串(保证损坏,无论代码页如何)
StrConv()
在MBCS中转换为本地代码页或从本地代码页转换为本地代码页,因此会在不同的代码页中产生不同的结果。如果是这样,为什么它在两个框中工作了一年多?(win2008 32位和win xp)。我只是尝试将strword作为字节数组直接传递给ConvertUtf8BytesToString(),没有strconv()的干预,它根本不起作用。因为strword不会是UTF-8。我假设它是作为COM传入的,
ConvertUtf8BytesToString()。您还没有澄清或反驳这一点。另外,请检查
Option Explicit
,并确保您声明了所有变量。
Private Declare Function GetThreadLocale Lib "kernel32" () As Long
Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long
strWord = StrConv(strWord, vbFromUnicode)
strWord = StrConv(strWord, vbFromUnicode, 1032)