php - utf8_decode - ¿Cómo convierto Word Smart quotes y em guiones en una cadena?
utf8_encode php ejemplo (13)
La base de datos mysql está usando codificación UTF-8. Del mismo modo, las páginas html que muestran el contenido están usando UTF-8.
El contenido del HTML puede estar en UTF-8, sí, pero ¿está estableciendo explícitamente el tipo de contenido (codificación) de sus páginas HTML (generado a través de PHP?) A UTF-8 también? Intente devolver un encabezado Content-Type
de "text/html;charset=utf-8"
o agregue etiquetas <meta>
a sus HTML:
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
De esta forma, el tipo de contenido de los datos enviados a PHP también será el mismo.
Tuve un problema similar y agregué la etiqueta <meta>
que me funcionó.
Tengo un formulario con un área de texto. Los usuarios ingresan un bloque de texto que se almacena en una base de datos.
Ocasionalmente, un usuario pegará texto de Word que contenga comillas o emdashes inteligentes. Esos caracteres aparecen en la base de datos como: â € ", â € ™, â € œ, â € œ
¿Qué función debo invocar en la cadena de entrada para convertir las comillas inteligentes en comillas regulares y emdashes en guiones regulares ?
Estoy trabajando en PHP.
Actualización: Gracias por todas las excelentes respuestas hasta ahora. La página en el sitio de Joel sobre codificaciones es muy informativa: http://www.joelonsoftware.com/articles/Unicode.html
Algunas notas sobre mi entorno:
La base de datos MySQL está usando codificación UTF-8. Del mismo modo, las páginas HTML que muestran el contenido están utilizando UTF-8 (Actualización :) estableciendo explícitamente el tipo de contenido meta.
En esas páginas, las comillas y emdashes inteligentes aparecen como un diamante con signo de interrogación.
Solución:
Gracias nuevamente por las respuestas. La solución fue doble:
- Asegúrese de que la base de datos y los archivos HTML estén explícitamente configurados para usar la codificación UTF-8.
- Use
htmlspecialchars()
lugar dehtmlentities()
.
A menudo utilizamos funciones estándar de reemplazo de cadenas para eso. Aunque la naturaleza de ASCII / Unicode en ese contexto es bastante turbia, funciona. Solo asegúrate de que tu archivo php esté guardado en el formato de codificación correcto, etc.
Debe asegurarse de que su conexión de base de datos esté configurada para aceptar y proporcionar UTF-8 desde y hacia el cliente (de lo contrario, se convertirá a "predeterminado", que generalmente es latin1).
En la práctica esto significa ejecutar una consulta SET NAMES ''utf8'';
http://www.phpwact.org/php/i18n/utf-8/mysql
Además, las comillas inteligentes son parte del juego de caracteres windows-1252, no iso-8859-1 (latin-1). No es muy relevante para su problema, pero solo para su información. El símbolo del euro está allí también.
Debe cambiar manualmente la intercalación de columnas individuales a UTF8; cambiar la base de datos en general no los alterará.
Desafortunadamente, este es un problema demasiado común, no ayudado por el muy pobre manejo de conjuntos de caracteres de PHP.
Lo que hacemos es forzar el texto a través de iconv
// Convert input data to UTF8, ignore any odd (MS Word..) chars
// that don''t translate
$input = iconv("ISO-8859-1","UTF-8//IGNORE",$input);
La bandera //IGNORE
significa que todo lo que no se puede traducir será descartado.
Si agrega la cadena // IGNORE, los caracteres que no se pueden representar en el juego de caracteres objetivo se descartan en silencio.
En mi experiencia, es más fácil simplemente aceptar las citas inteligentes y asegurarse de que está usando la misma codificación en todas partes. Para comenzar, agregue esto a su etiqueta de formulario: accept-charset="utf-8"
En realidad, el problema no está sucediendo en PHP, pero está sucediendo en JavaScript, se debe copiar / pegar desde Word, por lo que debe resolver su problema en JavaScript antes de pasar el texto a PHP. Consulte esta respuesta https://.com/a/6219023/1857295 .
Esto suena como un problema Unicode. Joel Spolsky tiene un buen punto de partida sobre el tema: http://www.joelonsoftware.com/articles/Unicode.html
Parece que el verdadero problema es que su base de datos no está utilizando la misma codificación de caracteres que su página (que probablemente debería ser UTF-8). En ese caso, si un usuario envía un carácter que no sea ASCII, probablemente verá caracteres extraños en la base de datos. Encontrar y corregir solo algunos de ellos (comillas y guiones rizados) no va a resolver el problema real.
Aquí hay información sobre la migración de su base de datos a otra codificación de caracteres , al menos para una base de datos MySQL.
Puede probar mb_ convert_encoding de ISO-8859-1 a UTF-8.
$str = mb_convert_encoding($str, ''UTF-8'', ''ISO-8859-1'');
Esto supone que desea UTF-8, y convert puede encontrar reemplazos razonables ... si no, mb_str_replace o preg_replace them yourself.
Puede que esta no sea la mejor solución, pero intentaré probar para descubrir qué ve PHP. Digamos que ve "â €" "(hay algunas otras posibilidades, como simple" "" o tal vez "& # 8220;"). Luego haga un str_replace para deshacerse de todos esos y reemplácelos con comillas normales, antes de rellenar la respuesta en una base de datos.
La mejor solución probablemente implique hacer que los datos de extremo a extremo pasen todos los UTF-8, ya que las personas están tratando de ayudar con otras respuestas.
el problema está en el juego de caracteres mysql, arreglé mis problemas con esta línea de código.
mysql_set_charset(''utf8'',$link);
Si estabas buscando escapar de estos personajes para la web mientras conservas su apariencia, tus cadenas aparecerán así: "¡Es agradable!" En lugar de "Es aburrido" ...
Puedes hacer esto usando tu propia función htmlEncode en lugar de las htmlentities () de PHP:
$trans_tbl = false;
function htmlEncode($text) {
global $trans_tbl;
// create translation table once
if(!$trans_tbl) {
// start with the default set of conversions and add more.
$trans_tbl = get_html_translation_table(HTML_ENTITIES);
$trans_tbl[chr(130)] = ''‚''; // Single Low-9 Quotation Mark
$trans_tbl[chr(131)] = ''ƒ''; // Latin Small Letter F With Hook
$trans_tbl[chr(132)] = ''„''; // Double Low-9 Quotation Mark
$trans_tbl[chr(133)] = ''…''; // Horizontal Ellipsis
$trans_tbl[chr(134)] = ''†''; // Dagger
$trans_tbl[chr(135)] = ''‡''; // Double Dagger
$trans_tbl[chr(136)] = ''ˆ''; // Modifier Letter Circumflex Accent
$trans_tbl[chr(137)] = ''‰''; // Per Mille Sign
$trans_tbl[chr(138)] = ''Š''; // Latin Capital Letter S With Caron
$trans_tbl[chr(139)] = ''‹''; // Single Left-Pointing Angle Quotation Mark
$trans_tbl[chr(140)] = ''Œ''; // Latin Capital Ligature OE
// smart single/ double quotes (from MS)
$trans_tbl[chr(145)] = ''‘'';
$trans_tbl[chr(146)] = ''’'';
$trans_tbl[chr(147)] = ''“'';
$trans_tbl[chr(148)] = ''”'';
$trans_tbl[chr(149)] = ''•''; // Bullet
$trans_tbl[chr(150)] = ''–''; // En Dash
$trans_tbl[chr(151)] = ''—''; // Em Dash
$trans_tbl[chr(152)] = ''˜''; // Small Tilde
$trans_tbl[chr(153)] = ''™''; // Trade Mark Sign
$trans_tbl[chr(154)] = ''š''; // Latin Small Letter S With Caron
$trans_tbl[chr(155)] = ''›''; // Single Right-Pointing Angle Quotation Mark
$trans_tbl[chr(156)] = ''œ''; // Latin Small Ligature OE
$trans_tbl[chr(159)] = ''Ÿ''; // Latin Capital Letter Y With Diaeresis
ksort($trans_tbl);
}
// escape HTML
return strtr($text, $trans_tbl);
}