2010-02-23 2 views
5

Я использую закодированную строку в качестве ключа в массиве, а также использует ту же строку в качестве значения в массиве, как показано ниже код указывает:PHP Array Key encoding?

$string = 'something in some encode'; 
$list = array(); 
$list[$string]['name'] = $string; 

, когда я print_r массив из (просто print_r без заголовков/кодировка), обнаружил, что ключ в массиве и его значение «имя» не являются такими же печатными, как одна и та же строка, похоже, что они имеют различную кодировку.

Я делаю это с китайским символом. В php.ini у меня нет конкретной строки кодирования (не знаю, имеет ли это какое-либо отношение к этому).

Есть ли что-нибудь о строковой кодировке в клавишах Array? Или просто я получил их неправильно? Спасибо за вашу помощь.

ответ

4

Я пытался на японском языке (как это то, что я могу проверить):

$test["要"]["name"] = "要"; 
print_r($test); 

И результат пошел хорошо, как ожидалось. Я использую UTF-8 для всего. Я не уверен, что проблема с настройками кодировки (в php.ini) или кодировкой, которую вы используете. если это проблема, почему бы вам не попробовать закодировать ее с помощью base64? (или другим кодером Ascii). Таким образом было бы что-то вроде:

$test["6KaB"]["name"] = "要"; 

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

+0

Ключи, закодированные в Oneway, не будут очень полезны для него и требуют больше времени для вычисления, просто добавляя строку через '$ test [] ='. Лучше кодировать их в первую очередь, поскольку длина ключа не ограничена. – initall

+0

Это полезно, спасибо! Хотя я не знаю, что вызывает проблему, но для людей это делается на моем пути, вы должны сделать base64/md5/sha в качестве ключа массива вместо закодированных строк. Таким образом, вы не столкнетесь с проблемой «множественных кодировок» в массиве. Все еще не знаю, связано ли это с php.ini. Если у меня будет время, я попробую попробовать. – CNBorn

+0

Приятно знать, что это было полезно. Другая идея состоит в том, чтобы преобразовать вашу кодировку в utf8, прежде чем передавать ее как ключ (в случае, если они не являются UTF8, что я догадываюсь). Хорошего дня. – lepe

3

Ключ типа integer или string.

Цитирую the manual

Строка является последовательность символов. Перед PHP 6 символ совпадает с байтом. То есть, существует ровно 256 различных символов. Это также подразумевает, что PHP не имеет встроенной поддержки Unicode. См. Utf8_encode() и utf8_decode() для некоторых основных функций Unicode.

Так что имеет смысл в вашем случае, чтобы закодировать строку, используемую в качестве ключа (или только ключ, зависит от того, что вы будете делать): utf8_encode()

0

Я не знаю, если вы можете кодировать правильно строку использовать их как ключи в массиве, но даже если можно использовать такие имена переменных:

  • $ élement = 'foo';
  • $ garçon = 'bar';

(обратите внимание на ç и ушного)

не рекомендуется. Вы не должны полагаться на это.

Возможно, вы бы указали на текущее английское имя или указали индексы.

Для utf8 encoding ознакомьтесь с руководством по php.

1

Вы просматриваете его в своем браузере?Затем вам необходимо указать кодировку:

header('Content-Type: text/plain; charset=UTF-8'); // or BIG5, or whatever

Вы просматриваете его в своем терминале? Убедитесь, что настройки вашего терминала установлены на ту же самую кодировку.

+0

Спасибо, я пробовал этот путь, но он не работает. Я не хочу, чтобы символы были читаемыми, но были точно такими же, как и utf-8, что я могу кодировать их в json. Как я уже сказал, я все еще могу знать, что у персонажей нет такой же кодировки, даже если у меня нет правильной настройки кодировки для их чтения. Потому что один и тот же (должен быть) отображается по-разному. – CNBorn

1

Просто попытался обеспечить столкновение, но этого не происходит.

PHP Version 5.3.6 (Mac OS 10.7.5)

$test["要"] = "要"; 

    for ($i=0;$i<5000000;$i++) { 
     $key = ""; 
     $num = $i; 
     while ($num != 0) { 
      $ascii = $num % 256; 
      $num = floor($num/256); 
      $key .= chr($ascii); 
     } 

     $test[$key] = 'boom'; 
     if ($test["要"] != 'boom') { 
      unset($test[$key]); 
     } 
    } 

    print_r($test); 

выходы:

Array ([要] => 要) 

нет столкновений.