Установка кодировки символов в отправке формы для Internet Explorer

У меня есть страница, содержащая форму. Эта страница обслуживается с типом содержимого text / html; charset = utf-8. Мне нужно отправить эту форму на сервер, используя кодировку символов ISO-8859-1. Возможно ли это с помощью Internet Explorer?

Установка атрибута accept-charset для элемента формы, как этот, работает для Firefox, Opera и т. Д., Но не для IE.

<form accept-charset="ISO-8859-1">
  ...
</form>

Изменить: эта форма создается сервером A и будет отправлена ​​на сервер B. Я не контролирую сервер B.

Если я настрою сервер A для обслуживания контента с кодировкой ISO-8859-1, все будет работать, но я ищу способ сделать эту работу без изменений в кодировке сервера A. У меня есть еще один вопрос: о настройке кодировки на сервере A.


person Juha Syrjälä    schedule 30.09.2008    source источник


Ответы (10)


Для этого есть простой способ:

Вставьте скрытое поле ввода в форму с сущностью, которая встречается только в наборе символов, который принимает сервер, который ваша публикация (или выполнение GET) принимает.

Пример: если форма расположена на сервере, обслуживающем ISO-8859-1, и форма будет отправлена ​​на сервер, ожидающий, что UTF-8 вставит что-то вроде этого в форму:

<input name="iehack" type="hidden" value="&#9760;" />

IE затем «обнаружит», что форма содержит символ UTF-8, и будет использовать UTF-8 при POST или GET. Странно, но работает.

person Community    schedule 02.09.2009
comment
В обратной ситуации это не работает. Отправка формы, которая остается на странице utf-8, на страницу iso-8859-1 на другом сервере. - person MaxiWheat; 11.01.2010
comment
Хорошо, по-другому не пойдет. Если вы укажете что-то вроде ÿ, что является наивысшим символом в кодировке ISO-8859-1, это, очевидно, тоже код UTF-8. Таким образом, IE думает, что это UTF-8. Таким образом, он работает только тогда, когда целевая кодировка имеет большее количество символов. - person acme; 19.10.2010
comment
У меня не работает в IE8, см. тестовый пример - person Tomas; 31.10.2013
comment
это не работает на страницах UTF-8 для более универсального обходного пути в IE, см. ответ dgaspar ниже. - person aPokeIntheEye; 01.03.2017

В приличных браузерах:

<form accept-charset="ISO-8859-1" .... >

С IE (любым):

