string.letters: La concatenazione delle stringhe minuscole e maiuscole descritto di seguito. Il valore specifico è dipendente dalla locale e verrà aggiornato quando viene chiamato locale.setlocale().
Ho modificato la risposta da Michael Borgwardt. Nella mia applicazione ci sono due liste in minuscolo e upperCases per due motivi:
string.letters è in minuscolo seguita da uppercases.
Java Character.isLetter(char) è molto più di uppercases e in minuscolo, per cui l'uso di Character.isLetter (char) tornerà a risultati molto sotto alcuni set di caratteri, ad esempio "windows-1252"
Da Api-Doc: Character.isLetter(char):
un carattere è considerato essere una lettera se il suo tipo categoria generale, fornito da Character.getType (ch), è uno dei seguenti:
* UPPERCASE_LETTER
* LOWERCASE_LETTER
* TITLECASE_LETTER
* MODIFIER_LETTER
* OTHER_LETTER
Non tutte le lettere hanno una custodia.Molti caratteri sono lettere ma non sono né maiuscole né minuscole né titolate.
Quindi, se string.letters deve restituire solo in minuscolo e uppercases, il TITLECASE_LETTER, , MODIFIER_LETTER e OTHER_LETTER caratteri devono essere ignorato.
public static String allLetters(final Charset charset) {
final CharsetEncoder encoder = charset.newEncoder();
final StringBuilder lowerCases = new StringBuilder();
final StringBuilder upperCases = new StringBuilder();
for (char c = 0; c < Character.MAX_VALUE; c++) {
if (encoder.canEncode(c)) {
if (Character.isUpperCase(c)) {
upperCases.append(c);
} else if (Character.isLowerCase(c)) {
lowerCases.append(c);
}
}
}
return lowerCases.append(upperCases).toString();
}
Inoltre: il comportamento di string.letters cambia quando si cambia l'impostazione internazionale. Questo forse non si applica alla mia soluzione, perché la modifica delle impostazioni internazionali predefinite non modifica il set di caratteri predefinito. Da apidoc:
Il set di caratteri predefinito viene determinato all'avvio macchine virtuali e tipicamente dipende dalla localizzazione e charset del sottostante sistema operativo .
Immagino che il set di caratteri predefinito non possa essere modificato all'interno della JVM avviata. Quindi il comportamento di "modifica locale" di string.letters non può essere realizzato con solo Locale.setDefault (Locale). Ma cambiare le impostazioni internazionali di default è comunque una cattiva idea:
Dal cambiare l'impostazione internazionale predefinita può interessare diverse aree di funzionalità, questo metodo dovrebbe essere utilizzato solo se il chiamante è pronto a reinizializzare locale-sensitive codice in esecuzione nella stessa macchina Java Virtual .
Considererei del tutto inesatto il risultato del pitone. Che dire di ä, é o ß? –
Suppongo che sarebbe d'aiuto se fornissi la documentazione su 'string.letters' di python: http://docs.python.org/library/string.html#string.lettere È basato su ASCII, quindi il valore restituito dipende dal sistema. –
come fa "il valore dipende dal sistema" da "È basato su ASCII"? ASCII è ben definito ed è esattamente lo stesso su ogni sistema. Quindi, se fosse veramente basato su ASCII, il risultato sarebbe sempre lo stesso. "ASCII" non è anche "qualsiasi codifica di caratteri a 8 bit". –