Come posso abbinare i caratteri (con l'intenzione di rimuoverli) dall'esterno Unicode Piano multilingue multilingue in java?Corrispondenza Java caratteri di corrispondenza all'esterno del piano multilingue di base
15
A
risposta
19
Per rimuovere tutti i caratteri non BMP, il seguente dovrebbe funzionare:
String sanitizedString = inputString.replaceAll("[^\u0000-\uFFFF]", "");
3
Stai cercando caratteri specifici o tutti i caratteri al di fuori del BMP?
Nel primo caso, è possibile utilizzare un StringBuilder
per costruire una stringa che contiene punti di codice dai piani superiori, e regex funzionerà come previsto:
String test = new StringBuilder().append("test").appendCodePoint(0x10300).append("test").toString();
Pattern regex = Pattern.compile(new StringBuilder().appendCodePoint(0x10300).toString());
Matcher matcher = regex.matcher(test);
matcher.find();
System.out.println(matcher.start());
Se stai cercando di rimuovere tutti i non personaggi -BMP da una stringa, quindi mi piacerebbe utilizzare StringBuilder
direttamente, piuttosto che espressione regolare:
StringBuilder sb = new StringBuilder(test.length());
for (int ii = 0 ; ii < test.length() ;)
{
int codePoint = test.codePointAt(ii);
if (codePoint > 0xFFFF)
{
ii += Character.charCount(codePoint);
}
else
{
sb.appendCodePoint(codePoint);
ii++;
}
}
Avete provato questo? Poiché l'intervallo di caratteri include l'intervallo surrogato utilizzato per creare codici codificati non BMP. – Anon
@Anon: come hai sottolineato nella tua risposta, le espressioni regolari sono valutate al livello dei codepoint, non delle codeunità, quindi non vede surrogati. – axtavt
Sì, questo è stato testato con caratteri non BMP. –