Tengo un problema con la eliminación de caracteres que no son utf8 de la cadena, que no se muestran correctamente. Los caracteres son así 0x97 0x61 0x6C 0x6F (representación hexadecimal)
¿Cuál es la mejor forma de eliminarlos? ¿Expresión regular o algo más?
Respuestas:
Usando un enfoque de expresiones regulares:
Busca secuencias UTF-8 y las captura en el grupo 1. También coincide con bytes individuales que no se pudieron identificar como parte de una secuencia UTF-8, pero no los captura. El reemplazo es lo que se capturó en el grupo 1. Esto elimina efectivamente todos los bytes no válidos.
Es posible reparar la cadena codificando los bytes no válidos como caracteres UTF-8. Pero si los errores son aleatorios, esto podría dejar algunos símbolos extraños.
EDITAR:
!empty(x)
coincidirá con los valores no vacíos ("0"
se considera vacío).x != ""
coincidirá con valores no vacíos, incluidos"0"
.x !== ""
coincidirá con cualquier cosa excepto""
.x != ""
parece el mejor para usar en este caso.También he acelerado un poco el partido. En lugar de hacer coincidir cada carácter por separado, hace coincidir secuencias de caracteres UTF-8 válidos.
fuente
$regex = <<<'END'
para PHP <5.3.x?elseif (!empty($captures([2])) {
y debe usar en!== ""
lugar de vacío, ya que"0"
se considera vacío. Además, esta función es muy lenta, ¿podría hacerse más rápido?Si aplica
utf8_encode()
a una cadena ya UTF8, devolverá una salida UTF8 distorsionada.Hice una función que aborda todos estos problemas. Se llama
Encoding::toUTF8()
.No necesita saber cuál es la codificación de sus cadenas. Puede ser Latin1 (ISO8859-1), Windows-1252 o UTF8, o la cadena puede tener una combinación de ellos.
Encoding::toUTF8()
convertirá todo a UTF8.Lo hice porque un servicio me estaba dando una fuente de datos en mal estado, mezclando esas codificaciones en la misma cadena.
Uso:
He incluido otra función, Encoding :: fixUTF8 (), que solucionará todas las cadenas UTF8 que se vean distorsionadas por haber sido codificadas en UTF8 varias veces.
Uso:
Ejemplos:
dará salida:
Descargar:
https://github.com/neitanod/forceutf8
fuente
Puede usar mbstring:
... eliminará los caracteres no válidos.
Ver: Reemplazo de caracteres UTF-8 no válidos por signos de interrogación, mbstring.substitute_character parece ignorado
fuente
<0x1a>
<0x1a>
, aunque no es un carácter imprimible, es una secuencia UTF-8 perfectamente válida. ¿Podría tener problemas con los caracteres no imprimibles? Compruebe esto: stackoverflow.com/questions/1176904/…ini_set('mbstring.substitute_character', 'none');
contrario, obtenía signos de interrogación en el resultado.Esta función elimina todos los caracteres NO ASCII, es útil pero no resuelve la pregunta:
esta es mi función que siempre funciona, independientemente de la codificación:
Cómo funciona:
fuente
í
carácter en el campo de dirección que ES un carácter UTF-8 válido, consulte la tabla . La moral: no confíe en los mensajes de error de la API :)Esto es lo que estoy usando. Parece que funciona bastante bien. Tomado de http://planetozh.com/blog/2005/01/remove-invalid-characters-in-utf-8/
fuente
prueba esto:
De acuerdo con el manual de iconv , la función tomará el primer parámetro como el juego de caracteres de entrada, el segundo parámetro como el juego de caracteres de salida y el tercero como la cadena de entrada real.
Si establece tanto el juego de caracteres de entrada como de salida en UTF-8 , y agrega la
//IGNORE
bandera al juego de caracteres de salida, la función eliminará (eliminará) todos los caracteres en la cadena de entrada que no pueden ser representados por el juego de caracteres de salida. Por lo tanto, filtrar la cadena de entrada en efecto.fuente
//IGNORE
no parece suprimir el aviso de que está presente UTF-8 no válido (que, por supuesto, conozco y quiero corregir). Un comentario altamente calificado en el manual parece pensar que ha sido un error durante algunos años.iconv
. @halfer Quizás sus datos de entrada no sean de utf-8. Otra opción es hacer una reconversión a ascii y luego volver a utf-8 nuevamente. En mi caso utilicéiconv
como$output = iconv("UTF-8//", "ISO-8859-1//IGNORE", $input );
El texto puede contener caracteres que no sean utf8 . Intenta hacer primero:
Puede leer más sobre esto aquí: http://php.net/manual/en/function.mb-convert-encoding.php news
fuente
UConverter se puede utilizar desde PHP 5.5. UConverter es la mejor opción si usa la extensión intl y no usa mbstring.
htmlspecialchars se puede utilizar para eliminar secuencias de bytes no válidas desde PHP 5.4. Htmlspecialchars es mejor que preg_match para manejar un gran tamaño de bytes y la precisión. Se puede ver una gran cantidad de implementación incorrecta mediante el uso de expresiones regulares.
fuente
He creado una función que elimina caracteres UTF-8 no válidos de una cadena. Lo estoy usando para borrar la descripción de 27000 productos antes de que genere el archivo de exportación XML.
fuente
ord()
devuelve resultados en el rango 0-255. El giganteif
de esta función prueba los rangos Unicode queord()
nunca volverán. Si alguien quiere aclarar por qué esta función funciona de la manera en que lo hace, agradecería la información.Bienvenido a 2019 y al
/u
modificador en expresiones regulares que manejará caracteres multibyte UTF-8 por ustedSi solo lo usa
mb_convert_encoding($value, 'UTF-8', 'UTF-8')
, aún terminará con caracteres no imprimibles en su cadenaEste método:
mb_convert_encoding
\r
,\x00
(byte NULL) y otros caracteres de control conpreg_replace
método:
[:print:]
coincidir con todos los caracteres imprimibles y\n
nuevas líneas y eliminar todo lo demásPuede ver la tabla ASCII a continuación. Los caracteres imprimibles van de 32 a 127, pero la nueva línea
\n
es parte de los caracteres de control que van de 0 a 31, por lo que tenemos que agregar una nueva línea a la expresión regular/[^[:print:]\n]/u
Puede intentar enviar cadenas a través de la expresión regular con caracteres fuera del rango imprimible como
\x7F
(DEL),\x1B
(Esc), etc. y ver cómo se eliminanhttps://www.tehplayground.com/q5sJ3FOddhv1atpR
fuente
php-mbstring
no está empaquetado en php por defecto.fuente
Desde el parche reciente al módulo analizador JSON Feeds de Drupal:
Si le preocupa, sí, conserva los espacios como caracteres válidos.
Hice lo que necesitaba. Elimina los caracteres emoji difundidos hoy en día que no encajan en el conjunto de caracteres 'utf8' de MySQL y que me dieron errores como "SQLSTATE [HY000]: Error general: 1366 Valor de cadena incorrecto".
Para obtener más información, consulte https://www.drupal.org/node/1824506#comment-6881382
fuente
iconv
es mucho mejor que el antiguo basado en expresiones regularespreg_replace
, que está en desuso hoy en día.ereg_replace()
siento.Quizás no sea la solución más precisa, pero hace el trabajo con una sola línea de código:
utf8_decode
convertirá los caracteres en un signo de interrogación;str_replace
eliminará los signos de interrogación.fuente
Entonces, las reglas son que el primer octlet UTF-8 tiene el bit alto establecido como marcador, y luego de 1 a 4 bits para indicar cuántos octlets adicionales; entonces cada uno de los octlets adicionales debe tener los dos bits altos establecidos en 10.
La pseudo-pitón sería:
Esta misma lógica debería ser traducida a php. Sin embargo, no está claro qué tipo de eliminación se debe realizar una vez que se obtiene un personaje mal formado.
fuente
c = (ch << 1)
hará(c & 1)
cero la primera vez, saltando el ciclo. La prueba probablemente debería ser(c & 128)
Para eliminar todos los caracteres Unicode fuera del plano de idioma básico Unicode:
fuente
Ligeramente diferente a la pregunta, pero lo que estoy haciendo es usar HtmlEncode (cadena),
pseudo código aquí
entrada y salida
Sé que no es perfecto, pero hace el trabajo por mí.
fuente
funciona en nuestro servicio
fuente
¿Qué tal iconv?
http://php.net/manual/en/function.iconv.php
No lo he usado dentro de PHP, pero siempre me ha funcionado bien en la línea de comandos. Puede hacer que sustituya caracteres no válidos.
fuente