(ОБНОВЛЕНО: этот вопрос будет обновлен после лучшего понимания того, что происходит, я удалил шумные неправильные части.)
Этот фрагмент кода принадлежит COM DLL. Для контекста он содержит объект ActiveX, который создается и обрабатывается внутри классической страницы ASP.
Public Function getHttpResponse(url As String)
Dim request As New WinHttpRequest
On Error GoTo errGetHttpResponse
request.Open "HEAD", url
request.Send
getHttpResponse = request.Status
Exit Function
errGetHttpResponse:
getHttpResponse = Err.Description
End Function
Локализация и кодировка строки Err.Description
, по-видимому, зависят от рабочей среды. Для ошибки 80072EE5
я получаю для Err.Description
(получено из графического интерфейса исполняемого файла, загружающего DLL):
- Компьютер 1, Windows 2008 с пакетом обновления 2 (SP2), 32 бита, французский язык:
L'URL n'est pas valide
- Машина 2, Windows 2012 R2 Standard 64 бита, французский язык:
L’URL n’est pas valide
, шестнадцатеричный дамп дает:
Заметно, что апостроф не тот.
Страница ASP, вызывающая и отображающая выходные данные ActiveX, может быть упрощена следующим образом:
Session.LCID=1036 ' French identifier (global.asa file)
Dim o : Set o = CreateObject("TheDLL.TheObject")
Response.Write o.getHttpResponse(anInvalidUrl)
Хотя он отображается правильно при запуске с компьютера 1, с компьютера 2 апостроф скрыт (при просмотре исходного кода в Firefox отображается квадратный символ 00 92
). Сгенерированный HTML из машины 2 воспроизводится ниже:
00000000 4c 92 55 52 4c 20 6e 92 65 73 74 20 70 61 73 20 |L.URL n.est pas |
00000010 76 61 6c 69 64 65 |valide
Апостроф стал кодироваться как 0x92
, что является ПРАВОЙ ОДИНАРНОЙ КАТАЧКОЙ, закодированной в ИСО-8859-1.
Чем объясняется разница? И, возможно, есть ли способ установить независимость этой выходной платформы?
(И да, это устаревший код, который скоро умрет.)
WinHttpRequest
, будучи COM-объектом, должен работать в BSTR/OLESTRING, которые являются исключительно UTF-16 без опции Ansi. Итак, первый вопрос будет касаться проверки с помощью NotePad++ и значения, которое вы ей придаете. И второй вопрос: в чем на самом деле ваш вопрос? Вы описали ситуацию, но не задали вопрос. - person GSerg   schedule 02.07.2021WinHttpRequest
. Скорее всего, он имеет локализованные ресурсы или подключается к стандартным кодам ошибок и сообщениям Windows, которые также локализованы. Все это детали реализации, которые могут быть изменены в любой момент. Ваша программа VB6 не должна зависеть от этого. Если вы хотите осмысленно обработать ошибку, исследуйте код ошибки, а не сообщение. - person GSerg   schedule 02.07.2021L'URL
можно закодировать в UTF-16 точно так же, как иL’URL
. - person GSerg   schedule 02.07.2021Err.Description
находится в UTF-16 просто потому, что все экземплярыString
в VB6 такие. Что происходит с этими данными UTF-16, если вы передаете их различным механизмам ввода-вывода, это другая история. - person GSerg   schedule 02.07.2021String
переменных, а о том, что происходит на выходе (спасибо за ссылку на другую историю). - person Amessihel   schedule 02.07.2021Response.CodePage = 65001
иResponse.CharSet = "UTF-8"
. - person Remy Lebeau   schedule 02.07.2021Response.charset ="windows-1252"
, и это сработало. Насколько я понимаю, 1) Response.charset по умолчанию является Windows-1252 на машине 1 и ISO-8859-1 на машине 2, и 2) апостроф сообщения об ошибке тоже был изменен? - person Amessihel   schedule 02.07.2021Session
/Response
для вывода в формате UTF-8 на всех машинах и просто покончить с этим?Session.LCID
влияет на форматирование чисел/валют, тогда как(Session|Response).CodePage
влияет на кодировку символов.(Session|Response).Charset
просто сообщает браузеру, какая кодировка используется. - person Remy Lebeau   schedule 03.07.2021String
s являются Unicode, элементы управления VB6 нет. Сами текстовые поля не имеют юникода и также хранят текст в буфере обмена в кодовой странице ANSI машины. Ввод UnicodeString
в текстовое поле запускает преобразование ввода-вывода. Однако вы не получите из этого UTF-8, только текущую кодовую страницу ANSI машины (язык для программ, отличных от Unicode). - person GSerg   schedule 03.07.2021