Классический ASP - Как преобразовать строку UTF-8 в UCS-2? - PullRequest
10 голосов
/ 27 мая 2009

У меня проблема с хранением строки UTF-8 в SQL Server как UCS-2. Когда я вытаскиваю его для отображения на странице с типом контента, установленным в UTF-8, он работает нормально. Но у меня есть сторонний компонент Javascript, который, когда я передаю ему строку для базы данных, отображает ее как USC2. Или не UTF8.

Есть ли способ в ASP преобразовать эту строку в UTF-8 после чтения ее из базы данных, чтобы передать ее стороннему компоненту (обфусцированному)?

Надеюсь, это имеет смысл.

Ответы [ 2 ]

40 голосов
/ 28 мая 2009

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

Это выглядит так: -

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

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

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

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

Использовать ADODB.Stream:-

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

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

0 голосов
/ 27 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...