Как кодирование/локализация сообщения об ошибке DLL обрабатывается в приложении VB6?

(ОБНОВЛЕНО: этот вопрос будет обновлен после лучшего понимания того, что происходит, я удалил шумные неправильные части.)

Этот фрагмент кода принадлежит 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.

Чем объясняется разница? И, возможно, есть ли способ установить независимость этой выходной платформы?

(И да, это устаревший код, который скоро умрет.)


person Amessihel    schedule 02.07.2021    source источник
comment
Windows использует UTF-16, а не UTF-8. WinHttpRequest, будучи COM-объектом, должен работать в BSTR/OLESTRING, которые являются исключительно UTF-16 без опции Ansi. Итак, первый вопрос будет касаться проверки с помощью NotePad++ и значения, которое вы ей придаете. И второй вопрос: в чем на самом деле ваш вопрос? Вы описали ситуацию, но не задали вопрос.   -  person GSerg    schedule 02.07.2021
comment
@GSerg действительно, я слишком быстро предположил реальную кодировку этих строк, играя с опцией кодирования браузера, я понял кодировку. Мой вопрос был изложен в заголовке. Я добавил еще один в конце его тела.   -  person Amessihel    schedule 02.07.2021
comment
Сообщение генерирует не VB6, а WinHttpRequest. Скорее всего, он имеет локализованные ресурсы или подключается к стандартным кодам ошибок и сообщениям Windows, которые также локализованы. Все это детали реализации, которые могут быть изменены в любой момент. Ваша программа VB6 не должна зависеть от этого. Если вы хотите осмысленно обработать ошибку, исследуйте код ошибки, а не сообщение.   -  person GSerg    schedule 02.07.2021
comment
@GSerg, я не имел в виду, что это сам VB6 генерирует сообщение. Мне было интересно узнать об обработке кодировки локализации. Настоящей проблемой была кодировка, а не само сообщение. Главное, что я понял из вашего комментария, это то, что даже кодировка может отличаться от версии Windows к другой. Спасибо.   -  person Amessihel    schedule 02.07.2021
comment
Нет, кодировка не меняется. VB6 и COM используют Unicode UTF-16, так что всегда так. L'URL можно закодировать в UTF-16 точно так же, как и L’URL.   -  person GSerg    schedule 02.07.2021
comment
Проблема не в самих строках, а в том, как эти строки кодируются для отображения в HTML. Это происходит отдельно от показанного кода. Есть ли причина, по которой вы не кодируете свои HTML-страницы в UTF-8 вместо использования Windows-xxxx или ISO-8859-x?   -  person Remy Lebeau    schedule 02.07.2021
comment
@GSerg, разве кодовые точки UTF-16 не минимум из 2 байтов?   -  person Amessihel    schedule 02.07.2021
comment
@Amessihel Они действительно есть.   -  person GSerg    schedule 02.07.2021
comment
@GSerg, поэтому я могу сказать, что обе выходные строки не закодированы с помощью UTF-16. (обновляю свой вопрос)   -  person Amessihel    schedule 02.07.2021
comment
@Amessihel Err.Description находится в UTF-16 просто потому, что все экземпляры String в VB6 такие. Что происходит с этими данными UTF-16, если вы передаете их различным механизмам ввода-вывода, это другая история.   -  person GSerg    schedule 02.07.2021
comment
@RemyLebeau, да, причина кроется в этом: это устаревший код, который скоро умрет. :-) Я сказал в теле, что это не проблема, связанная с генерацией ASP HTML, но я ошибался. Вопрос обновлен.   -  person Amessihel    schedule 02.07.2021
comment
@GSerg, да, я говорил не о внутреннем представлении String переменных, а о том, что происходит на выходе (спасибо за ссылку на другую историю).   -  person Amessihel    schedule 02.07.2021
comment
@Amessihel То, что происходит на выходе, полностью отделено от того, что Windows дает вам в виде сообщения об ошибке, как отметил Реми Лебо. VB6 дает вам UTF-16, затем вы указываете любую кодировку, которую вы хотите для своего вывода HTML, и если вы этого не сделаете, вы получите какой-то дефолт.   -  person GSerg    schedule 02.07.2021
comment
@Amessihel Чтобы вывести HTML как UTF-8, установите Response.CodePage = 65001 и Response.CharSet = "UTF-8".   -  person Remy Lebeau    schedule 02.07.2021
comment
@RemyLebeau, я пробовал со своей стороны Response.charset ="windows-1252", и это сработало. Насколько я понимаю, 1) Response.charset по умолчанию является Windows-1252 на машине 1 и ISO-8859-1 на машине 2, и 2) апостроф сообщения об ошибке тоже был изменен?   -  person Amessihel    schedule 02.07.2021
comment
@GSerg, спасибо, кажется, я понял. Кстати, два первых шестнадцатеричных дампа были выполнены с копированием/вставкой текста из TextBox в консоль Cygwin, я полагаю, что строки выводятся в UTF-8 в содержимом графического интерфейса на машине 2 (с апострофом, закодированным тремя байтами)?   -  person Amessihel    schedule 03.07.2021
comment
@Amessihel Почему бы вам не настроить Session/Response для вывода в формате UTF-8 на всех машинах и просто покончить с этим? Session.LCID влияет на форматирование чисел/валют, тогда как (Session|Response).CodePage влияет на кодировку символов. (Session|Response).Charset просто сообщает браузеру, какая кодировка используется.   -  person Remy Lebeau    schedule 03.07.2021
comment
@RemyLebeau, мы имеем дело с большим количеством контента, закодированного с помощью Windows-1252.   -  person Amessihel    schedule 03.07.2021
comment
@GSerg, я добавляю ответ сообщества, объяснение того, почему я получаю строку UTF-8 при копировании текста из текстовых полей VB6, совпадает с механизмами ввода-вывода?   -  person Amessihel    schedule 03.07.2021
comment
@ Амессихель Да. В то время как VB6 Strings являются Unicode, элементы управления VB6 нет. Сами текстовые поля не имеют юникода и также хранят текст в буфере обмена в кодовой странице ANSI машины. Ввод Unicode String в текстовое поле запускает преобразование ввода-вывода. Однако вы не получите из этого UTF-8, только текущую кодовую страницу ANSI машины (язык для программ, отличных от Unicode).   -  person GSerg    schedule 03.07.2021
comment
Не может быть, поддержка UTF-8 для программ, отличных от Unicode, находится в стадии бета-тестирования и недоступна в Windows 2012. , не говоря уже о Windows 2008. Каков полный путь, который проходит этот фрагмент текста, прежде чем вы проверите, что это UTF-8?   -  person GSerg    schedule 03.07.2021
comment
@GSerg, вы правы, я видел в некоторых тестах, что не могу полагаться на сохранение кодировки при копировании в консоль Cygwin, преобразование в UTF-8 выполняется несколько систематически. Спасибо!   -  person Amessihel    schedule 03.07.2021
comment
@RemyLebeau, просто для ясности: весь сайт содержит как статический, так и динамический контент. Кроме того, у меня нет полного контроля над ним. Вот почему мне нужно, чтобы весь контент был закодирован в Windows-1252, чтобы сохранить согласованность.   -  person Amessihel    schedule 03.07.2021
comment
Чем больше я думаю об этом вопросе, тем больше думаю, не следует ли его удалить, он не будет полезен для дальнейших читателей... Это не вопрос хорошего качества.   -  person Amessihel    schedule 03.07.2021


Ответы (1)


После расширенного обсуждения в разделе комментариев с Реми Лебо и GSerg, вот ключи к пониманию различий:

  • String are handled in UTF-16 by VB6, but the way they are output depends on the context
  • Сообщения об ошибках могут различаться в зависимости от реализации (что может объяснить, почему апостроф изменился с L'URL на L’URL).
person Community    schedule 02.07.2021