PHP Array Key encoding?

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

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

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

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

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

Я пробовал по-японски (как я могу проверить):

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

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

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

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

Ключ имеет тип integer или string.

Процитировать руководство

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

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

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

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

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

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

PHP версии 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); с  $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 ( [要] => 要 ) 

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

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

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

(обратите внимание на ç и é )

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

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

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