如何比较和输出拉丁字符?

时间:2012-09-26 13:57:08

标签: php comparison latin

我有一系列国家/地区,其中一个国家/地区的拉丁字符为“Å”:

$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]具有相同的效果,这会给我 。

4 个答案:

答案 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 UTF-8标头

将其添加到代码顶部:

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

我相信这会指示其他服务器和浏览器使用UTF-8而不是ANSI来解析此文档。你可以在这里阅读更多相关信息: Set HTTP header to UTF-8 using PHP

添加HTML UTF-8元标记

将此代码添加到您返回的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

将PHP文件保存为UTF-8,无BOM

默认情况下,您的文件通常会以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 BOMUTF-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)

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