2011-11-22 66 views
1

这里的编码完全拙劣地描述了一个简单的操作。我只想检查一个字符串的第一个字符是否是£。我的php文件本身编码为UTF8-没有BOM。谢谢!字符串的奇怪的字符编码问题

<?php 
print "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1//EN' "; 
print "'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'>\n"; 
print "<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='eng' lang='en'>\n"; 
print "<head>\n"; 
print "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />\n"; 
print "<title>WAMP</title>\n"; 
print "<meta name='Description' content='Website Under Construction' />\n"; 
print "</head>\n"; 
print "<body>\n"; 
print "<p>\n"; 

$temp = "£Hello"; 
$charArray = preg_split('//', $temp, -1); 
// preg_match_all('/./', $temp, $charArray); 

print_r ($charArray); 
print "<br />First Char: $temp[0]"; 

print "</p>\n"; 
print "</body>\n"; 
print "</html>"; 
?> 

输出:

Array ([0] => [1] => � [2] => � [3] => H [4] => e [5] => l [6] => l [7] => o [8] =>) 
First Char: � 

所需的输出:

Array ([0] => [1] £ [2] => H [3] => e [4] => l [5] => l [6] => o [7] =>) 
First Char: £ 
+0

我不知道PHP,但我知道这对正则表达式一个Unicode标志。当你执行'$ charArray = preg_split('// u',$ temp,-1)时,你会得到什么?''? –

+0

是的,这有效,但我真的这条线正常工作:if($ temp [0] =='£'){print'Yay!'} – skibulk

+0

我不明白你的意思。数组的第一项总是空的,因为空正则表达式匹配字符串开始处的空白空间。如何使用'preg_match_all('/./ u',$ temp,$ charArray);'? –

回答

1

而不是$temp[0]这是不是多字节意识到,尝试mb_substr()

if(mb_substr($temp, 0, 1, 'UTF-8') == '£') 
{ 
    ... 
} 
2

既然你要发送适当的内容类型标头的HTML,我猜你是通过运行这个Apache网络服务器。如果不是,那么请忽略我,但可能有一个设置在服务器配置的其他地方做这个...

我跑到这个问题之前,绝对一切都必须在UTF8模式下工作。

具体在这里,我怀疑你需要创建一个.htaccess文件在同一目录中包含这样的脚本:

AddDefaultCharset UTF-8 

的重新启动Apache明显。

这里另外要注意的,如果你打算使用MySQL数据库,您还需要确保连接是UTF8编码,通过连接后运行以下SQL命令:

SET NAMES utf8 
+0

谢谢Neil,我正在使用本地WAMP安装。我添加了.htaccess文件,但仍然收到相同的结果。我将连接到MySQL,所以感谢那个珍闻。我将进一步研究apache UTF8设置... – skibulk

+0

我可能错过了一件事,有时使用标头来设置内容类型还不够,而且您必须执行类似这也是(在PHP中): 'header(“Content-type:text/html; charset = utf-8”);' –