Qual è il modo più efficiente per calcolare la lunghezza in byte di un carattere, tenendo conto della codifica del carattere? La codifica sarebbe nota solo durante il runtime. Ad esempio, in UTF-8 i caratteri hanno una lunghezza di byte variabile, quindi ogni carattere deve essere determinato individualmente. Per quanto ora mi è venuta in mente questo:Modo efficiente per calcolare la lunghezza in byte di un carattere, a seconda della codifica
char c = getCharSomehow();
String encoding = getEncodingSomehow();
// ...
int length = new String(new char[] { c }).getBytes(encoding).length;
Ma questo è goffo e inefficace in un ciclo dal momento che un new String
bisogno di creare ogni volta. Non riesco a trovare altri modi più efficienti nell'API Java. C'è un String#valueOf(char)
, ma in base alla sua fonte fa sostanzialmente lo stesso di sopra. Immagino che questo può essere fatto con le operazioni bit per bit come bit di spostamento, ma questo è il mio punto debole e io sono sicuro come prendere la codifica in considerazione qui :)
Se si mette in discussione la necessità di questo, controllare this topic .
Update: la risposta da @Bkkbrad è tecnicamente il più efficiente:
char c = getCharSomehow();
String encoding = getEncodingSomehow();
CharsetEncoder encoder = Charset.forName(encoding).newEncoder();
// ...
int length = encoder.encode(CharBuffer.wrap(new char[] { c })).limit();
Tuttavia, come @Stephen C sottolineato, ci sono più problemi con questo. Ad esempio, potrebbero esserci caratteri combinati/surrogati che devono essere presi in considerazione. Ma questo è un altro problema che deve essere risolto nel passaggio prima di questo passaggio.
Utilizzando quanto sopra hai avuto problemi di prestazioni? Vuoi sempre usare UTF-8? –
L'esempio era effettivamente un po 'fuorviante, ma in realtà la codifica può essere determinata solo durante il runtime. Ho aggiornato la domanda. Dopo tutto, questo non sembra essere un compito facile però. – BalusC
questo è completamente sbagliato e quindi è la risposta di bkkbrad. In realtà è abbastanza spaventoso vedere così tante persone completamente sbagliate su quello (+1 solo alla risposta di bkail). Un Java * char * fa ** non **, ripeto ** A JAVA CHAR NON ** rappresenta più un personaggio da Java 1.4/Unicode 3.1. * String.value (char) * e wrapping "char" * e whatnots sono tutti metodi degli anni '90. Il mondo è andato avanti ed è passato molto tempo che Unicode ha più di 65 536 codepoint. Usa "int", prendi "char" fuori di testa perché Java char è rotto irreparabilmente. \t ♩ \t ♩ \t ♩ \t ♩ – SyntaxT3rr0r