PHP array_key_exists和UTF 8

时间:2012-01-12 13:36:01

标签: php arrays encoding utf-8 character-encoding

我有一个数据库,编码为UTF-8,用于多语言目的。 我知道我的应用程序中的所有内容都是UTF-8。

虽然我对array_key_exists函数有问题。

  1. 首先是对数据库的查询
  2. SELECT name, value from TABLE

    1. 然后我用结果填充哈希映射:
    2. $hashmap[ $row['name'] ] = $row['value']

      但是当DB中的名称包含像'é'这样的重音时,以下内容将返回false:

      $this->db->select('name');
      $this->db->select('value');
      $this->db->from('table');
      $q = $this->db->get();
      $res = $q->result_array();
      
          foreach ($res as $value) {
              $hashmap[$value['name']] = $value['value'];
          }
      
      $key = 'name é'; // an ord here returns 233
      array_key_exists($key, $hashmap) 
      

      我不知道如何更进一步,你遇到了这个问题吗?

      我有性能要求。

      感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

如果数组密钥确实来自数据库的UTF-8字符串,则它以UTF-8编码。显然你的源代码文件不是用UTF-8编码的,我猜它是用Latin-1编码的。因此,UTF-8字节序列和Latin-1字节序列之间的比较是不成功的。以UTF-8保存源代码文件,它应该可以工作(请咨询您的文本编辑器)。

答案 1 :(得分:1)

  

但是当DB中的名称包含像'é'这样的重音时,以下内容返回false:array_key_exists('namé',$ hashmap)

唉,到目前为止,PHP中的字符串不是UTF-8编码的。我相信你必须自己编码:

<?php
array_key_exists(utf8_encode('namé'), $hashmap);

答案 2 :(得分:0)

代码:

<?php
$foo = array('namé' => 1);
var_dump($foo);
var_dump(array_key_exists('namé', $foo));
var_dump(isset($foo['namé']));

输出:

array(1) {
  ["namé"]=>
  int(1)
}
bool(true)
bool(true)

PHP版本:

PHP 5.3.3 (cli) (built: Sep 13 2011 11:17:59)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

在PHP 5.3.3中似乎对我没用。

答案 3 :(得分:0)

@Berry

的确,当我构建hashmap时,调试我得到了这个:

 $res = getDATABASEVALUES();
 //res contains 20 rows, the number 11 has accent
 $res[11]['name'] => returns 'name é'
 ord($res[11]['name'][5]) => returns 195 and not 233