PHP array_key_exists и UTF 8 - PullRequest
       1

PHP array_key_exists и UTF 8

3 голосов
/ 12 января 2012

У меня есть база данных, где кодировка 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) 

Я не знаю, как дальше с этим, вы сталкивались с проблемой?

У меня есть требование к производительности.

Спасибо за вашу помощь.

Ответы [ 4 ]

3 голосов
/ 12 января 2012

Ключ массива кодируется в UTF-8, если он действительно поступает в виде строки UTF-8 из базы данных. Очевидно, ваш файл исходного кода не закодирован в UTF-8, я бы предположил, что он закодирован в Latin-1. Поэтому сравнение между байтовой последовательностью UTF-8 и байтовой последовательностью Latin-1 является неудачным. Сохраните файлы исходного кода в UTF-8, и он должен работать (обратитесь к текстовому редактору).

1 голос
/ 12 января 2012

Но когда имя в БД содержит такие акценты, как 'é', следующее возвращает false: array_key_exists ('namé', $ hashmap)

Увы, до сих пор строки в PHP не кодировались в UTF-8. Я полагаю, вам придется кодировать их самостоятельно:

<?php
array_key_exists(utf8_encode('namé'), $hashmap);
0 голосов
/ 12 января 2012

@ Berry

Действительно, когда я строю хэш-карту, отлаживая, я получаю следующее:

 $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
0 голосов
/ 12 января 2012

Код:

<?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.

...