document.charset = 'ISO-8859-1'; // do this before submitting your non-utf8 <form>!
person dgaspar    schedule 08.08.2012
comment
Кажется, это решает проблему IE (когда в браузере включен JavaScript), и вы можете реализовать это, используя атрибут onsubmit="document.charset = 'ISO-8859-1'" в теге form. - person Jukka K. Korpela; 30.08.2012
comment
Заголовок Accept-Charset используется, чтобы сообщить серверу, какая кодировка приемлема в качестве ответа (см. tools.ietf .org / html / rfc2616 # section-14.2). Мне кажется, что это неправильный способ указывать кодировку отправляемого документа. По стандарту это должно быть добавлено как charset параметр к типу содержимого. Не знаю, как указать это в HTML-формах: \ - person exhuma; 04.11.2014
comment
Немного покопавшись, я наткнулся на enctype в элементе формы. Следуя описанию, это выглядит более правильным. Хотя еще не тестировал. - person exhuma; 04.11.2014
comment
onsubmit = document.chartset = 'ISO-8859-1' сделал свое дело. Только что протестировал на IE 11. Спасибо. - person Manish Pradhan; 05.10.2015
comment
@exhuma этот раздел посвящен accept-charset в заголовке. OP объявляет accept-charset в разметке формы. - person Carlos Henrique Cano; 09.12.2016

Похоже, это невозможно, по крайней мере, с текущими версиями IE (6 и 7).

IE поддерживает атрибут формы accept-charset, но только если его значение - utf-8.

Решение состоит в том, чтобы изменить сервер A для создания кодировки «ISO-8859-1» для страницы, содержащей форму.

person Juha Syrjälä    schedule 08.10.2008
comment
IE использует accept-charset как «резервную копию» только тогда, когда ему не удалось закодировать поля в собственной кодировке страницы. Укажите accept-charset, и вы не сможете определить, какая кодировка использовалась. Следовательно, это совершенно бесполезно; его никогда не следует использовать. Единственное решение - действительно изменить кодировку страницы (или iframe), содержащей форму. - person bobince; 07.01.2010

У меня такая же проблема. У меня есть страница UTF-8, которую нужно отправить на сервер ISO-8859-1.

Похоже, IE не может обрабатывать ISO-8859-1. Но он может обрабатывать ISO-8859- 15.

<form accept-charset="ISO-8859-15">
  ...
</form>

Так что у меня это сработало, поскольку ISO-8859-1 и ISO-8859-15 почти одинаковы.

person Christian    schedule 12.04.2011

Если у вас вообще есть доступ к серверу, преобразуйте его обработку в UTF-8. Искусство отправки форм, отличных от UTF-8, - длинная и печальная история; этот документ о Forms и i18n могут быть интересны. Насколько я понимаю, вам кажется, что вас не волнует международная поддержка; вы всегда можете преобразовать данные UTF-8 в объекты HTML, чтобы убедиться, что они остаются Latin-1.

person Edward Z. Yang    schedule 30.09.2008
comment
Меня очень волнует международная поддержка, и я хотел бы сохранить свое приложение в мире UTF-8, но эту единственную страницу необходимо отправить в iso-8859-1 на внешний сервер. - person Juha Syrjälä; 21.11.2008

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

Например, ваш сайт находится в формате utf-8, и вы хотите опубликовать форму на сайте в формате iso-8859-1. Просто измените действие сообщения на страницу вашего сайта, которая преобразует опубликованные значения из utf-8 в iso-8859-1.

это можно легко сделать на php примерно так:

<?php
$params = array();
foreach($_POST as $key=>$value) {
    $params[] = $key."=".rawurlencode(utf8_decode($value));
}
$params = implode("&",$params);

//then you redirect to the final page in iso-8859-1
?>
person David Mongeau-Petitpas    schedule 23.07.2010
comment
Это хорошая идея, но это может быть довольно сложно, если вы пытаетесь отправить данные для входа и вам нужно обрабатывать файлы cookie и прочее. Тогда это можно было бы сделать с помощью CURL, но заставить его работать действительно сложно. - person acme; 05.11.2010

Для русских символов 'windows-1251'

<form action="yourProcessPage.php" method="POST" accept-charset="utf-8">
<input name="string" value="string" />
...
</form>

Когда просто конвертируем строку в cp1251

$string = $_POST['string'];
$string = mb_convert_encoding($string, "CP1251", "UTF-8");
person dr.dimitru    schedule 09.04.2012
comment
Хотя само по себе это не дает ответа на вопрос, я думаю, что это гораздо лучшее решение. В любом случае вы всегда должны работать с UTF-8. При этом, если вы создаете форму, которая отправляется на сервер, над которым у вас нет контроля, она не будет работать таким образом. - person Alexis Wilke; 26.12.2013

Похоже, Microsoft знает accept-charset, но в их документации не указано, для какой версии он начинает работать ...
Вы также не сообщаете, в каких версиях браузера вы его тестировали.

person PhiLho    schedule 30.09.2008

Я, кажется, помню, что Internet Explorer сбивается с толку, если кодировка accept-charset не соответствует кодировке, указанной в заголовке content-type. В вашем примере вы утверждаете, что документ отправляется как UTF-8, но хотите, чтобы форма отправлялась в ISO-8859-1. Попробуйте сопоставить их и посмотрите, решит ли это вашу проблему.

person warp    schedule 30.09.2008
comment
У меня похожая проблема. Приложение обслуживает ответ как utf-8 и в той форме, в которой он указан, accept-charset = utf-8, но с IE8 он извлекает значения в неправильном формате. Какая конфигурация лучше всего подходит для работы с формами в Internet Explorer? Спасибо. - person David García González; 22.06.2009

Я почти уверен, что это будет невозможно со старыми версиями IE. До изобретения атрибута accept-charset у элементов form не было возможности указать, какую кодировку символов они принимают, и лучшее, что могли сделать браузеры, - это предположить, что подойдет кодировка страницы, на которой находится форма.

Немного грустно, что вам нужно знать, какая кодировка использовалась - в настоящее время мы ожидаем, что наши веб-фреймворки позаботятся о таких деталях незримо и предоставят текстовые данные приложению в виде строк Unicode, уже декодированных ...

person pdc    schedule 30.09.2008