Ответ 1
Мое подозрение заключается в том, что вы падаете на ошибку классической формы сообщения о несоответствии кодировки символов.
Это выглядит следующим образом: -
- У вас есть форма, которая предоставляется клиенту с использованием кодировки UTF-8.
- В результате браузер вводит текстовые значения, введенные в форму с использованием кодировки UTF-8.
- Страница действия, получающая сообщение, имеет свой ответ. Кодовая страница установлена на типичную кодовую страницу OEM, такую как 1252.
- Каждый байт опубликованной строки UTF-8 обрабатывается сервером как отдельный символ, а не декодирует наборы кодированных байтов UTF-8 для правильного символа Юникода.
- Строка хранится в БД с уже поврежденными символами.
- Страница желает представить клиенту содержимое поля БД, содержащее поврежденные символы.
- Страница устанавливает CharSet в UTF-8, но его Response.CodePage остается на кодовой странице OEM, например 1252.
- Response.Write используется для отправки содержимого поля клиенту, символы юникода преобразуются обратно в байты для набора байтов, как было получено в сообщении ealier.
- Клиент считает, что он получает UTF-8, следовательно, он декодирует символы, полученные с сервера, как UTF-8, так как они были изначально, поэтому они отображаются на экране правильно.
- Все идет отлично, как будто все в порядке, в то время как эти символы просто отскакивают назад и вперед через ASP. У ошибки на одной странице есть соответствующая ошибка в другой (может быть одна и та же страница), которая заставляет все выглядеть нормально.
Если вы изучите содержимое поля непосредственно с помощью инструментов SQL Server, вы, скорее всего, увидите поврежденные строки. Теперь, когда вы хотите использовать эту строку с другим компонентом, который ожидает строку прямого кода unicode, вы обнаружите эту ошибку.
Решение состоит в том, чтобы всегда гарантировать, что все ваши страницы не только отправят CharSet = "UTF-8" в ответ, но также используют Response.CodePage = 65001 перед использованием Response.Write и перед попыткой прочитать любые значения Request.Form. Используйте директиву Codepage в заголовке <% @page.
Теперь вы можете восстановить поврежденные строки уже в своей базе данных.
Используйте 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
Эта функция (которая BTW является ответом на ваш реальный вопрос) принимает поврежденную строку (та, которая имеет байтовое представление байта) и преобразуется в строку, которая должна была быть. Вам необходимо применить это преобразование к каждому полю в БД, который стал жертвой ошибки.