Domanda

Quali sono i tassi medi tipici di byte per carattere per le diverse codifiche Unicode in diverse lingue?

Per esempio.se volessi che il numero più piccolo di byte codificasse del testo inglese, in media UTF-8 sarebbe 1 byte per carattere e UTF-16 sarebbe 2, quindi sceglierei UTF-8.

Se volessi del testo coreano, UTF-16 potrebbe avere una media di circa 2 per carattere, ma UTF-8 potrebbe avere una media di circa 3 (non lo so, sto solo inventando alcuni numeri illustrativi qui).

Quali codifiche producono i requisiti di archiviazione più piccoli per lingue e set di caratteri diversi?

È stato utile?

Soluzione

Per ogni lingua, le percentuali di byte per carattere sono abbastanza costanti, poiché la maggior parte delle lingue viene assegnata a tabelle codici contigue.La grande eccezione sono i caratteri latini accentati, che sono allocati più in alto nello spazio del codice rispetto alle forme non accentate.Non ho numeri concreti per questi.

Per le lingue con allocazione di caratteri contigui, esiste a tabella con numeri dettagliati per le varie lingue suWikipedia.In generale, UTF-8 funziona bene per la maggior parte dei set di caratteri piccoli (eccetto quelli allocati su code page elevate) e UTF-16 è ottimo per i set di caratteri a due byte.

Se hai bisogno di una compressione più densa, potresti anche voler guardare Nota tecnica Unicode 14, che mette a confronto alcune codifiche per scopi speciali progettate per ridurre le dimensioni dei dati per una varietà di lingue.Ma queste tecniche non sono particolarmente comuni.

Altri suggerimenti

Se sei davvero preoccupato per la dimensione della stringa/carattere, hai pensato di comprimerli?Ciò ridurrebbe automaticamente la stringa alla sua codifica "minima".È un grattacapo, soprattutto se vuoi farlo in memoria, e ci sono molti casi in cui non ti comprerebbe nulla, ma la codifica, soprattutto, tende ad essere troppo generica per il livello di compattezza che sembri puntare.

UTF8 è la soluzione migliore per qualsiasi set di caratteri in cui i caratteri sono principalmente inferiori a U+0800.Altrimenti UTF16.

Cioè UTF8 per latino, greco, cirillico, ebraico, arabo e pochi altri.Nelle lingue diverse dal latino, i caratteri occuperanno lo stesso spazio di UTF16, ma risparmierai byte su punteggiatura e spaziatura.

In UTF-16, tutte le lingue che contano (ad es.qualsiasi cosa tranne klingon, elfi e altre cose strane) saranno codificati in caratteri da 2 byte.

Quindi la domanda è trovare le lingue che avranno glifi lunghi caratteri da 2 byte o 1 byte.

Nella pagina Wikipedia su UTF-8:http://en.wikipedia.org/wiki/Utf-8

Vediamo che un carattere con un indice Unicode pari o superiore a 0x0800 sarà lungo almeno 3 byte in UTF-8.

Sapendo questo, devi solo guardare le tabelle dei codici su unicode: http://www.unicode.org/charts/

per le lingue che soddisfano le tue esigenze.

:-)

Ora, tieni presente che, a seconda del framework che stai utilizzando, la scelta potrebbe non essere tua:

  • Nell'API Windows, Unicode è gestito dai caratteri wchar_t ed è UTF-16
  • Su Linux, Unicode è gestito da char ed è UTF-8
  • Java è internamente UTF-16, così come la maggior parte dei parser XML conformi
  • Mi è stato detto (una riunione tecnica a cui non ero interessato...scusa...) che UTF-8 era la codifica delle scelte sui database.

Quindi prendi il tuo veleno...

:-)

Non conosco le cifre esatte, ma per il giapponese Shift_JIS ha in media meno byte per carattere rispetto a UTF-8, così come EUC-JP, poiché sono ottimizzati per il testo giapponese.Tuttavia, non coprono lo stesso spazio di punti di codice di Unicode, quindi potrebbero non essere risposte corrette alla tua domanda.

UTF-16 è migliore di UTF-8 per i caratteri giapponesi (2 byte per carattere invece di 3), ma peggiore di UTF-8 se sono presenti molti caratteri a 7 bit.Dipende dal contesto: è più probabile che il testo tecnico contenga molti caratteri nell'intervallo di 1 byte.Un testo giapponese classico potrebbe non averne.

Tieni presente che per il trasporto, la codifica non ha molta importanza se puoi comprimere (gzip, bz2) i dati.I punti di codice per un alfabeto in Unicode sono vicini tra loro, quindi ti aspetteresti prefissi comuni con rappresentazioni molto brevi nei dati compressi.

UTF-8 è generalmente utile per la rappresentazione in memoria, poiché è spesso più compatto di UTF-32 o UTF-16 ed è compatibile con le funzioni su char* che "si aspettano" stringhe ASCII o ISO-8859-1 con terminazione NUL.Tuttavia, è inutile se hai bisogno di un accesso casuale ai caratteri tramite indice.

Se non ti interessano i caratteri non BMP, UCS-2 è sempre di 2 byte per carattere e quindi offre accesso casuale.Ma dipende da cosa intendi per "Unicode".

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