0

我有一系列国家,其中一个国家有拉丁字符“Å”:

$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],我可以得到奥兰群岛的Å。Usingsubstr($name, 0, 1)与 具有相同的效果$name[0],这给了我�。

4

4 回答 4

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");
     }
}
于 2013-05-20T10:49:57.247 回答
2

问题是程序有不同的方式来表示不同的字符。这称为字符编码。您的浏览器、服务器和 PHP 代码目前对您使用的编码感到困惑,因为您将UTF-8字符与ANSI代码混合在一起。

您可以在此处了解有关编码的更多信息:http: //vlaurie.com/computers2/Articles/characters.htm

每当我构建一个 UTF-8 PHP 站点时,我都会做三件事。这三件事应该可以解决您的问题:

添加 PHP UTF-8 标头

将此添加到代码的顶部:

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

我相信这会指示其他服务器和您的浏览器使用 UTF-8 而不是 ANSI 解析此文档。您可以在此处阅读有关此内容的更多信息: 使用 PHP 将 HTTP 标头设置为 UTF-8

添加 HTML UTF-8 元标记

将此代码添加到您返回的 HTML 的顶部:

<!doctype html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
...

这也指示您的浏览器以 UTF-8(而不是 ANSI)读取字符。您可以在此处阅读有关此内容的更多信息: 使用 PHP 将 HTTP 标头设置为 UTF-8

将 PHP 文件另存为不带 BOM 的 UTF-8

默认情况下,您的文件通常以正确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 问题。

于 2012-09-26T15:12:02.460 回答
1

问号是因为您的查看器(浏览器)试图显示当前字符集中不支持的字符。为什么在使用 $name[0] 访问第一个字符时会发生这种情况,我不确定。

基于此处的帖子: PHP:将特定波斯尼亚字符转换为非波斯尼亚字符(utf8 标准字符)

我尝试了以下方法:

$result = iconv("UTF-8", "ASCII//TRANSLIT", $test);

$result 现在包含奥兰群岛,特殊字符被转换为其正常版本。

$result[0] 现在应该包含 A。

于 2012-09-26T14:08:59.797 回答
0

请为文件(存储的代码)设置字符编码并输出

于 2012-09-26T14:11:26.647 回答