2011-01-25 30 views
24

Aún no entiendo cómo funciona iconv.PHP: Tratar caracteres especiales con iconv

Por ejemplo,

$string = "Löic & René"; 
$output = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string); 

consigo,

Aviso: iconv() [function.iconv]: detecta un carácter no válido en la entrada cadena en ...

$string = "Löic"; o $string = "René";

consigo,

Aviso:. iconv() [function.iconv]: detecta un carácter multibyte incompleta en cadena de entrada en

no consigo nada con $string = "&";

Hay dos conjuntos de diferentes salidas que necesito almacenarlos en los dos diferentes columnas dentro de la tabla de mi base de datos,

  1. que necesitan para convertir a Löic & RenéLoic & Rene de URL limpia pu rposes.

  2. tengo que mantenerlos lo que son - como Löic & RenéLöic & René entonces sólo convertirlos con htmlentities($string, ENT_QUOTES); al mostrarlos en mi página html.

he intentado con algunas de las sugerencias en php.net abajo, pero todavía no trabajo,

que tenía una situación en la que necesitaba algunos caracteres transliterados, pero los otros ignorados (por diacríticos extrañas como Ayn o hamza). Agregar // TRANSLIT // IGNORE pareció ser el truco para mí. Transcribe todo lo que se puede transcribir, pero luego arroja cosas que no pueden ser transcritas.

Así:

$string = "ʿABBĀSĀBĀD"; 

echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $string); 
// output: [nothing, and you get a notice] 

echo iconv('UTF-8', 'ISO-8859-1//IGNORE', $string); 
// output: ABBSBD 

echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT//IGNORE', $string); 
// output: ABBASABAD 
// Yay! That's what I wanted! 

y otro,

Andries Seutens 07-Nov-2009 07:38 
When doing transliteration, you have to make sure that your LC_COLLATE is properly set, otherwise the default POSIX will be used. 

To transform "rené" into "rene" we could use the following code snippet: 
setlocale(LC_CTYPE, 'nl_BE.utf8'); 

$string = 'rené'; 
$string = iconv('UTF-8', 'ASCII//TRANSLIT', $string); 

echo $string; // outputs rene 

¿Cómo puedo trabajar realmente a cabo?

Gracias.

EDIT:

Este es el archivo de origen que probar el código,

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" class="no-js"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
</head> 
<?php 
$string = "Löic & René"; 
$output = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string); 
?> 
</html> 
+0

Por cierto: ¿te das cuenta de que 'ö' &' é' están en ISO-8859-1?Además del conjunto de caracteres de entrada incorrecto, es posible que desee modificar su juego de caracteres de salida a 'ASCII // TRANSLIT'. – Wrikken

+7

Estoy tan confundido con estos conjuntos ... – laukok

+1

¡Gracias! Tuve que descifrar algunos caracteres coreanos en UTF-8 y fue un verdadero dolor de cabeza; finalmente, lo único que me ayudó fue: '$ converted = iconv ('EUC-KR', 'UTF-8 // TRANSLIT', $ data); ' – ShayLivyatan

Respuesta

12

Y qué se guarda el archivo de origen en codificación UTF-8? Si no (y supongo que no lo hizo porque generará el error de "carácter multibyte incompleto"), intente eso primero.

+0

Probablemente la respuesta (o si las cadenas no se originan en el archivo/a, conjunto de caracteres incorrectos para cualquier fuente (db, http, etc.) de datos. Una cosa es cierta: la entrada no es utf-8. – Wrikken

+0

@wimvds: gracias. ¿Cómo guardo mi archivo fuente en codificación UTF-8? Consulte mi edición anterior - Tengo utf-8 en mi meta - ¿Es correcto? – laukok

+0

@lauthiamkok: Si aún está probando los ejemplos anteriores, utilice un buen editor/IDE que le permita seleccionar la codificación del archivo (es decir, Notepad ++ en Windows, Eclipse/NetBeans en cualquier sistema operativo principal). Para la entrada de páginas web, debe usar metaetiquetas o las llamadas de encabezado relevantes (o preferiblemente ambos) y cuando uses MySQL, asegúrate de abrir ese en modo UTF-8 también ('SET NAMES 'utf-8''). – wimvds

18
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', utf8_encode($s)); 
+3

+1, 'utf8_encode()' solo funcionó bien para mí, gracias! – John

+8

Tenga en cuenta que 'utf8_encode()' solo convertirá ISO-8859-1 a UTF-8 –

+1

Fragmento excelente. Encontré el aviso en la conversión del nombre de archivo y esta solución resolvió brillantemente mi problema. – Giorgio

Cuestiones relacionadas