проблема преобразования latin1 / unicode с помощью запроса ajax и специальных символов - PullRequest
1 голос
/ 05 мая 2010

Сервер - PHP5, а кодировка HTML - latin1 (iso-8859-1). С обычными запросами POST формы нет проблем с «специальными» символами, такими как, например, em dash (-). Хотя я не знаю точно, это работает. Вероятно, потому, что в браузере существует представимый символ в коде символа 150 (это то, что я вижу в PHP на сервере для буквального тире em с ord).

Теперь наше приложение также предоставляет некоторый механизм предварительного просмотра через ajax: текст отправляется на сервер, а полный HTML-код для предварительного просмотра отправляется обратно. Тем не менее, обычный символ кода 150 символов тире при отправке через ajax (проверено с помощью GET и POST) видоизменяется в нечто большее: %E2%80%93. Я вижу это уже в журнале apache.

Согласно различным источникам, которые я нашел, например, http://www.tachyonsoft.com/uc0020.htm, это UTF8-байтовое представление em dash, и сейчас я знаю, что JavaScript обрабатывает все в Unicode.

Однако в моем приложении мне нужно все на латинице 1. Проще говоря: точно так же, как обычный запрос POST дал бы мне эту черту в виде кода с кодом 150, мне это понадобится и для переведенного представления UTF8.

Это было то, что я потерпел неудачу, потому что с PHP на сервере, когда я пытаюсь декодировать его с utf8_decode(...) или iconv('UTF-8', 'iso-8859-1', ...), но в обоих случаях я получаю обычный ?, представляющий этот символ (и iconv также бросает Обратите внимание: обнаружен недопустимый символ во входной строке).

Моя цель - найти автоматизированное решение, но, может быть, в этом случае я пытаюсь быть überclever?

Я обнаружил, что другие люди просто делают ручную замену предопределенным набором ввода / вывода; но это всегда давало бы мне ощущение, что я могу потерять персонажей.

Наблюдательный читатель заметит, что я позади в понимании полного воздействия / сложности с вещами о Юникоде и преобразовании символов, и я определенно предпочитаю понимать вещь в целом, а не просто ручное отображение.

Обновление на основе вопроса Delands о необходимости однобайтового символа:

Правда, я не знаю, нужно ли мне . В настоящее время у меня есть два способа передать данные на сервер и получить обратно:

  1. клиент latin1 -> обычный пост-запрос -> latin1 на сервере, отправляет обратно полную страницу в latin1, символы ок

  2. клиент latin1 -> ajax-запрос (get или post) -> latin1 преобразуется в utf8 -> я пытаюсь преобразовать utf8 обратно в latin1 -> отправить HTML-фрагмент latin1 клиенту для отображения в строке -> специальные символы терпеть неудачу

Второй способ не работает, потому что преобразование из utf8-> latin1 не работает, как описано выше с utf8_decode / icon.

Моя конечная цель - просто представить предварительный просмотр данных, введенных пользователем. Мне требуется серверная передача для рендеринга HTML и другой оценки данных, которая должна быть сделана.

Решение

Ответ Алана - это решение: latin1 рассматривается как windows-1252 сзади, и это также то, что Word (по крайней мере, мой 2007 здесь), кажется, использует, когда копирует и вставляет материал между ним и браузером.

Еще одна интересная ссылка (из статьи Википедии Алана) на Синтаксис HTML 5 :

8.2.2.2: Пользовательские агенты должны как минимум поддерживать кодировки UTF-8 и Windows-1252, но могут поддерживать больше.

...

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

...

Входная кодировка: ISO-8859-1 -> Сменная кодировка: windows-1252

Ответы [ 2 ]

3 голосов
/ 06 мая 2010

ISO-8859-1 не поддерживает символ em-dash. Вы на самом деле используете одну из расширенных кодовых страниц Microsoft, вероятно, windows-1252 . По сути, это расширенный набор символов latin1, поэтому браузеры склонны использовать его, когда страница обслуживается как ISO-8859-1 (именно поэтому ваши символы отображаются правильно). Но если вы собираетесь использовать расширенные символы, такие как em-dash, вы должны указать windows-1252 в качестве кодировки везде, где можете. Или, что еще лучше, везде укажите UTF-8.

1 голос
/ 05 мая 2010

Страницы с руководствами по работе UTF-8:

http://azabani.com/15

https://en.wikipedia.org/wiki/UTF-8

Проще говоря, не существует простого сопоставления «расширенных» наборов ASCII, таких как ISO-8859-1 (которые ограничиваются 255 кодовыми точками) и Unicode (которому принадлежит 1114112 кодовых точек, где используется более 100000). Пожалуйста, дайте мне больше подробностей о том, почему однобайтовая кодировка необходима ; может быть, я могу помочь вам обойти это ограничение. UTF-8 является наиболее эффективным и гибким выбором для кодирования текста и должен использоваться везде, где это возможно.

...