Классический ASP - Как преобразовать строку UTF-8 в UCS-2?

comment Require local с httpd.conf

"# Require local"

10
задан dda 13 July 2012 в 09:02
поделиться

2 ответа

Encoding.UTF8 и Encoding.Unicode обеспечат достаточную функциональность. Для получения дополнительной информации см. Википедию

-4
ответ дан 3 December 2019 в 14:11
поделиться

Я подозреваю, что вы столкнулись с проблемой несоответствия кодировки символов в классической форме.

Это выглядит следующим образом: -

  • У вас есть форма, которая представляется клиенту с помощью кодировка UTF-8.
  • В результате браузер публикует текстовые значения, введенные в форму с использованием кодировки UTF-8.
  • Страница действия, получающая сообщение, имеет свой Response.Codepage, установленный на типичную кодовую страницу OEM, например 1252.
  • Каждый байт отправленной строки UTF-8 обрабатывается сервером как отдельный символ, а не декодируется набор байтов, закодированных в UTF-8, в правильный символ Unicode.
  • Строка сохраняется в базе данных с теперь поврежденными символами.
  • Страница желает представить клиенту содержимое поля БД, содержащего поврежденные символы.
  • Страница устанавливает для него CharSet значение UTF-8, но его ответ. CodePage остается на кодовой странице OEM, такой как 1252.
  • Response.Write используется для отправки содержимого поля клиенту, символы Unicode преобразуются обратно в байт для набора байтов, который был получен в более раннем сообщении.
  • Клиент думает, что получает UTF-8, поэтому он декодирует символы, полученные от сервера, как UTF-8, как они были изначально, поэтому они отображаются на экране правильно.
  • Все идет нормально, как будто все в порядке, пока эти символы просто отображаются отскакивал туда-сюда через ASP. Ошибка на одной странице имеет соответствующую ошибку на другой (может быть той же самой страницей), из-за чего все выглядит нормально.

Если вы исследуете содержимое поля напрямую с помощью инструментов сервера SQL, вы, вероятно, увидите там поврежденные строки. Теперь, когда вы хотите использовать эту строку с другим компонентом, который ожидает прямую строку Unicode, именно здесь вы обнаружите эту ошибку.

Решение состоит в том, чтобы всегда гарантировать, что все ваши страницы не только отправляют CharSet = "UTF-8" в ответе, но также используйте Response.CodePage = 65001 перед использованием Response.Write и перед попыткой чтения любых значений Request.Form. Используйте директиву Codepage в заголовке <% @ page.

Теперь вам осталось восстановить поврежденные строки, уже имеющиеся в вашей БД.

Используйте ADODB.Stream:-[1234 impressionThis function (which BTW is the answer to ваш фактический вопрос) принимает поврежденную строку (ту, которая имеет байтовое представление байта) и преобразует ее в строку, которой она должна была быть. Вам нужно применить это преобразование к каждому полю в БД, которое стало жертвой ошибки.

в ответе, но также используйте Response.CodePage = 65001 перед использованием Response.Write и перед попыткой чтения любых значений Request.Form. Используйте директиву Codepage в заголовке <% @ page.

Теперь вам осталось восстановить поврежденные строки, уже имеющиеся в вашей БД.

Используйте ADODB.Stream:-[1234 impressionThis function (which BTW is the answer to ваш фактический вопрос) принимает поврежденную строку (ту, которая имеет байтовое представление байта) и преобразует ее в строку, которой она должна была быть. Вам нужно применить это преобразование к каждому полю в БД, которое стало жертвой ошибки.

в ответе, но также используйте Response.CodePage = 65001 перед использованием Response.Write и перед попыткой чтения любых значений Request.Form. Используйте директиву Codepage в заголовке <% @ page.

Теперь вам осталось восстановить поврежденные строки, уже имеющиеся в вашей БД.

Используйте ADODB.Stream:-[1234 impressionThis function (which BTW is the answer to ваш фактический вопрос) принимает поврежденную строку (ту, которая имеет байтовое представление байта) и преобразует ее в строку, которой она должна была быть. Вам нужно применить это преобразование к каждому полю в БД, которое стало жертвой ошибки.

-

Function ConvertFromUTF8(sIn)

    Dim oIn: Set oIn = CreateObject("ADODB.Stream")

    oIn.Open
    oIn.CharSet = "WIndows-1252"
    oIn.WriteText sIn
    oIn.Position = 0
    oIn.CharSet = "UTF-8"
    ConvertFromUTF8 = oIn.ReadText
    oIn.Close

End Function

Эта функция (которая, кстати, является ответом на ваш настоящий вопрос) принимает поврежденную строку (ту, которая имеет байтовое представление байта) и преобразует ее в строку, которой она должна была быть. Вам нужно применить это преобразование к каждому полю в БД, которое стало жертвой ошибки.

-

Function ConvertFromUTF8(sIn)

    Dim oIn: Set oIn = CreateObject("ADODB.Stream")

    oIn.Open
    oIn.CharSet = "WIndows-1252"
    oIn.WriteText sIn
    oIn.Position = 0
    oIn.CharSet = "UTF-8"
    ConvertFromUTF8 = oIn.ReadText
    oIn.Close

End Function

Эта функция (которая, кстати, является ответом на ваш настоящий вопрос) принимает поврежденную строку (ту, которая имеет байтовое представление байта) и преобразует ее в строку, которой она должна была быть. Вам нужно применить это преобразование к каждому полю в БД, которое стало жертвой ошибки.

40
ответ дан 3 December 2019 в 14:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: