Почему мои данные UTF8 из моего приложения mod_perl по-прежнему искажаются в веб-браузере? - PullRequest
4 голосов
/ 09 ноября 2009

Прежде чем начать, я хотел бы выделить структуру того, с чем я работаю.

  1. Существует текстовый файл, из которого взят определенный текст. Файл закодирован в utf-8
  2. Perl берет файл и печатает его на странице. Все отображается так, как должно быть. Perl настроен на использование utf-8
  3. Веб-страница, которую генерирует Perl, имеет следующий заголовок <meta content="text/html;charset=utf-8" http-equiv="content-type"/>. Следовательно это utf-8
  4. После первой загрузки все загружается динамически через jQuery / AJAX. Пролистывая страницы, можно загрузить точно такой же текст, только на этот раз он загружается JavaScript. Запрос имеет следующий заголовок Content-Type: application/x-www-form-urlencoded; charset=UTF-8
  5. Обработчик Perl, который обрабатывает AJAX-запрос на серверной части, доставляет содержимое в utf-8
  6. AJAX-обработчик вызывает функцию в нашей пользовательской платформе. Перед тем, как Framework выводит на печать текст, он правильно отображается как «üöä». После отправки в обработчик AJAX он читает «x {c3} \ x {b6} \ x {c3} \ x {a4} \ x {c3} \ x {bc}", что является представлением utf-8 для " UOA».
  7. После того, как обработчик AJAX доставит свой пакет клиенту в формате JSON, на веб-странице будет напечатано следующее: «Ã¶Ã¤Ã¼».
  8. Сами файлы JS и Perl сохраняются в utf-8 (настройка по умолчанию в Eclipse)

Это симптомы. Я попробовал все, что Google сказал мне, и у меня все еще есть проблема. Кто-нибудь знает, что это может быть? Если вам нужен какой-то конкретный фрагмент кода, сообщите мне об этом, и я постараюсь вставить его.

Редактировать 1

Заголовок ответа от обработчика AJAX

Date: Mon, 09 Nov 2009 11:40:27 GMT
Server: Apache/2.2.10 (Linux/SUSE)
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset="utf-8"

200 OK

Ответ

С помощью вас, ребят и этой страницы, я смог отследить проблему. Похоже, проблема была не в самой кодировке, а в Perl, кодирующей мою переменную $ text в два раза больше, чем в utf-8 (по данным сайта). Решение было так же просто, как добавление Encode :: decode_utf8 ().

Я искал в совершенно неправильном месте для начала. Я благодарю всех, кто помог мне искать в нужном месте :)

# распространяет некоторую возлюбленную любовь #

Ответы [ 2 ]

6 голосов
/ 09 ноября 2009

возвращает следующее: & 38; & 65; & 116; & 105; & 108; & 100; & 101; & 59; & 38; & 112; & 97; & 114; & 97; & 59; ...

Это:

&Atilde;&para;&Atilde;&curren;&Atilde;&frac14;

Это говорит о том, что ваш обработчик AJAX использует для своего вывода функцию кодирования сущности HTML, которая предполагает ввод из набора символов ISO-8859-1. Вместо этого вы могли бы использовать кодировщик ссылок на символы, который знал о UTF-8, но, вероятно, будет проще просто кодировать потенциально специальные символы <>&"' и никаких других.

Запрос имеет следующий заголовок Content-Type: application / x-www-form-urlencoded; кодировка = UTF-8

Для типа MIME application/x-www-form-urlencoded нет такого параметра, как charset. Это будет игнорироваться. Строки, закодированные в форме, по своей сути основаны на байтах; Приложение самостоятельно решает, к какому набору символов они относятся (если оно есть; может, приложению нужны только байты).

2 голосов
/ 09 ноября 2009

Это не столько ответ, сколько предложение отладки. Первое, что приходит на ум, это попытаться отправить HTML-сущности типа &#1234; вместо кодов utf-8. Для того, чтобы Perl отправил их, есть модуль, или вы можете просто сделать

 my $text =~ s/(.)/"&#" . ord ($1) . ";"/ge;

То, что мне кажется наиболее вероятной причиной этой проблемы, заключается в том, что JavaScript получает конец и не может понять кодированный UTF-8 из Perl.

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