Сервер - 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 о необходимости однобайтового символа:
Правда, я не знаю, нужно ли мне . В настоящее время у меня есть два способа передать данные на сервер и получить обратно:
клиент latin1 -> обычный пост-запрос -> latin1 на сервере, отправляет обратно полную страницу в latin1, символы ок
клиент 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