2012-03-29 58 views
0

我在下面写了一个简单的脚本来模拟我的问题。 我的字符串和模式都包含unicode字符。PHP preg_replace_callback with unicode

基本上,如果我从命令行(php -f test.php)运行它,它会按预期打印“匹配”。 但是,如果我通过网络服务器(Apache,http://localhost/test.php)运行它,它会打印“不匹配”。 我正在使用PHP 5.3。

任何想法为什么它的行为不同? 如何使它通过Web服务器工作?

谢谢。

<?php 
function myCallback($matches) { 
    return $matches[0]; 
} 

$value = 'aaa äää'; 
$pattern = '/(\bäää)/u'; 

$value = preg_replace_callback($pattern, 'myCallback', $value, -1, $count); 
if ($count > 0) { 
    echo "match"; 
} else { 
    echo 'no match'; 
} 
?> 
+0

你发送标头的服务器? – 2012-03-29 21:21:54

+0

没有标题。我手动输入了浏览器地址栏的网址。该字符串不是用户输入,它在PHP脚本中被硬编码。 – Formosan 2012-03-29 21:42:37

回答

1

尝试使用iniset('default_charset','utf-8')更改default_charset。

如果可行,这意味着CLI和Apache PHP配置具有单独的php.ini配置,可能该变量设置不同,或者可能基于环境。

您可以将其作为解决方案或找到替代方案。

干杯,

+0

添加init_set没有帮助。我很确定他们使用相同的php.ini。 – Formosan 2012-03-29 21:43:46

0

检查您的test.php它有正确的头。在PHP你应该说明:

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

在你的HTML头:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 

按照标准设置为ISO-8895-1,也许这是造成问题的原因。在这里,你可以找到多种编码的一些信息(如UTF-8编码是不能接受的)和有关UTF-8自:http://devlog.info/2008/08/24/php-and-unicode-utf-8/

+0

输入字符串不是来自用户,而是在PHP中硬编码。而且我没有在浏览器中显示任何unicode。所以我不确定它为什么与标题有关。但在我的回应中,是的,它确实将内容类型charaset设置为'utf-8'。 – Formosan 2012-03-29 21:47:24

+0

我不知道,也许尝试mb_internal_encoding然后 – ArendE 2012-03-29 22:07:15

+0

另外也许这是有帮助的:http://stackoverflow.com/questions/2063192/preg-replace-and-utf8 – ArendE 2012-03-29 22:10:19