Vorrei un algoritmo o una libreria in grado di indicare se un punto Unicode è valido. Ad esempio, U+F8F8
non sembra essere un carattere Unicode valido ma è descritto come "PRIVATE_USE_AREA"
. Ho trovato ICU - questa è una soluzione buona/migliore?Come determinare se un carattere Unicode è valido
UPDATE: @ suggerimento di Reprogrammer (sotto) è quello di utilizzare:
CoderResult call(CharsetDecoderICU decoder, Object context,
ByteBuffer source, CharBuffer target, IntBuffer offsets,
char[] buffer, int length, CoderResult cr)
This function is called when the bytes in the source cannot be handled,
and this function is meant to handle or fix the error if possible.
Grazie. Questo sembra più complesso di quanto speravo - forse è necessariamente un problema più complesso di quanto pensassi. (Il problema comprende punti, come '<Non Private Use High Surrogate, First>' (U+D800)
che sono (presumo) valida solo se seguita da almeno un altro punto di codice
UPDATE:. @Jukka scrive:
Definire “valido” Un uso privato. il punto di codice è valido secondo lo standard Unicode , non ha alcun carattere assegnato nello standard . Un punto di codice surrogato non è un dato carattere valido, ma le unità di codice surrogato possono essere utilizzate in UTF-16. La stringa Java è una sequenza di unità di codice, non i caratteri, qualsiasi unità di codice può apparire lì, ma quando si elabora una stringa come caratteri, dovrebbe essere conforme allo con i requisiti Unicode sui caratteri. - Jukka K. Korpela
Sono d'accordo che la definizione di "valido" è importante. Ho preso l'utilizzo dal sito FileFormat.Info che ha dichiarato:
U+F8F8 is not a valid unicode character.
Sembra un sito abbastanza autorevole così ho usato il loro termine. Forse sono un po 'imprecisi
AGGIORNAMENTO: Ho provato @ Python di Ignacio in Java ma non è riuscito. Ho scritto
public void testUnicode() {
Pattern pattern = Pattern.compile("\\p{Cn}");
System.out.println("\\u0020 "+pattern.matcher("\u0020").matches());
System.out.println("A "+pattern.matcher("A").matches());
System.out.println("\\uf8f8 "+pattern.matcher("\uf8f8").matches());
}
che restituiva uniformemente false, anche per i caratteri Unicode "validi". Inoltre, non ho trovato il documento \p{Cn}
documentato.
Hai provato CharsetCallback.Decoder http://icu-project.org/apiref/icu4j/com/ibm/icu/charset/CharsetCallback.Decoder.html? – reprogrammer
Definire "valido". Un punto di codice Uso privato è valido secondo lo standard Unicode, semplicemente non ha alcun carattere assegnato nello standard. Un punto codice * surrogato * non è un dato carattere valido, ma le unità codice * surrogate * possono essere utilizzate in UTF-16. Una stringa Java è una sequenza di unità di codice, non di caratteri; qualsiasi unità di codice può apparire lì, ma quando si elabora una stringa come caratteri, dovrebbe essere conforme ai requisiti Unicode sui caratteri. –
@Jukka questo è molto utile. L'ho copiato nel testo. –