javascript - convertir - Eliminar el carácter no ascii en una cadena
convertir codigo ascii a texto javascript (5)
ASCII está en el rango de 0 a 127, entonces:
str.replace(/[^/x00-/x7F]/g, "");
var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";
y necesito eliminar todo el carácter no ascii de la cadena,
significa que str solo contiene "INFO] (Higashikurume)";
Para usar ASCII con acentos:
var str = str.replace(/[^/x00-/xFF]/g, "");
Puede usar la siguiente expresión regular para reemplazar caracteres que no sean ASCII
str = str.replace(/[^A-Za-z 0-9 /.,/?""!@#/$%/^&/*/(/)-_=/+;:<>/////|/}/{/[/]`~]*/g, '''')
Sin embargo, tenga en cuenta que los espacios, dos puntos y comas son todos válidos ASCII, por lo que el resultado será
> str
"INFO] :, , , (Higashikurume)"
También se puede hacer con una afirmación positiva de eliminación, como esta:
textContent = textContent.replace(/[/u{0080}-/u{FFFF}]/gu,"");
Esto usa unicode. En Javascript, cuando se expresa unicode para una expresión regular, los caracteres se especifican con la secuencia de escape /u{xxxx}
pero también debe /u{xxxx}
la bandera ''u''
; tenga en cuenta que la expresión regular tiene banderas ''gu''
.
Llamé a esto una "afirmación positiva de eliminación" en el sentido de que una afirmación "positiva" expresa qué personajes eliminar, mientras que una afirmación "negativa" expresa qué letras no eliminar. En muchos contextos, la afirmación negativa, como se afirma en las respuestas anteriores, podría ser más sugestiva para el lector. El circunflejo " ^
" dice "no" y el rango /x00-/x7F
dice "ascii", por lo que los dos juntos dicen "no ascii".
textContent = textContent.replace(/[^/x00-/x7F]/g,"");
Esa es una gran solución para los hablantes de inglés que solo se preocupan por el idioma inglés, y también es una buena respuesta para la pregunta original. Pero en un contexto más general, uno no siempre puede aceptar el sesgo cultural de asumir que "todo lo que no es ascii es malo". Para contextos en los que no se utiliza ASCII, pero que en ocasiones se necesita eliminar, la afirmación positiva de Unicode es más adecuada.
Una buena indicación de que los caracteres sin impresión de ancho cero están incrustados en una cadena es cuando la propiedad de "longitud" de la cadena es positiva (distinta de cero), pero se parece a (es decir, imprime como) una cadena vacía. Por ejemplo, tuve esto apareciendo en el depurador de Chrome, para una variable llamada "textContent":
> textContent
""
> textContent.length
7
Esto me llevó a querer ver lo que estaba en esa cadena.
> encodeURI(textContent)
"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B"
Esta secuencia de bytes parece estar en la familia de algunos caracteres Unicode que los procesadores de texto insertan en documentos y luego se abren paso en los campos de datos. Más comúnmente, estos símbolos ocurren al final de un documento. El CK-Editor (CKEditor) podría insertar el espacio de ancho cero "%E2%80%8B"
.
encodeURI() UTF-8 Unicode html Meaning
----------- -------- ------- ------- -------------------
"%E2%80%8B" EC 80 8B U 200B ​ zero-width-space
"%E2%80%8E" EC 80 8E U 200E ‎ left-to-right-mark
"%E2%80%8F" EC 80 8F U 200F ‏ right-to-left-mark
Algunas referencias sobre aquellos:
http://www.fileformat.info/info/unicode/char/200B/index.htm
https://en.wikipedia.org/wiki/Left-to-right_mark
Tenga en cuenta que aunque la codificación del carácter incrustado es UTF-8, la codificación en la expresión regular no lo es. Aunque el carácter está incrustado en la cadena como tres bytes (en mi caso) de UTF-8, las instrucciones en la expresión regular deben usar el Unicode de dos bytes. De hecho, UTF-8 puede tener hasta cuatro bytes de longitud; es menos compacto que Unicode porque usa el bit alto (o bits) para escapar de la codificación ascii estándar. Eso se explica aquí:
Una búsqueda rápida en Google devuelve este artículo en :
recortar caracteres no ascii de la cadena devuelta por nodejs crypto
No me atribuiré la respuesta, sin embargo, puedes reemplazar los caracteres que no son ASCII utilizando esta expresión regular:
str.replace(/[^A-Za-z 0-9 /.,/?""!@#/$%/^&/*/(/)-_=/+;:<>/////|/}/{/[/]`~]*/g, '''') ;