簡體   English   中英

PHP array_key_exists和UTF 8

[英]PHP array_key_exists and UTF 8

我有一個數據庫,編碼為UTF-8,用於多語言目的。 我知道我的應用程序中的所有內容都是UTF-8。

雖然我有array_key_exists函數的問題。

  1. 它首先是對數據庫的查詢

SELECT name, value from TABLE

  1. 然后我用結果填充哈希映射:

$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) 

我不知道怎么走得更遠,你遇到了這個問題嗎?

我有性能要求。

謝謝你的幫助。

如果數組密鑰確實是來自數據庫的UTF-8字符串,則它以UTF-8編碼。 顯然你的源代碼文件不是用UTF-8編碼的,我猜它是用Latin-1編碼的。 因此,UTF-8字節序列和Latin-1字節序列之間的比較是不成功的。 以UTF-8保存源代碼文件,它應該工作(請咨詢您的文本編輯器)。

但是當DB中的名稱包含“é”等重音符時,以下內容返回false:array_key_exists('namé',$ hashmap)

唉,到目前為止,PHP中的字符串不是UTF-8編碼的。 我相信你必須自己編碼:

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

碼:

<?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中,它似乎對我沒用。

@漿果

實際上,當我構建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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM