0

WebアプリケーションをWindows2008vpsから専用のWindows2008vps(両方とも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

したがって、ライブマシン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であり、実験しているこのマシンがsp1であったため、SP2の問題である可能性があると考えました。更新しましたが、残念ながら結果はありません。

strconv()が正常に機能しない理由がわかりません。設定やインストールに何かが足りないのかもしれません。任意のアイデアをいただければ幸いです。

psiis5を搭載したWindowsXP開発マシンでも正しく動作します。

4

2 に答える 2

1

エンコーディングを誤解しているようです。COMを介して文字列が渡された場合、その文字列はすでにエンコードされておらず、「生の」Unicode(UCS-2)文字列になっています。UTF-8で渡されている場合は、デコードされるまで文字列に格納できません。そうしないと、破損します。非ANSIデータをバイト配列として読み取り、必要に応じてデコードする必要があります。

VB6は、UTF-8をネイティブでサポートしていません。StrConv()を使用してvbUnicodevbFromUnicodeANSI/MBCSデータを含むバイト配列をUCS-2のVB文字列に変換しています。

要約すると、COMを介して文字列が正しく渡されていると仮定すると、関数全体を。に置き換えることができますTrim$()

于 2013-02-15T11:15:10.670 に答える
0

非ユニコードプログラムの言語をギリシャ語に設定したにもかかわらず(コードページ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(米国英語)を返します。ライブボックスでは、同じOSと設定であるにもかかわらず、そのような問題はありません

だから私がしたことはからの変更です:

strWord = StrConv(strWord, vbFromUnicode)

strWord = StrConv(strWord, vbFromUnicode, 1032)

そしてそれは今動作します。

于 2013-02-15T12:41:54.663 に答える