php urldecode utf8 вопрос о кодировке - PullRequest
1 голос
/ 12 марта 2011

, когда я пытаюсь получить URL с urlencoded-значением (какое-то кириллическое слово):

http://example.com/?action=search&q=%E0%E2%F2%EE%EC%EE%E1%E8%EB%FC

после декодирования:

echo urldecode($_GET['q']); // it prints: ���������

, поэтому янужно сделать преобразование в utf-8 (потому что все мое приложение работает с utf-8) через:

mb_convert_encoding($_GET['q'], "UTF-8", "windows-1251");

, и это помогает, но вопрос :

Кто /что говорит, что это должно быть ТОЧНО"windows-1251"?откуда это?Если я буду использовать некоторые другие языки, как я могу определить подходящую кодировку?где магия?

(обновление): кодировка страницы - utf-8 (обновление): фактически, urldecode ($ _ GET ['q']) даже не нужен, похоже, что модуль apache + php делает все,но до сих пор не могу понять, где конфиги

Ответы [ 6 ]

3 голосов
/ 12 марта 2011

Ответ заключается в том, что вы не можете знать это наверняка, поскольку это может измениться от запроса к запросу, особенно если это не всегда отправляется из формы, но иногда отправляется с помощью ajax или вводится пользователем непосредственно в адресную строку.

Я работаю с заявкой на польском языке.Приложение работает с кодовой страницей ISO-8859-2, и весь вывод html подается в этой кодировке.

Приложение получает запрос в двух разных кодировках, в зависимости от контекста запроса:

  1. Если запрос сделан в результате отправки формы, то кодировка такая же, какHTML-страница с отправленной формой.Я думаю, что это может быть изменено с атрибутом accept-charset элемента формы, но я не пробовал его.
  2. Если запрос сделан с Ajax, то это всегда UTF-8 (по крайней мере, в Chrome и Firefox,так как наш клиент использует только эти браузеры).
  3. Если запрос вводится вручную в URL, то обычно это UTF-8, но если это была закладка или что-то подобное, то это может быть другая кодировка(зависит от того, как была создана закладка).

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

Я использую следующий код:

<?php
$t = 'zażółć gęślą jaźń';
echo mb_detect_encoding($t, 'UTF-8,ISO-8859-2');

С уважением, SWilk

1 голос
/ 12 марта 2011

это не проблема apache и mod_php.PHP автоматически декодирует urlencoding, но ничего не кодирует, так что не стоит беспокоиться о

, как это видно из этого

при вводе в Firefox3 example.com/?action = search & q = автомобиль автоматически преобразуется в: example.com/?action=search&q=%E0%E2%F2%EE%EC%EE%E1%E8%EB%FC

большенапример, проблема с браузером или операционной системой.

кажется, что ваша кодировка ОС однобайтовая, а браузер действительно кодирует вашу однобайтовую строку.

0 голосов
/ 26 июня 2011

Я тоже встречал эту проблему. Я использую adobe dreameweaver cs4 (не английская версия)

Я решаю это как показано ниже:

  1. добавьте header('Content-type: text/html; charset=utf-8'); вверху файла подкачки PHP.

  2. ВАЖНО В adobe dreameweaver необходимо изменить Page Properties из top menu Modify (M) -> Page Properties (P), выбрать Title/coding и вручную изменить unicode до unicode (uft-8).

(извините, эти слова меню переведены на английский, возможно, не настоящие слова)

0 голосов
/ 12 марта 2011

windows-1251 - это 8-битная кодировка символов, разработанная для языков, использующих кириллицу. Wiki

Возможно, вы установили кодировку на windows-1251 на своей веб-странице

0 голосов
/ 12 марта 2011

Когда вы вводите символы, не входящие в ASCII, непосредственно в строку поиска URL, браузер автоматически конвертирует символы в объекты в кодировке UTF-8 и URL.У меня нет точных данных по этому вопросу, но поведение имеет смысл.Связанный вопрос здесь: Unicode-символы в URL-адресах

Ваша страница использует windows-1252 или какой-либо другой однобайтовый набор символов в качестве выходной кодировки, поэтому вам необходимо преобразовать данные символовпервый.

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

0 голосов
/ 12 марта 2011

Вы должны оставить UTF8 и установить кодировку своей страницы в UTF8, используя соответствующий заголовок типа контента:

header('Content-type: text/html; charset=utf-8');
...