utf8 - ufeff php remove
Reparar la codificación UTF8 rota (12)
Como señaló Dan: necesitas convertirlos a formato binario y luego convertir / corregir la codificación.
Por ejemplo, para utf8 almacenado como latin1, el siguiente SQL lo arreglará:
UPDATE table
SET field = CONVERT( CAST(field AS BINARY) USING utf8)
WHERE $broken_field_condition
Estoy en el proceso de corregir algunas malas codificaciones UTF8. Actualmente estoy usando PHP 5 y MySQL
En mi base de datos tengo algunas instancias de malas codificaciones que imprimen como: î
- La intercalación de la base de datos es utf8_general_ci
- PHP está usando un encabezado UTF8 adecuado
- Notepad ++ está configurado para usar UTF8 sin BOM
- la administración de la base de datos se maneja en phpMyAdmin
- no todos los casos de caracteres acentuados están rotos
Lo que necesito es algún tipo de función que me ayude a mapear las instancias de î, ÃÂ, ü y otras similares a sus propios caracteres UTF8 acentuados.
Encontré una solución después de días de búsqueda. Mi comentario va a ser enterrado, pero de todos modos ...
Obtengo los datos corruptos con php.
No uso nombres de conjuntos UTF8
Uso utf8_decode () en mis datos
Actualizo mi base de datos con mis nuevos datos decodificados, aún sin usar los nombres de conjunto UTF8
y voilá :)
Este script tuvo un buen enfoque. Convertirlo al idioma que elijas no debería ser demasiado difícil:
http://plasmasturm.org/log/416/
#!/usr/bin/perl
use strict;
use warnings;
use Encode qw( decode FB_QUIET );
binmode STDIN, '':bytes'';
binmode STDOUT, '':encoding(UTF-8)'';
my $out;
while ( <> ) {
$out = '''';
while ( length ) {
# consume input string up to the first UTF-8 decode error
$out .= decode( "utf-8", $_, FB_QUIET );
# consume one character; all octets are valid Latin-1
$out .= decode( "iso-8859-1", substr( $_, 0, 1 ), FB_QUIET ) if length;
}
print $out;
}
La forma es convertir a binario y luego corregir la codificación
Otra cosa para comprobar, que resultó ser mi solución (que se encuentra here ), es cómo se devuelven los datos de su servidor. En mi aplicación, estoy usando PDO para conectarme de PHP a MySQL. Necesitaba agregar una bandera a la conexión que decía recuperar los datos en formato UTF-8
La respuesta fue
$dbHandle = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES ''utf8''"));
Parece que tu utf-8 se interpreta como iso8859-1 o Win-1250 en algún momento.
Cuando dices "En mi base de datos tengo algunas instancias de malas codificaciones", ¿cómo lo verificaste? A través de su aplicación, phpmyadmin o el cliente de línea de comando? ¿Están apareciendo todas las codificaciones de utf-8 así o solo algunas? ¿Es posible que tengas las codificaciones incorrectas y se haya convertido incorrectamente de iso8859-1 a utf-8 cuando ya era utf-8?
Sé que esto no es muy elegante, pero después de que se mencionó que las cuerdas pueden estar codificadas en doble, hice esta función:
function fix_double encoding($string)
{
$utf8_chars = explode('' '', ''À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö'');
$utf8_double_encoded = array();
foreach($utf8_chars as $utf8_char)
{
$utf8_double_encoded[] = utf8_encode(utf8_encode($utf8_char));
}
$string = str_replace($utf8_double_encoded, $utf8_chars, $string);
return $string;
}
Esto parece funcionar perfectamente para eliminar la doble codificación que estoy experimentando. Probablemente me pierdan algunos de los personajes que podrían ser un problema para otros. Sin embargo, para mis necesidades, está funcionando perfectamente.
Si utf8_encode()
en una cadena que ya es UTF-8, parece distorsionada cuando se codifica varias veces.
Hice una función toUTF8()
que convierte cadenas en UTF-8.
No necesita especificar cuál es la codificación de sus cadenas. Puede ser Latin1 (iso 8859-1), Windows-1252 o UTF8, o una combinación de estos tres.
Lo usé yo mismo en un feed con codificaciones mixtas en la misma cadena.
Uso:
$utf8_string = Encoding::toUTF8($mixed_string);
$latin1_string = Encoding::toLatin1($mixed_string);
Mi otra función, fixUTF8()
arregla cadenas UTF8 ilegibles si fueron codificadas en UTF8 varias veces.
Uso:
$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
Ejemplos:
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
dará salida:
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Descargar:
Si tiene caracteres UTF8 codificados en doble (varias comillas inteligentes, guiones, apóstrofo '', comillas â € œ, etc.), en mysql puede volcar los datos y luego leerlos nuevamente para corregir la codificación rota.
Me gusta esto:
mysqldump -h DB_HOST -u DB_USER -p DB_PASSWORD --opt --quote-names /
--skip-set-charset --default-character-set=latin1 DB_NAME > DB_NAME-dump.sql
mysql -h DB_HOST -u DB_USER -p DB_PASSWORD /
--default-character-set=utf8 DB_NAME < DB_NAME-dump.sql
Esta fue una solución al 100% para mi UTF-8 con doble codificación.
Fuente: http://blog.hno3.org/2010/04/22/fixing-double-encoded-utf-8-data-in-mysql/
Tuve que tratar de "arreglar" varias situaciones rotas de UTF8 en el pasado, y desafortunadamente nunca es fácil, y muchas veces bastante imposible.
A menos que pueda determinar exactamente cómo se rompió, y siempre se rompió de la misma manera, entonces será difícil "deshacer" el daño.
Si quieres tratar de deshacer el daño, tu mejor opción sería comenzar a escribir un código de muestra, donde intentarás numerosas variaciones en las llamadas a mb_convert_encoding () para ver si puedes encontrar una combinación de ''de'' y ''a'' que arregla tus datos Al final, a menudo es mejor no preocuparse por arreglar los datos antiguos debido a los niveles de dolor involucrados, sino simplemente arreglar las cosas en el futuro.
Sin embargo, antes de hacer esto, primero debe asegurarse de corregir todo lo que está causando este problema. Ya mencionó que la compilación y los editores de la tabla DB están configurados correctamente. Pero hay más lugares en los que debe verificar para asegurarse de que todo está bien UTF-8:
- Asegúrese de estar sirviendo su HTML como UTF-8:
- encabezado ("Content-Type: text / html; charset = utf-8");
- Cambie su juego de caracteres predeterminado de PHP a utf-8:
- ini_set ("default_charset", "utf-8");
- Si su base de datos SIEMPRE no habla en utf-8, entonces puede necesitar decirla por conexión para asegurarse de que esté en modo utf-8, en MySQL lo hace al emitir:
- charset utf8
- Es posible que necesite decirle a su servidor web que siempre intente hablar en UTF8, en Apache este comando es:
- AddDefaultCharset UTF-8
- Finalmente, debe asegurarse SIEMPRE de que esté usando las funciones de PHP que son correctamente quejas UTF-8. Esto significa siempre usar las funciones de cadena mb_* labrada ''multibyte aware''. También significa que al invocar funciones como htmlspecialchars (), incluya el parámetro de juego de caracteres ''utf-8'' apropiado al final para asegurarse de que no las codifica incorrectamente.
Si pierde un paso en todo el proceso, la codificación se puede alterar y surgir problemas. Una vez que te metes en el ''groove'' de hacer utf-8, todo esto se convierte en una segunda naturaleza. Y, por supuesto, PHP6 se supone que es una queja totalmente unicode del getgo, lo que hará que sea mucho más fácil (con suerte)
Tuve un problema con un archivo xml que tenía una codificación rota, decía que era utf-8 pero tenía caracteres que no eran utf-8.
Después de varias pruebas y errores con el mb_convert_encoding()
logro arreglarlo con
mb_convert_encoding($text, ''Windows-1252'', ''UTF-8'')
tuve el mismo problema hace mucho tiempo, y lo solucionó usando
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15">