IE查询参数中的UTF-8编码问题

时间:2011-07-20 14:47:45

标签: php mysql internet-explorer encoding utf-8

我的测试代码包含此网址:http://www.gruppenunterkuenfte.de/encodingtest.php?q=köln

它将查询参数q传递给SQL查询。

奇怪的是,如果查询来自IE,我必须utf8_encode()。如果它来自Chrome或Firefox,我可能不会。

mb_detect_encoding()总是说查询是UTF-8(IE和其他)。然而,查询itselfe只能在其中一个浏览器中使用。

这是我在上面的网址中的测试代码:

<?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 个答案:

答案 0 :(得分:5)

URI(RFC3986)的通用语法要求任何非7位ASCII字符都要进行百分比编码(URI编码)。当您在该标准之外操作时,用户代理处理将不可预测地变化。您将要么a)在使用javascript发送之前对URL字符串进行编码(请参阅encodeURIComponent),b)在使用PHP进行页面呈现期间对其进行编码(请参阅urlencode),或c)创建三元语句在请求处理程序中处理这两种情况:

$tag = strlen($_GET['q']) > 1 ? $_GET['q'] : utf8_encode($_GET['q']);

答案 1 :(得分:3)

使用urlencode将查询参数传递给浏览器。它将成为k%F6ln然后您应该能够使用urldecode读回来。

对于JavaScript,请尝试encodeURIComponent或其替代方案

答案 2 :(得分:-1)

可能你可以在服务器端尝试一些东西

检查并编辑/etc/apache2/conf.d/charset(您的服务器可能有不同的目录)和 添加行beolow。我意识到你使用了一些荷兰语字符,因此你也可以添加该语言的字符。

AddDefaultCharset UTF-8
AddDefaultCharset iso-8859-9