Проблемы с кодировкой в ​​ASP при использовании английских и китайских символов

У меня проблемы с кодировкой китайского языка на сайте ASP. Форматы файлов:

  • translations.txt - UTF-8 (для хранения моих переводов)
  • test.asp — UTF-8 — (для отображения страницы)

test.asp читает файл translations.txt, содержащий следующие данные:

Help|ZH|帮助 
Home|ZH|首页

test.asp разбивается на разделитель канала, и если пользователь содержит файл cookie с ZH, он отобразит этот перевод, иначе он просто вернется к значению ключа.

Теперь я пробовал следующие вещи, которые не сработали:

  1. Добавить метатег

    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>

  2. Установите Response.CharSet = "UTF-8"

  3. Установите Response.ContentType = "text/html"
  4. Установите для Session.CodePage (и Response) значение 65001 (UTF-8)
  5. Я подтвердил, что текст в translations.txt определенно имеет кодировку UTF-8 и не имеет метки порядка следования байтов.
  6. Браузер понимает, что страница имеет кодировку Unicode UTF-8, но на странице отображается абракадабра.
  7. Метод Scripting.OpenTextFile(<file>,<create>,<iomode>,<encoding>) возвращает один и тот же неверный текст независимо от параметра Encoding.

Вот пример того, что я хочу отображать в Китае (ZH):

  • 首页
  • 帮助

Но отображается следующее:

  • 首页
  • 帮助

Это наблюдается во всех протестированных браузерах — Google Chrome, IE 7/8 и Firefox 4. Шрифт определенно имеет китайскую ветвь глифов. Кроме того, у меня установлены восточные языки.

--

Я попытался вставить исходное значение в HTML, и это сработало (но обратите внимание, что это жестко закодированное значение).

  • 首页
  • 首页

Однако это странно.

首页 --(в шестнадцатеричном формате) --> E9 A6 96 E9 A1 --(как символы) --> 首页

Есть идеи, что мне не хватает?


person Dominic Zukiewicz    schedule 06.06.2011    source источник


Ответы (4)


Чтобы прочитать файл UTF-8, вам, вероятно, потребуется использовать ссылку ADODB.Stream объект. Я не претендую на звание эксперта по кодированию символов, но этот тест сработал для меня:

test.txt (сохранен как UTF-8 без спецификации):

首页
帮助

test.vbs

Option Explicit

Const adTypeText = 2
Const adReadLine = -2

Dim stream : Set stream = CreateObject("ADODB.Stream")
stream.Open
stream.Type = adTypeText
stream.Charset = "UTF-8"
stream.LoadFromFile "test.txt"

Do Until stream.EOS
    WScript.Echo stream.ReadText(adReadLine)
Loop

stream.Close
person Cheran Shunmugavel    schedule 07.06.2011
comment
Это работает, но следите за использованием памяти, если text.txt большой, и обязательно Close поток, ADODB.Streams может стать немного напуганным, если вы их не закроете. - person AnthonyWJones; 07.06.2011

Какая бы часть процесса ни читала файл translations.txt, похоже, он не понимает, что файл находится в UTF-8. Похоже, он читает это как какую-то другую кодировку. Вы должны указать кодировку в любом процессе, который открывает и читает этот файл. Это будет отличаться от кодировки вашей веб-страницы.

Вставка знака порядка следования байтов в начале этого файла также может быть решением.

person Jeffrey L Whitledge    schedule 06.06.2011
comment
Это будет кодировка -1 (UTF-8) в методе OpenTextFile(). Проблема в том, что ASP не любит метки порядка следования байтов в файлах, поскольку он включает двоичный маркер в данные. Однако, даже если это было пропущено, текст из файла все равно читается некорректно, точно так же, как я представил выше — 首页. Это боль :-( - person Dominic Zukiewicz; 06.06.2011
comment
@Dominic Zukiewicz - я не знаю, сработает ли это, но попробуйте с 1 вместо -1. - person Jeffrey L Whitledge; 07.06.2011
comment
Если это не сработает, попробуйте использовать UTF-16LE (в общеупотребительном Unicode для Windows) в качестве кодировки. - person Jeffrey L Whitledge; 07.06.2011
comment
@Dominic: Scripting.OpenTextFile вообще не понимает UTF-8. Кроме того, UTF-8 не является хорошим выбором для этих символов, лучше использовать прямолинейный 2-байтовый Unicode, который понимается OpenTextFile. - person AnthonyWJones; 07.06.2011
comment
@AnthonyWJones: я только что преобразовал файл в UTF-16 LE, и теперь он интерпретирует один символ как полную строку. Поэтому Home читается как 4 строки — «H», «o», «m», «e». Он должен думать, что нули являются разделителями строк. - person Dominic Zukiewicz; 07.06.2011
comment
@Dominic: теперь я добавил свой ответ, вам нужно посмотреть на параметр формата. - person AnthonyWJones; 07.06.2011

Scripting.OpenTextFile вообще не понимает UTF-8. Он может читать только текущую кодировку OEM или Unicode. Как видно из количества байтов, используемых для некоторых наборов символов, UTF-8 весьма неэффективен. Я бы рекомендовал Unicode для такого рода данных.

Вы должны сохранить файл как Unicode (на языке Windows), а затем открыть с помощью:

Dim stream : Set stream = Scripting.OpenTextFile(yourFilePath, 1, false, -1)
person AnthonyWJones    schedule 07.06.2011

Просто используйте приведенный ниже скрипт в верхней части страницы.

Response.CodePage=65001
Response.CharSet="UTF-8"
person Smunro    schedule 03.08.2011