У меня есть база данных, где кодировка UTF-8 для многоязычной цели. Я это, что все в моем приложении находится в UTF-8.
Хотя у меня проблема с функцией array_key_exists.
SELECT name, value from TABLE
$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