我有一系列国家/地区,其中一个国家/地区的拉丁字符为“Å”:
$country["af"] = "Afghanistan";
$country["ax"] = "Åland Islands";
$country["al"] = "Albania";
循环浏览此数组并执行国家/地区名称的第一个字符比较时,我无法匹配拉丁字符。
foreach($country as $cc => $name)
{
if($name[0] == "Å")
{
echo "matched";
}
else
{
echo $name[0];
}
}
我得到的结果是:A A
为什么拉丁字符Å成为 ,我如何进行适当的比较并输出拉丁字符Å?
添加注意:http标头和html文档已被指定为UTF-8格式。
添加注2:如果我只是回复$name
而不是$name[0]
,我就可以在Åland群岛获得Å。使用substr($name, 0, 1)
与$name[0]
具有相同的效果,这会给我 。
答案 0 :(得分:4)
将脚本更改为此。 unicode编码字不能与普通字符串函数一起爆炸。您必须使用多字节功能。
foreach($country as $cc => $name)
{
if(mb_substr($name,0,1,"UTF-8") == "Å")
{
echo "matched";
}
else
{
echo mb_substr($name,0,1,"UTF-8");
}
}
答案 1 :(得分:2)
问题是程序有不同的方式来表示不同的字符。这称为字符编码。您的浏览器,服务器和PHP代码目前对您正在使用的编码感到困惑,因为您将UTF-8
个字符与ANSI
代码混合在一起。
您可以在此处详细了解编码: http://vlaurie.com/computers2/Articles/characters.htm
每当我构建一个UTF-8 PHP站点时,我都会做三件事。这三件事应该可以解决您的问题:
将其添加到代码顶部:
<?php
header('Content-Type: text/html; charset=utf-8');
...
我相信这会指示其他服务器和浏览器使用UTF-8而不是ANSI来解析此文档。你可以在这里阅读更多相关信息: Set HTTP header to UTF-8 using PHP
将此代码添加到您返回的HTML的顶部:
<!doctype html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
...
这也指示您的浏览器读取UTF-8(而不是ANSI)中的字符。你可以在这里阅读更多相关信息: Set HTTP header to UTF-8 using PHP
默认情况下,您的文件通常会以ANSI
编码. If you want to work with international characters, then you need to save them in
UTF-8 encoding. This will let you work with the
Å`字符正确保存。
如果您将Notepad ++作为文本编辑器,则可以在“编码”菜单下设置文档的编码。将其设置为Encode in UTF-8 without BOM
。
疑难杂症
UTF-8 without BOM
与UTF-8
不同。 UTF-8文件通常附有3个字节的数据,表明该文件是UTF-8文件。这称为Byte Order Mark
(BOM)。您可以在此处详细了解BOM:http://www.arclab.com/products/amlc/utf-8-php-cannot-modify-header-information.html
大多数程序无论如何都可以告诉该文件是UTF-8,因此BOM是多余的。如果您在没有BOM的情况下保存,则可能会收到如下错误消息:
Warning: Cannot modify header information – headers already sent
如果您看到此错误消息,则可能存在BOM问题。
答案 2 :(得分:1)
问号是因为您的查看器(浏览器)正在尝试显示当前字符集中不支持的字符。为什么在使用$ name [0]访问第一个字符时会发生这种情况我不确定。
根据这里的帖子: PHP: Convert specific-Bosnian characters to non-bosnian (utf8 standard chars)
我尝试了以下内容:
$ result = iconv(“UTF-8”,“ASCII // TRANSLIT”,$ test);
$ result现在包含奥兰群岛,特殊字符转换为正常版本。
$ result [0]现在应该包含A。
答案 3 :(得分:0)
请为文件(存储代码)设置字符编码并输出