2015-07-18 3 views
1

В webapp я размещаю <div id="xxx" contentEditable=true > для редактирования. encodeURIComponent(xxx.innerHTML) будет отправлен через Ajax POST на сервер, где скрипт PHP создает из него простой файл txt, который, в свою очередь, может быть загружен от пользователя для его локального хранения или печати на экране. Пока он работает отлично, но ... Да, но кодировка символов - беспорядок. Все специальные символы, такие как немецкий Ä, интерпретируются неправильно. В этом случае как ä Я google в течение нескольких дней, и я изучаю методы PHP, такие как iconv(), и я знаю, как настроить кодировку символов браузера, а также установить текстовый редактор для правильного корреспондирующего декодирования. Но ничто не помогает, его все еще беспорядок, или становится даже натянутым.Кодировка символов/декодирование становится беспорядком

Так что мой вопрос: где в этом кодировании/декодировании в оба конца от браузера к серверу и обратно в браузер мне нужно что-то делать, чтобы Ä по-прежнему был Ä?

ответ

1

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

Я бы рекомендовал использовать UTF-8. Убедитесь, что ваш HTML-документ (который включает в себя зону contenteditable) кодируется в кодировке UTF-8 и что запрос XMLHttpRequest/Ajax не указывает другую кодировку при отправке содержимого на сервер.

Убедитесь, что ваше серверное приложение также кодирует текстовый файл как UTF-8. И проверьте, что заголовки HTTP-ответа объявляют кодировку файла как UTF-8, когда файл запрашивается и загружается в браузере.

Где-то по этому пути кодировка отличается, и именно это вызывает ошибку. iconv преобразует различные кодировки, что не обязательно, если все согласовано.

Удачи вам!

+0

благодарит за подсказку. HTML-документ, который наследует 'conteneditable', объявляется как' '. Может ли это быть перезаписано?Запрос XMLHttpRequest/Ajax не имеет специальной кодировки, кроме 'encodeURIComponent'. Поэтому UTF-8 должен пройти. serveride У меня нет специальной настройки кодирования/декодирования. Как это сделать ? Где объявлять заголовки HTTP-ответа для downlaoding? – Ben

+1

HTTP-заголовок «Content-Type» в ответе будет переопределять любую кодировку символов, указанную в самом документе HTML, например. используя тег '. Проверьте свою консоль на значение заголовка «Content-Type» «text/html; charset = utf-8» для веб-страницы и «text/plain; charset = utf-8» для загрузки файла. Если они ошибочны, исправьте их в своем серверном приложении с помощью функции 'header()' PHP: http://php.net/header :) – kieranpotts

2

Ответы на мой вопрос, потому что это оказывается другой проблемой, как указано выше. contenteditable фактически является частью раздела html-кода. На ServerSide с PHP Мне нужно отфильтровать contenteditable текст, который я делаю через DOMDocument, как это:

$doc = new DOMDocument(); 
$doc->loadHTML($_POST["data"]); 

я получить доступ к элементам и их текстовое содержание, как обычно. Наконец я сохранить текст с

file_put_contents($txtFile, $plainText, LOCK_EX); 

затем сохраненный текст был беспорядок, как написано выше. Теперь выясняется, что вам нужно сообщить DOMDocument набор символов, который должен интерпретироваться loadHTML(). В этом случае UTF-8. Сначала я сделал это, как рекомендовано в PHP следующим образом:

$doc = new DOMDocument('1.0', 'UTF-8'); 

Но это не помогает (интересно). Затем я нашел this ответ в SO. И окончательное решение таково:

$doc->loadHTML('<?xml encoding="UTF-8">' . $_POST["data"]); 

Хотя это работает, это трюк. Наконец, вопрос остается, как это сделать правильно? Если у somebedoy есть определенный ответ, он очень приветствуется.

Смежные вопросы