0

Я пытаюсь перенести веб-приложение из Windows 2008 vps в выделенный vps Windows 2008 (как 32-разрядная версия). Проблема, которую я заметила (и я с ней сражаюсь более 24 часов), состоит в том, что большая часть текста приходит в искаженном виде (и это разрушает все приложение). приложение работает следующим образом: (html + js) -> php -> vb6 dll -> reply.Струнные строки StrConv() на сервере Windows 2008

Первоначально я думал, что это проблема с кодировкой и 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 программ: греческий

Тогда я подумал, что, возможно, это проблема с пакетом обновления 2, потому что правильно работает машина была sp2, и этот я experime nting был sp1, поэтому я обновил, но, увы, никаких результатов.

Я не понимаю, почему strconv() не работает должным образом. Может быть, мне что-то не хватает в настройках или установке. Любые идеи будут высоко оценены.

p.s. он также корректно работает в машине разработки Windows XP с iis5.

+0

Кроме того, проверьте «Option Explicit» и убедитесь, что вы объявили все свои переменные. – Deanna

ответ

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 (США английский) в данном конкретном окне по причинам UNKNOWN. В живой коробке нет таких проблем, несмотря на его та же ОС и настройки

Так что я сделал это изменение от:

strWord = StrConv(strWord, vbFromUnicode) 

в

strWord = StrConv(strWord, vbFromUnicode, 1032) 

и он работает в настоящее время.

1

Вы, кажется, неправильно понимаете кодировку. Если вы передаете строку через COM, то она уже будет незакодированной и «сырой» unicode (UCS-2). Если вы переданы в UTF-8, вы НЕ можете хранить его в строке до тех пор, пока он не будет декодирован, иначе он будет поврежден. Вы должны читать данные без ANSI в виде массива байтов и, при необходимости, декодировать.

У VB6 также нет встроенной поддержки UTF-8. StrConv() с vbUnicode и vbFromUnicode преобразуют между байтовыми массивами, содержащими данные ANSI/MBCS, в строки VB в UCS-2.

Таким образом, если вы правильно передаете строки через COM, тогда вся функция может быть заменена на Trim$().

+0

, как вы можете видеть из моего кода после strconv(), я использую ConvertUtf8BytesToString(), взятый отсюда: http://www.nonhostile.com/howto-convert-byte-array-utf8-string-vb6.asp это не так. Если то, что вы сказали, было проблемой, оно не будет работать больше года ... – MIrrorMirror

+0

У меня нет проблем с нашим текущим сервером Windows Server 2008 (Windows Server 2008), он работает как шарм, strconv() производит разные результаты в новой машине, я пытаюсь настроить ее ... – MIrrorMirror

+0

Это не работает, она будет развращать строки в разных локалях. Только англо-американские локали будут «работать» полностью. Ваш код выполняет: 1) преобразование из строки VB6/UCS-2 в MBCS с локальной кодовой страницей (вероятность повреждения, это небезопасно); 2) преобразование строки MBCS из UTF-8 (а это не так) к строке VB6/UCS-2 (гарантированное повреждение, независимо от кодовой страницы). 'StrConv()' преобразуется в/из локальной кодовой страницы в MBCS, поэтому будет давать разные результаты в разных кодовых файлах. – Deanna

Смежные вопросы