Я использую закодированную строку как ключ в массиве, а также использует ту же строку, что и значение в массиве, как показано ниже:
$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 ( [要] => 要 )
нет столкновения.
Я не знаю, можете ли вы правильно закодировать строку, чтобы использовать их как ключи в массиве, но даже если можно использовать такие имена переменных:
(обратите внимание на ç и é )
Это не рекомендуется. Вы не должны полагаться на это.
Вероятно, вы бы указали текущее английское имя или указали индексы.
Для кодирования utf8 ознакомьтесь с руководством по php.