2010-02-23 17 views
5

Puedo utilizar una cadena codificada como una clave en la matriz, y también utiliza la misma cadena como un valor en la matriz, como a continuación código indica:PHP Array ¿Codificación de teclas?

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

cuando print_r la matriz hacia fuera (justo print_r sin cabeceras/codificación específica), encontró que la clave en la matriz y su valor 'nombre' no están tan impresas como una misma cadena, parece tener una codificación diferente.

Estoy haciendo esto con carácter chino. En php.ini no tengo una línea de codificación específica (No sé si tiene algo que ver con esto).

¿Hay algo sobre la codificación de cadena en las teclas Array? ¿O simplemente los puse de una manera incorrecta? Gracias por tu ayuda.

Respuesta

4

me trataron en japonés (como es lo que puedo probar):

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

Y el resultado fue muy bien, como se esperaba. Estoy usando UTF-8 para todo. No estoy seguro de si es un problema con la configuración de codificación (en php.ini) o la codificación que está utilizando. si eso es un problema, ¿por qué no intentas codificarlo con base64? (u otro codificador Ascii). De esa manera sería algo así como:

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

No estoy seguro de lo que es su objetivo, por lo que me haga saber si era útil.

+0

Las claves codificadas de Oneway no serían muy útiles para él y le tomaría más tiempo calcular simplemente agregando cadenas mediante '$ test [] ='. Es mejor codificarlos en primer lugar ya que la longitud de la clave no está limitada. – initall

+0

Esto es útil, ¡Gracias! Aunque no sé cuál es la causa del problema, pero la gente lo está haciendo a mi manera, debe hacer cosas de base64/md5/sha como clave de matriz en lugar de cadenas codificadas. Por lo tanto, no encontrará el problema de 'múltiples codificaciones' en una matriz. Aún no sé si esto está relacionado con php.ini. Si tengo tiempo, intentaré probarlo. – CNBorn

+0

Bueno saber que fue útil. Otra idea es convertir tu codificación a utf8 antes de pasarla como clave (en caso de que no sean UTF8, supongo). Que tengas un buen día. – lepe

3

Una clave es del tipo entero o cadena.

Para citar the manual

Una cadena es una serie de caracteres. Antes de PHP 6, un personaje es lo mismo que un byte. Es decir, hay exactamente 256 caracteres diferentes posibles. Esto también implica que PHP no tiene soporte nativo de Unicode. Ver utf8_encode() y utf8_decode() para algunas funciones básicas de Unicode.

Así que tiene sentido en su caso para codificar la cadena que se utiliza como clave (o sólo la clave, depende de lo que va a hacer): utf8_encode()

0

no sé si se puede codificar correctamente cuerdas para usarlos como claves en una matriz, pero incluso si es posible utilizar dichos nombres de variables:

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

(Nota del ç y la é)

no se recomienda. No deberías confiar en esto.

Probablemente mapearías con el nombre inglés actual o usar índices.

Para utf8 encoding, eche un vistazo al manual php.

1

¿Lo está viendo a través de su navegador?A continuación, debe especificar la codificación:

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

¿Lo está viendo en su terminal? Asegúrese de que la configuración de su terminal esté configurada con la misma codificación.

+0

Gracias, lo he intentado de esta manera, pero no está funcionando. No quiero que los personajes sean legibles sino que sean exactamente los mismos que los codifico para utf-8 que puedo codificarlos para json. Como dije, aún puedo saber que los caracteres no están en la misma codificación, incluso si no tengo una configuración de codificación adecuada para leerlos. Porque el mismo (debería ser) se muestra de manera diferente. – CNBorn

1

Acabo de intentar forzar una colisión, pero no sucede.

PHP versión 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); 

salidas:

Array ([要] => 要) 

ninguna colisión.