Domanda

Questa è una doppia domanda per voi incredibilmente gentile Stacked Overflow Wizards là fuori.

  1. Come faccio a impostare emacs / melma / Swank di usare UTF-8 quando si parla con Clojure, o l'uso UTF-8 a riga di comando REPL? Al momento non posso inviare i caratteri non romani a Swank-clojure, e utilizzando la linea di comando confonde REPL cose.

  2. E 'davvero facile da fare le espressioni regolari su testo latino:

    (ri-seq # "[\ w] +" "E 'proprio vero che le frasi giapponesi non hanno bisogno di spazi?")

Ma cosa succede se ho avuto qualche giapponese? Ho pensato che questo avrebbe funzionato, ma non posso provarlo:

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

Si diventa più difficile se dobbiamo usare un dizionario per trovare interruzioni di parola, o per trovare una parola katakana-solo noi stessi:

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

Grazie!

È stato utile?

Soluzione

non può fare con Swank o Emacs, ho paura. Sto usando Enclojure su NetBeans e funziona bene lì.

In abbinamento: ha detto Come Alex, \w non funziona per i caratteri non inglesi, nemmeno i set di caratteri latini estesi per l'Europa occidentale:

(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

Il \ w salta i chars estesi. Utilizzando [(?u)\w]+ fa invece alcuna differenza, lo stesso con i giapponesi.

Ma vedi questa regex riferimento : \p{L} corrisponde a qualsiasi carattere Unicode nella categoria Lettera , in modo che funziona in realtà per Norwegian

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

, così come per il giapponese (almeno Suppongo di sì, non posso leggerlo ma sembra di essere nel campo da baseball):

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

Ci sono un sacco di altre opzioni, come la corrispondenza su combinare i segni diacritici e quant'altro, controlla il riferimento.

Modifica: Maggiori info su Unicode in Java

Un rapido riferimento ad altri punti di potenziale interesse quando si lavora con Unicode.

Per fortuna, Java fa in genere un ottimo lavoro di lettura e scrittura del testo nelle codifiche corretti per la posizione e la piattaforma, ma a volte è necessario sostituirla.

Questo è tutto Java, la maggior parte di questa roba non hai involucro Clojure (almeno non ancora).

  • java.nio.charset.Charset - rappresenta un set di caratteri come US-ASCII, ISO-8859-1, UTF-8
  • java.io.InputStreamReader - permette di specificare un set di caratteri di tradurre da byte a stringhe durante la lettura. C'è un corrispondente OutputStreamWriter.
  • java.lang.String - permette di specificare un set di caratteri durante la creazione di una stringa da un array di byte.
  • java.lang.Character - ha metodi per ottenere la categoria Unicode di un carattere e la conversione tra i caratteri Java e punti di codice Unicode.
  • java.util.regex.Pattern -. specificazione dei modelli di espressione regolari, compresi i blocchi e categorie Unicode

caratteri Java / stringhe sono UTF-16 internamente. Il tipo char (e il suo involucro Personaggio) è di 16 bit, che non è sufficiente per rappresentare tutti Unicode, tanti caratteri non latini hanno bisogno di due caratteri per rappresentare un simbolo.

Quando si tratta di non latino Unicode è spesso meglio usare code points piuttosto che caratteri. Un punto di codice è un carattere Unicode / simbolo rappresentato come un int. Le classi String e caratteri hanno metodi per la conversione tra i caratteri Java e punti di codice Unicode.

sto mettendo questo qui da quando ho di tanto in tanto bisogno di questa roba, ma non abbastanza spesso di ricordare in realtà i dettagli da una volta all'altra. Una sorta di nota a mio futuro sé, e potrebbe essere utile ad altri che iniziano con lingue internazionali e codifiche pure.

Altri suggerimenti

Risponderò mezzo una domanda qui:

  

Come faccio a impostare emacs / melma / Swank di usare UTF-8 quando si parla con Clojure, o l'uso UTF-8 a riga di comando REPL?

Un modo più interattivo:

  1. M-x personalizzare-group
  2. "slime-lisp"
  3. Trova l'opzione per il sistema di codifica melma, e selezionare UTF-8-unix. Salva questo modo Emacs lo raccoglie nella sessione successiva.

o inserire questo nel vostro .emacs:

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

Questo è quello che il menu interattivo farà in ogni caso.

Funziona su Emacs 23 e funziona sulla mia macchina

Per katakana, Wikipedia mostra l'ordinamento Unicode. Quindi, se si voleva utilizzare una classe di caratteri espressione regolare che ha catturato tutti i katakana, suppongo che si possa fare qualcosa di simile:

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

Hiragana, per quel che vale:

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

Sarei abbastanza stupito se qualsiasi espressione regolare in grado di rilevare interruzioni di parola giapponese.

per i caratteri internazionali è necessario utilizzare classi di caratteri Java, qualcosa come [\ p {} javaLowerCase \ p {} javaUpperCase] ??+ per adattarsi a qualsiasi carattere di parola ... \ w viene utilizzato per ASCII - vedi java.util.regex documentazione

prefisso tua regex con (?U) in questo modo:. (re-matches #"(?U)\w+" "ñé2_hi") => "ñé2_hi"

Questo imposta il flag UNICODE_CHARACTER_CLASS su true in modo che le classi di caratteri tipici fanno ciò che si vuole con i non-ASCII Unicode.

Vedi qui per maggiori info: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#UNICODE_CHARACTER_CLASS

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top