Как символы передаются через форму? - PullRequest
5 голосов
/ 22 июля 2011
<head>
<meta charset="ISO-8859-7">
</head>

Я работал с формами и вижу, что тег <meta charset="ISO-8859-7"> кодирует текст, который будет напечатан в текстовой области.Дело в том, что метод кодирования, используемый для хранения файла, не подходит.

Я видел, что если введенный символ не является частью кодировки, указанной тегом <meta charset="ISO-8859-7">, символ будет ссылка (& # D;)

Я предполагал, что форма посылала последовательности байтов из указанного кодирования.Потому что, если я наберу символ, какой бы он ни был, это будет байт, который будет интерпретировать кодировка.

Например, с типом <meta charset="ISO-8859-7"> i в форме символ "¥"

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

Но неформа не отправляет ее в виде байта, скорее символ ссылается .

код:

index.php :

<?php header('Content-Type: text/html; charset=ISO-8859-7'); ?>

<head>
    <meta charset="ISO-8859-7">
</head>
<form method="post" action="encode.php" accept-charset="ISO-8859-7">
    <p><textarea name="input" maxlength="10" rows="5" cols="100"></textarea></p>
    <p><button>Submit</button></p>
</form>

encode.php :

<head>
    <meta charset="ISO-8859-7"><!-- Useless, Even if is specified the ISO-8859-1 where the "¥" exist, the form sended a reference char rather an a byte to interpret.-->
</head>
<?php
    $input=$_POST["input"];
    var_dump($input);
?>

Результат в исходном коде:

string(6) "&#165;"

Примечание: я протестировал изменение кодировки, используемой длясохранить файл.

в index.php : независимо от того, какая кодировка используется для хранения файла, форма всегда отправляется соответственно с атрибутом accept-charset="" или сТег <meta charset="">, если accept-charset="" не указан.

И с encode.php : строка никогда не кодируется файлом.Может работать и отображаться, но кодировка, используемая для хранения файла, не имеет к этому никакого отношения.

Ответы [ 4 ]

3 голосов
/ 22 июля 2011

Проблема в том, что введенный символ не поддерживается кодировкой формы.

Насколько я вижу, ни HTML 4, ни HTML 5 не определяют, что должен делать браузер, если пользователь вводит символ в поле формы, которое не поддерживается кодировкой формы.

HTML 5 указывает , что неподдерживаемые символы должны быть заменены на ASCII ? в части запроса URL-адресов¹ (и, следовательно, в представлении формы GET?), Но я ничего не могу найти для POST формы.

Похоже, что все браузеры (или, по крайней мере, IE, FF, Chrome, Opera) договорились о кодировании неподдерживаемых символов как объекта XML. (Лучше всего было бы предупредить пользователя и предотвратить отправку формы, но это вода под мостом.)

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

<ч />

¹ 2.6.3 Разрешение URL. HTML 5, рабочий проект W3C от 25 мая 2011 года , пункт 8.1:

Если рассматриваемый символ не может быть выражен в кодировке кодировка , то замените его одним октетом 0x3F (знак вопроса ASCII) [...]

Забавный факт: вышесказанное относится только к части запроса (части после знака вопроса) IRI . Часть path всегда кодируется с использованием UTF-8. И имя хоста, конечно, закодировано с использованием Punycode . Разум поражает.

1 голос
/ 22 июля 2011

Вы пытались также связать кодировку с элементом формы?

<form method="post" action="encode.php" accept-charset="ISO-8859-7">

например.если вы используете utf-8, вам сначала нужно расшифровать пост:

$input=utf8_decode($_POST["input"]);

, не совсем уверенный, охватывает ли это вашу тему, но я надеюсь, что это поможет как-то:)

0 голосов
/ 22 июля 2011

Возможно, это не является причиной вашей конкретной проблемы, но об этом следует помнить, когда возникают проблемы с кодировкой символов: сохраняйте свои PHP-скрипты, используя ту же кодировку символов. В противном случае могут легко возникнуть проблемы такого рода.

0 голосов
/ 22 июля 2011

Ссылки в кодировке больше о том, что браузер получает (или принимает в своем заголовке запроса), а не о том, что или как вы вводите что-то в форму.

Я считаю, что вводимый вами текст не имеет отношения к определению кодировки в вашем HTML-документе. Важен язык клавиатуры и то, как вы вводите символы. Если у вас есть язык клавиатуры со знаком YEN, ваш браузер распознает знак YEN и, соответственно, выполняет перевод либо в сущность, либо в ссылку на символ. Вы хотели знак YEN, вы получите YEN, а не греческое представление A5.

...