0

我正在尝试将 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() 之后变得混乱。

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

格式选项卡:当前格式:希腊语

位置标签:当前位置:希腊

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

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

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

ps它也可以在带有iis5的windows xp开发机器中正常工作。

4

2 回答 2

1

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

VB6 也没有对 UTF-8 的原生支持。StrConv()withvbUnicodevbFromUnicode正在将包含 ANSI/MBCS 数据的字节数组转换为 UCS-2 中的 VB 字符串。

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

于 2013-02-15T11:15:10.670 回答
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(美国英语)。在 live box 中没有这样的问题,尽管它是相同的操作系统和设置

所以我所做的是改变:

strWord = StrConv(strWord, vbFromUnicode)

strWord = StrConv(strWord, vbFromUnicode, 1032)

现在可以了。

于 2013-02-15T12:41:54.663 回答