Получить поля не-UTF-8-формы как UTF-8 в PHP? - PullRequest
1 голос
/ 13 февраля 2009

У меня есть форма, которая не в UTF-8 (на самом деле она в Windows-1251). Люди, конечно, размещают там любых персонажей, которые им нравятся. Браузер услужливо преобразует непрезентабельные в Windows-1251 символы в html-объекты, чтобы я все еще мог их распознать. Например, если пользователь вводит →, я получаю →. Это отчасти здорово, например, если я просто верну его назад, браузер правильно отобразит → несмотря ни на что.

Проблема в том, что я на самом деле выполняю htmlspecialchars () для текста перед его отображением (это функция PHP для преобразования специальных символов в объекты HTML, например & становится &). Мои пользователи иногда вводят такие вещи, как — или ©, и я хочу отображать их как фактические — или ©, а не - и ©.

Я не могу отличить → от →, потому что я получаю их обоих как →. И, так как я htmlspecialchars () текст, и , я также получаю → для → из браузера, я возвращаю →, который отображается как → в браузере. Таким образом, пользовательский ввод будет поврежден.

Есть ли способ сказать: «Хорошо, я отправляю эту форму в Windows-1251, но вы , пожалуйста, просто пришлите мне входные данные в UTF-8 и позвольте мне разобраться с этим самостоятельно»?

О, я знаю, что хорошей идеей является переключение всего программного обеспечения на UTF-8, но это слишком много работы, и я был бы рад получить быстрое решение для этого. Если это имеет значение, энктип формы имеет вид «multipart / form-data» (включает загрузчик файлов, поэтому не может использовать любой другой энктип). Я использую Apache и PHP.

Спасибо!

Ответы [ 8 ]

3 голосов
/ 13 февраля 2009

Браузер преобразует непредсказуемые в Windows-1251 символы в HTML-объекты

Ну, почти, за исключением того, что это совсем не полезно. Теперь вы не можете отличить реальное «ƛ» от того, что кто-то печатал, ожидая, что оно выйдет в виде строки текста с символом «&» и символом «‘ ».

Я на самом деле делаю htmlspecialchars () для текста перед его отображением

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

Хорошо, я отправляю эту форму в Windows-1251, но не могли бы вы выслать мне входные данные в UTF-8 и позволить мне разобраться с этим самостоятельно

Да, возможно, вы отправляете «accept-charset =" UTF-8 »в теге формы. Но реальность такова, что не работает в IE. Чтобы получить форму в UTF-8, необходимо отправить форму (страницу) в UTF-8.

Я знаю, что хорошей идеей является переключение всего программного обеспечения на UTF-8,

Да. Ну, по крайней мере кодировка страницы, содержащей форму, должна быть UTF-8.

1 голос
/ 13 февраля 2009
<form action="action.php" method="get" accept-charset="UTF-8">
    <!-- some elements -->
</form>

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

0 голосов
/ 13 февраля 2009

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

0 голосов
/ 13 февраля 2009

mbstring поддерживает HTML-сущности "charset"


<p>for($i=0; $i<strlen($out); $i++) {
  printf('%02X ', ord($out[$i]));
}
61 20 E2 86 92 20 62 20 26 20 63
E2 86 92 - это последовательность байтов для → (СТРЕЛКА ВПРАВО) в utf8.
0 голосов
/ 13 февраля 2009

Вы можете преобразовать строки в UTF-8, используя многобайтовые функции PHP . Оттуда вы можете делать, как хотите. Особенно mb_convert_encoding(), чтобы переместить его из windows-1251 в UTF-8 или куда-либо еще.

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

Это, конечно, если вы не использовали опцию double_encode при запуске строки через htmlspecialchars()

0 голосов
/ 13 февраля 2009

Вы можете установить четвертый параметр функции htmlspecialchars (double_encode, начиная с PHP 5.2.3) в false , чтобы избежать повторного кодирования ссылок на символы. 1007 *

Или вы сначала декодируете эти существующие ссылки на символы.

0 голосов
/ 13 февраля 2009

Возможно, вам нужна функция html_entity_decode.

0 голосов
/ 13 февраля 2009

Вы проверяете, находятся ли символы в определенном диапазоне. Если они выходят за пределы диапазона стандартных символов UTF-8, делайте с ним все, что хотите. Я бы сделал это, посмотрев на каждый символ &, #, 8, 5, 9, 4 и проанализировав его во что-то, к чему вы можете применить что-либо.

Если не найти где-нибудь, где кто-то создал сценарий преобразования Windows-1251 в UTF-8, вам, вероятно, придется свернуть свой собственный. Вам, вероятно, придется посмотреть на каждого конкретного персонажа и посмотреть, что с ним делать. Если это что-то вроде & copy; Вы захотите обращаться с этим иначе, чем →, потому что во втором есть знак #.

Я думаю, что это отвечает на ваш вопрос.

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