【问题标题】:strange character encoding issues with strings字符串的奇怪字符编码问题
【发布时间】:2011-11-22 13:55:32
【问题描述】:

看似简单的操作完全被这里的编码搞砸了。我只想检查字符串的第一个字符是否为 £。我的 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: £

【问题讨论】:

  • 我不懂 PHP,但我知道它有一个用于正则表达式的 Unicode 标志。当您执行$charArray = preg_split('//u', $temp, -1); 时,您会得到什么?
  • 是的,这行得通,但我真的这条线可以正常工作:if($temp[0]=='£'){print 'Yay!'}
  • 我不明白你的意思。数组的第一项将始终为空,因为空的正则表达式 // 与字符串开头的空白空间匹配。用preg_match_all('/./u', $temp, $charArray);怎么样?
  • 我包含了 preg_match 行,以表明我通过两种方式获得了相同的结果。让我们忘记那条线。我真正想要的是通过 string[position] 语法读取第一个字符。
  • if($temp[1]=='£'){print 'Yay!'} 工作吗?

标签: php string encoding utf-8 character


【解决方案1】:

鉴于您正在发送带有适当内容类型标头的 HTML,我猜您正在通过 Apache 网络服务器运行它。如果不是那么请忽略我,但服务器配置中的其他地方可能有一个设置来执行此操作...

我之前遇到过这个问题,而且绝对一切都必须在 UTF8 模式下才能正常工作。

具体来说,我怀疑您需要在与脚本相同的目录中创建一个 .htaccess 文件,其中包含以下内容:

AddDefaultCharset UTF-8

显然重启了Apache。

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

SET NAMES utf8

【讨论】:

  • 谢谢 Neil,我正在本地 WAMP 安装上运行它。我添加了 .htaccess 文件,但仍然收到相同的结果。我将连接到 MySQL,所以谢谢你的花絮。我将进一步研究 apache UTF8 设置...
  • 我可能错过了一件事情,有时使用 标头来设置内容类型还不够,您还必须这样做(在 PHP 中):header("Content-type: text/html; charset=utf-8");
【解决方案2】:

代替不支持多字节的$temp[0],试试mb_substr()

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多