我的测试代码包含此网址: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?
或者我如何在服务器端检测到它,所以我可以正确编码?
答案 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