PHP array_key_exists и UTF 8

У меня есть база данных, где кодировка UTF-8 для многоязычной цели. Я это, что все в моем приложении находится в UTF-8.

Хотя у меня проблема с функцией array_key_exists.

  1. Он начинается с запроса к базе данных

SELECT name, value from TABLE

  1. Затем я заполняю хэш-карту с результатом:

$hashmap[ $row['name'] ] = $row['value']

Но когда имя в БД содержит акценты типа «é», следующее возвращает 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, я бы предположил, что он закодирован на латинице-1. Таким образом, сравнение между байтовой последовательностью UTF-8 и последовательностью байт-1 байт не выполняется. Сохраните файлы исходного кода в UTF-8, и он должен работать (обратитесь к текстовому редактору).

Но когда имя в БД содержит акценты типа «é», следующее возвращает 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