2010-06-23 16 views
12

Esta es una pregunta doble para ustedes, asombrosamente amables, asistentes de desbordamiento apilados.¿Cómo uso los caracteres Unicode (UTF-8) en las expresiones regulares de Clojure?

  1. ¿Cómo se configura emacs/limo/Swank utilizar UTF-8 cuando se habla con Clojure, o utilizar UTF-8 en la línea de comandos REPL? Por el momento no puedo enviar ningún personaje no romano a swank-clojure, y usar la línea de comando REPLIGA cosas.

  2. Es muy fácil de hacer expresiones regulares en el texto latino:

    (? Re-ss # "[\ w] +" "Es muy cierto que frases japonesas no necesitan espacios")

¿Pero y si tuviera algo de japonés? Pensé que esto iba a funcionar, pero no puedo probarlo:

(re-seq #"[(?u)\w]+" "日本語 の 文章 に は スペース が 必要 ない って、 本当?") 

se hace más difícil si tenemos que usar un diccionario para encontrar separaciones de palabras, o para encontrar una palabra katakana-sólo a nosotros mismos:

(re-seq #"[アイウエオ-ン]" "日本語の文章にはスペースが必要ないって、本当?") 

Gracias!

Respuesta

15

No puedo ayudar con swank o Emacs, me temo. Estoy usando Enclojure en NetBeans y funciona bien allí.

En juego: Como dijo Alex, \w no funciona para caracteres no ingleses, ni siquiera los juegos de caracteres latinos extendidos para Europa Occidental:

(re-seq #"\w+" "prøve") =>("pr" "ve") ; Norwegian 
(re-seq #"\w+" "mañana") => ("ma" "ana") ; Spanish 
(re-seq #"\w+" "große") => ("gro" "e") ; German 
(re-seq #"\w+" "plaît") => ("pla" "t") ; French 

El \ w salta los caracteres extendidos. Usar [(?u)\w]+ en su lugar no hace diferencia, lo mismo con los japoneses.

Pero ver this regex reference: \p{L} coincide con cualquier carácter Unicode en la categoría Carta, lo que en realidad trabaja para Noruega

(re-seq #"\p{L}+" "prøve") 
=> ("prøve") 

, así como para el japonés (al menos supongo que sí, no puedo leerlo pero parece estar en el estadio de béisbol):

(re-seq #"\p{L}+" "日本語 の 文章 に は スペース が 必要 ない って、 本当?") 
=> ("日本語" "の" "文章" "に" "は" "スペース" "が" "必要" "ない" "って" "本当") 

Hay un montón de otras opciones, como juego en la combinación de signos diacríticos y otras cosas, echa un vistazo a la referencia.

Edición: Más sobre Unicode en Java

una referencia rápida a otros puntos de interés potencial cuando se trabaja con Unicode.

Afortunadamente, Java generalmente hace un muy buen trabajo al leer y escribir texto en las codificaciones correctas para la ubicación y la plataforma, pero ocasionalmente tiene que anularlo.

Esto es todo Java, la mayoría de estas cosas no tienen un envoltorio Clojure (al menos no todavía).

  • java.nio.charset.Charset - representa un conjunto de caracteres como US-ASCII, ISO-8859-1, UTF-8
  • java.io.InputStreamReader - le permite especificar un conjunto de caracteres a traducir de bytes de las cadenas durante la lectura. Hay un OutputStreamWriter correspondiente.
  • java.lang.String - le permite especificar un conjunto de caracteres al crear una cadena a partir de una matriz de bytes.
  • java.lang.Character - tiene métodos para obtener la categoría Unicode de un carácter y convertir entre caracteres Java y puntos de código Unicode.
  • java.util.regex.Pattern - especificación de patrones regexp, incluyendo bloques y categorías Unicode.

Los caracteres/cadenas Java son UTF-16 internamente. El tipo char (y su carácter envoltorio) es de 16 bits, que no es suficiente para representar todo Unicode, por lo que muchos scripts no latinos necesitan dos caracteres para representar un símbolo.

Cuando se trata de Unicode no latinos a menudo es mejor usar code points en lugar de caracteres. Un punto de código es un carácter/símbolo Unicode representado como un int. Las clases String y Character tienen métodos para convertir entre caracteres Java y puntos de código Unicode.

  • unicode.org - el estándar Unicode y tablas de códigos.

Pongo esto aquí porque ocasionalmente necesito esto, pero no lo suficiente como para recordar los detalles de una vez a la siguiente. Una especie de nota para mi yo futuro, y podría ser útil para otros que también comiencen con idiomas y codificaciones internacionales.

+2

¡Guau! Sí, el modificador \ p {L} era exactamente lo que quería, y estoy realmente un poco sorprendido de que funcione para el japonés. Gracias por el enlace, también. – ivar

2

para caracteres internacionales necesita usar clases de caracteres Java, algo como [\ p {javaLowerCase} \ p {javaUpperCase}] + para hacer coincidir cualquier carácter de palabra ... \ w se usa para ASCII - ver java.util. Documentación de Regex

3

Para katakana, Wikipedia le muestra el pedido de Unicode. Así que si desea utilizar una clase de caracteres de expresiones regulares que captó toda la katakana, supongo que se podría hacer algo como esto:

user> (re-seq #"[\u30a0-\u30ff]+" "日本語の文章にはスペースが必要ないって、本当?") 
("スペース") 

Hiragana, por lo que vale la pena:

user> (re-seq #"[\u3040-\u309f]+" "日本語の文章にはスペースが必要ないって、本当?") 
("の" "には" "が" "ないって") 

Estaría muy sorprendido si alguna expresión regular pudiera detectar saltos de palabras en japonés.

+0

Gracias por la ayuda, Sr. vaca de lectura japonesa.^_^De acuerdo, una expresión regular que podría detectar los saltos de palabras en japonés sería absolutamente increíble. – ivar

8

Voy a responder a una pregunta medio aquí:

¿Cómo se configura emacs/limo/Swank utilizar UTF-8 cuando se habla con Clojure, o utilizar UTF-8 en la línea de comandos REPL?

una manera más interactiva:

  1. M-x modificar-grupo
  2. "limo-Lisp"
  3. encontrará la opción para el sistema de codificación de limo, y seleccione UTF-8 en UNIX. Guarde esto para que Emacs lo recoja en su próxima sesión.

O coloque esto en su.emacs:

(custom-set-variables '(slime-net-coding-system (quote utf-8-unix))) 

Eso es lo que el menú interactivo va a hacer de todos modos.

Obras en Emacs 23 y works on my machine

Cuestiones relacionadas