Проблема кодирования UTF-8 в параметрах запроса IE - PullRequest
1 голос
/ 20 июля 2011

У меня есть этот URL с моим тестовым кодом: http://www.gruppenunterkuenfte.de/encodingtest.php?q=köln

Он передает параметр запроса q в запрос SQL.

Странно то, что запрос поступаетиз IE я должен utf8_encode() это.Если это исходит от Chrome или Firefox, я не могу.

mb_detect_encoding() Всегда говорит, что запрос UTF-8 (IE и другие).Однако этот запрос сам по себе будет работать только в одном из браузеров.

Это мой тестовый код из приведенного выше URL:

<?php
header('Content-Type: text/html; charset=utf-8');

$config = parse_ini_file("inc/base/config.php", 1);
$link = mysqli_connect($config["database"]["server"], $config["database"]["user"], $config["database"]["passwd"]);
mysqli_select_db($link, $config["database"]["database"]);
mysqli_query($link, "SET NAMES utf8;");

echo 'mb_detect_encoding: '. mb_detect_encoding($_GET['q']) .'<br>';

echo 'Without utf8_encode():<br>';

$res = mysqli_query($link, 'SELECT SQL_CALC_FOUND_ROWS ort FROM BRDOrte
  WHERE ort LIKE \''. addslashes($_GET['q']) .'%\'
  GROUP BY BINARY ort
  ORDER BY BINARY ort
  LIMIT 5
  ');
while ($row = mysqli_fetch_array($res)) print_r($row);


echo '<br>With utf8_encode():<br>';

$res = mysqli_query($link, 'SELECT SQL_CALC_FOUND_ROWS ort FROM BRDOrte
  WHERE ort LIKE \''. utf8_encode(addslashes($_GET['q'])) .'%\'
  GROUP BY BINARY ort
  ORDER BY BINARY ort
  LIMIT 5
  ');
while ($row = mysqli_fetch_array($res)) print_r($row);

?>

Таблица MySQL и все ее поля имеют вид utf8_general_ci.

Итак, как мне сказать IE отправлять параметр Query как UTF-8?

Или как мне определить его на стороне сервера, чтобы я мог правильно кодировать?

Ответы [ 3 ]

5 голосов
/ 20 июля 2011

Общий синтаксис URI ( RFC3986 ) требует, чтобы любые символы, не 7-битные ASCII, кодировались в процентах (URI Encoded). Когда вы работаете вне этого стандарта, обработка пользовательского агента будет непредсказуемым образом изменяться. Вы должны либо: а) кодировать строку URL перед отправкой с помощью javascript (см. encodeURIComponent ), б) кодировать ее во время рендеринга страницы с помощью PHP (см. urlencode ), либо c) создайте троичный оператор в обработчике запросов, чтобы справиться с любой ситуацией:

$tag = strlen($_GET['q']) > 1 ? $_GET['q'] : utf8_encode($_GET['q']);
3 голосов
/ 20 июля 2011

Используйте urlencode , чтобы передать параметр запроса в браузер.Он станет k%F6ln Тогда вы сможете прочитать его обратно с urldecode .

Для JavaScript попробуйте encodeURIComponent или его альтернативы

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

Может быть, вы можете попробовать что-то на стороне сервера

проверить и отредактировать /etc/apache2/conf.d/charset (ваш сервер может иметь другой каталог) и добавить строки ниже.Я понял, что вы используете некоторые голландские символы, поэтому вы также можете добавить символы для этого языка.

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