【问题标题】:How to compare and output latin characters?如何比较和输出拉丁字符?
【发布时间】:2012-09-18 04:17:35
【问题描述】:

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

$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],我可以在奥兰群岛获得Å。使用substr($name, 0, 1)$name[0] 具有相同的效果,这给了我...。

【问题讨论】:

    标签: php comparison latin


    【解决方案1】:

    将您的脚本更改为此。 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");
         }
    }
    

    【讨论】:

    • 感谢您的回答。不错!
    【解决方案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 文件另存为不带 BOM 的 UTF-8

    默认情况下,您的文件通常以ANSI encoding. If you want to work with international characters, then you need to save them inUTF-8encoding. 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 问题。

    【讨论】:

    • 感谢您的全面回答,前两件事已经完成。如何检查 PHP 文件是否保存为没有 BOM 的 UTF-8?
    • 这取决于您的文本编辑器。我使用Notepad++,它显示了Encoding 菜单下的编码:phpbb.com/kb/images/585_encoding.jpg。如果您使用的是普通记事本,那么它可能被保存为 ANSI。
    • 我正在使用 gedit,它没有设置编码的选项。有没有办法找出它使用的是什么编码?
    • 我没用过gedit,不过好像可以写个PHP脚本来检测文件编码:stackoverflow.com/questions/505562/detect-file-encoding-in-php
    【解决方案3】:

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

    根据这里的帖子: PHP: Convert specific-Bosnian characters to non-bosnian (utf8 standard chars)

    我尝试了以下方法:

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

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

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

    【讨论】:

    • 这根本不能回答我的问题... :(
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2010-12-12
      • 1970-01-01
      • 2013-10-21
      • 2017-04-14
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多