2010-11-29 23 views
10

Necesito dividir una cadena y extraer palabras separadas por espacios en blanco. La fuente puede estar en inglés o japonés. Los espacios en blanco en inglés incluyen tabulación y espacio, y el texto en japonés también los usa. (IIRC, todos los juegos de caracteres japoneses ampliamente utilizados son superconjuntos de US-ASCII.)¿Cuáles son todos los caracteres japoneses de espacios en blanco?

Así que el conjunto de caracteres que necesito usar para dividir mi cadena incluye el espacio y la pestaña ASCII normales.

Pero, en japonés, hay otro carácter de espacio, comúnmente llamado 'espacio de ancho completo'. De acuerdo con la utilidad del Visor de caracteres de mi Mac, este es U + 3000 "ESPACIO IDEOGRÁFICO". Esto es (generalmente) lo que resulta cuando un usuario presiona la barra espaciadora mientras escribe en el modo de entrada japonés.

¿Hay algún otro personaje que deba tener en cuenta?

Estoy procesando datos textuales enviados por usuarios a quienes se les ha dicho que "marquen entradas con espacios". Sin embargo, los usuarios están usando una gran variedad de sistemas operativos de computadoras y teléfonos móviles para enviar estos textos. Ya hemos visto que los usuarios pueden no estar al tanto de si están en modo de entrada japonés o inglés al ingresar estos datos.

Además, el comportamiento de la clave de espacio difiere entre plataformas y aplicaciones incluso en modo japonés (por ejemplo, Windows 7 insertará un espacio ideográfico pero iOS insertará un espacio ASCII).

Así que lo que quiero es básicamente "el conjunto de todos los caracteres que parecen un espacio y pueden generarse cuando el usuario presiona la tecla espacio, o la tecla tab, ya que muchos usuarios no conocen la diferencia entre un espacio y una pestaña, en japonés y/o en inglés ".

¿Hay alguna respuesta autorizada a tal pregunta?

+1

¿No debería un lenguaje de programación con compatibilidad Unicode adecuada simplemente dejar dividir una cadena (utilizando una expresión regular) en espacios en blanco? Por ejemplo, '/ \ s /' coincide con los espacios en blanco de los caracteres en JavaScript (equivalente a '[\ f \ n \ r \ t \ v \ u00A0 \ u2028 \ u2029]'). –

+3

Matt: La expresión regular que citó ya no aparece '\ u3000' y OP se pregunta qué más podría faltar. La lista de espacios separadores Unicode tiene 18 entradas: http://www.fileformat.info/info/unicode/category/Zs/list.htm – Gabe

+1

Matt: Sí, deseo, pero la noción de que JavaScript (y sorprendentemente, incluso Ruby) tiene acerca de lo que constituye un 'espacio en blanco' genérico que no incluye el carácter de espacio en blanco japonés (s?). Gabe: gracias por ese enlace, hurgando manualmente en mi visor Unicode, había tropezado con EM SPACE, FIGURE SPACE y mis amigos, pero no había encontrado OGHAM SPACE MARK o MONGOLIAN VOWEL SEPARATOR ... – Mason

Respuesta

4

Necesita la pestaña ASCII, espacio y espacio de no separación (U + 00A0), y el espacio de ancho completo, que ha identificado correctamente como U + 3000. Es posible que desee nuevas líneas y caracteres de espacio vertical. Si su entrada está en Unicode (no Shift-JIS, etc.) entonces eso es todo lo que necesitará. Hay otros caracteres (de control) tales como \ 0 NULL que a veces se usan como delimitadores de información, pero no se representarán como un espacio en el texto de Asia oriental, es decir, no aparecerán como espacios en blanco.

editar: Matt Ball tiene un buen punto en su comentario, pero, como lo ilustra su ejemplo, muchas implementaciones de expresiones regulares no funcionan bien con la puntuación del este asiático de ancho completo. A este respecto, vale la pena mencionar que Python's string.whitespace tampoco cortará la mostaza.

+0

¡Realmente quiero creerte, porque eso significa que ya terminé! :) ¿Pero, como lo sabes? – Mason

+1

Trabajo con textos de Asia Oriental de una variedad de procedencias diariamente. ¿En qué entorno/lenguaje de programación estás? quizás puedo dar algunos consejos más específicos. sería suficiente una expresión regular que funciona con todo lo que está en el enlace de Gabe? – simon

+0

Tienes razón; mientras que terminé escribiendo un método que trataba con todos los espacios extraños en el enlace de Matt, también probé manualmente la presentación de 24 combinaciones diferentes de plataforma/aplicación. Tab, espacio, U + 00A0 y U + 3000 fueron todo lo que surgió en el mundo real. Así que acepté tu respuesta. ¡Gracias! – Mason

3

Acabo de encontrar su publicación. Esta es una gran explicación sobre la normalización de caracteres Unicode.

http://en.wikipedia.org/wiki/Unicode_equivalence

me encontré con que muchos lenguajes de programación, como Python, tienen módulos que se pueden poner en práctica estas reglas de normalización de las normas Unicode. Para mis propósitos, encontré que el siguiente código python funciona muy bien. Convierte todas las variantes unicode de espacios en blanco al rango de ASCII. Después de la normalización, un comando de expresiones regulares puede convertir todo el espacio en blanco para ascii \ x32:

import unicodedata 
# import re 

ucode = u'大変、 よろしくお願い申し上げます。' 

normalized = unicodedata.normalize('NFKC', ucode) 

# old code 
# utf8text = re.sub('\s+', ' ', normalized).encode('utf-8') 

# new code 
utf8text = ' '.join(normalized.encode('utf-8').split()) 

Desde la primera escritura, he aprendido de expresiones regulares de Python (re) Módulo itentifies inadecuadamente estos espacios en blanco y puede causar un accidente si los encuentra. Resulta un método más rápido y más confiable para usar la función .split().

Cuestiones relacionadas