2012-03-19 675 views
11

Estoy tratando de determinar qué factores ambientales u otros tienen una influencia en el resultado de una llamada al iconv() con la opción TRANSLIT.¿Qué factores influyen en una conversión satisfactoria de iconv() TRANSLIT?

El siguiente código tiene resultados diferentes para mí localmente cuando se ejecuta a través de Apache y CLI.

<?php 
    setlocale(LC_ALL, 'en_GB.UTF-8'); 
    header('Content-type: text/html; charset=utf-8'); // for web  

    $utf8_string = "Pádraig's naïve café"; 

    echo iconv('UTF-8', 'ASCII//IGNORE//TRANSLIT', $utf8_string); 
?> 

Resultado esperado: Padraig's naive cafe

Resultado en un navegador web: (empty string)

resultado de la CLI: P'adraig's na"ive cafe

En algunos sistemas, hago obtener el resultado esperado, pero no puedo' t atar exactamente por qué.

¿Qué factores influyen en la conversión y qué pasos debo seguir para aumentar las posibilidades de obtener un buen resultado?

+0

Su archivo fuente debe guardarse como un archivo utf-8. De lo contrario, su cadena no será en realidad utf-8 aunque le está diciendo a iconv que sí. – ontrack

+0

El archivo se guarda como UTF-8. – drewm

+0

¿Con qué sistemas obtiene el resultado correcto, no? ¿Cambia si se trata de un servidor Linux/Windows? – James

Respuesta

4

La ubicación es que influye en iconv transliteration. Sin embargo, debe leer la advertencia en la página de manual setlocale­Docs:

La información de configuración regional se mantiene por proceso, no por subproceso. Si está ejecutando PHP en una API de servidor multiproceso como IIS o Apache en Windows, puede experimentar cambios repentinos en la configuración regional mientras se ejecuta una secuencia de comandos, aunque la secuencia de comandos nunca se llamó setlocale(). Esto sucede debido a que otros scripts se ejecutan en diferentes subprocesos del mismo proceso al mismo tiempo, cambiando la configuración regional de todo el proceso utilizando setlocale().

Así que puede establecer la configuración regional, pero se ha cambiado en otro lugar. Siempre que la configuración regional sea exactamente la misma, obtendrá los mismos resultados.

Encontrará la documentación y el código fuente de iconv aquí: http://www.gnu.org/software/libiconv/ - esa es normalmente la biblioteca utilizada por PHP.

+0

Como puede ver en el ejemplo del código, la configuración regional es la misma, pero los resultados son diferentes. – drewm

+0

No se puede decir si la configuración regional es la misma, porque en el momento en que se usa puede ser diferente. Y no hay forma de que valides eso. Sin embargo, si echas un vistazo al código fuente de libiconv, verás que está basado en la configuración regional. – hakre

0

¿El setlocale es falso? ¿Qué estás ejecutando?

Puede intentar ejecutar locale -a en su cuadro para ver qué configuraciones regionales están instaladas, setlocale debe devolver la configuración regional que ha especificado.

Ejecutando el ejemplo anterior en centos con en_GB.UTF-8 en la lista locale -a devuelve el resultado esperado.

+0

'setlocale' devuelve' en_GB.UTF-8'. Esto está en Mac OS X 10.7.3. – drewm

Cuestiones relacionadas