Qual è il vantaggio di scegliere la codifica ASCII su UTF-8?


91

Tutti i caratteri in ASCII possono essere codificati utilizzando UTF-8 senza un aumento della memoria (entrambi richiedono un byte di memoria).

UTF-8 ha l'ulteriore vantaggio del supporto caratteri oltre a "caratteri ASCII". In tal caso, perché sceglieremo mai la codifica ASCII su UTF-8?

Esiste un caso d'uso in cui sceglieremo ASCII anziché UTF-8?


9
Per supportare roba legacy ...
dal

9
intendo l'UTF8 è legacily sostiene ASCII troppo. quindi, anche se devi supportare elementi legacy, UTF8 funzionerebbe perfettamente senza altre modifiche.
Pacerier,

3
Forse devi interagire con un sistema che racchiude 8 caratteri ASCII in 7 byte? La gente faceva cose pazze per adattarsi alle cose.
Donal Fellows

4
Chiamami pazzo, ma direi sicurezza e stabilità. Un set di caratteri senza sequenze multi-byte è molto più difficile da interrompere. Non fraintendetemi, quando il supporto del linguaggio umano è importante ASCII non lo taglierà. Ma se stai solo facendo una programmazione di base e riesci a comprimere nella lingua madre per la quale sono stati scritti il ​​compilatore e il sistema operativo, perché aggiungere la complessità? @Donal Fellows. L'ultima volta che ho controllato ... ASCII è di 7 byte. (qualsiasi cosa con quel bit in più non è ASCII e chiede problemi)
ebyrob

2
@ebyrob Penso che Donal Fellows significhi impacchettare 8 simboli ASCII in 7 byte, poiché ogni simbolo utilizza 7 bit ciascuno ... 8 * 7 = 56 bit = 7 byte. Significherebbe una speciale funzione di codifica e decodifica, solo per salvare 1 byte di memoria su ogni 8.
dodgy_coder

Risposte:


83

In alcuni casi può accelerare l'accesso ai singoli personaggi. Immagina una stringa str='ABC'codificata in UTF8 e in ASCII (e supponendo che il linguaggio / compilatore / database sia a conoscenza della codifica)

Per accedere al terzo Ccarattere ( ) da questa stringa utilizzando l'operatore di accesso all'array che è presente in molti linguaggi di programmazione, si dovrebbe fare qualcosa del genere c = str[2].

Ora, se la stringa è codificata ASCII, tutto ciò che dobbiamo fare è recuperare il terzo byte dalla stringa.

Se, tuttavia, la stringa è codificata UTF-8, dobbiamo prima verificare se il primo carattere è un carattere a uno o due byte, quindi dobbiamo eseguire lo stesso controllo sul secondo carattere e solo allora possiamo accedere al terzo carattere. La differenza nelle prestazioni sarà maggiore, più lunga sarà la stringa.

Questo è un problema ad esempio in alcuni motori di database, dove trovare un inizio di una colonna posizionata 'dopo' un VARCHAR codificato UTF-8, il database non deve solo controllare quanti caratteri ci sono nel campo VARCHAR, ma anche come molti byte ciascuno di essi utilizza.


3
Se il database non memorizza sia il "conteggio dei caratteri" che il "conteggio dei byte", direi che ha dei problemi ...
Dean Harding,

1
TBH Non conosco nessun database che possa archiviare ...
Mchl

@Mchl: come immagini che il database sappia quando ha raggiunto la fine della stringa?
Kevin Cline, l'

1
Di solito raggiungendo 0x00 o 0x0000
Mchl

4
@DeanHarding In che modo il conteggio dei personaggi ti dice dove inizia il secondo personaggio? O il database dovrebbe contenere un indice anche per ogni offset di carattere? Nota: non sono solo 2 caratteri, ma potrebbero essere fino a 4 (a meno che non siano 6) stackoverflow.com/questions/9533258/… . (Penso che sia solo l'utf-16 che ha avuto le abominazioni davvero lunghe che potrebbero distruggere il tuo sistema)
ebyrob

7

Se stai per usare solo il sottoinsieme US-ASCII (o ISO 646) di UTF-8, allora non c'è alcun vantaggio reale per l'uno o l'altro; infatti, tutto è codificato in modo identico.

Se andrai oltre il set di caratteri US-ASCII e utilizzerai (ad esempio) caratteri con accenti, dieresi, ecc., Utilizzati nelle lingue tipiche dell'Europa occidentale, allora c'è una differenza: la maggior parte di questi può ancora essere codificato con un singolo byte in ISO 8859, ma richiederà due o più byte se codificato in UTF-8. Ovviamente ci sono anche degli svantaggi: ISO 8859 richiede l'utilizzo di alcuni mezzi fuori banda per specificare la codifica utilizzata e ne supporta solo unodi queste lingue alla volta. Ad esempio, puoi codificare tutti i caratteri dell'alfabeto cirillico (russo, bielorusso, ecc.) Usando solo un byte ciascuno, ma se hai bisogno / vuoi mescolare quelli con caratteri francesi o spagnoli (diversi da quelli negli Stati Uniti-ASCII / Sottogruppo ISO 646) sei quasi sfortunato - per farlo devi cambiare completamente i set di caratteri.

ISO 8859 è davvero utile solo per gli alfabeti europei. Per supportare la maggior parte degli alfabeti utilizzati nella maggior parte degli alfabeti cinesi, giapponesi, coreani, arabi, ecc., È necessario utilizzare una codifica completamente diversa. Alcuni di questi (ad esempio, Shift JIS per il giapponese) sono un dolore assoluto da affrontare. Se c'è qualche possibilità che tu voglia mai supportarli, considererei utile usare Unicode per ogni evenienza.


5

ANSI può essere molte cose, la maggior parte dei quali è un set di caratteri a 8 bit in questo senso (come la tabella codici 1252 in Windows).

Forse stavi pensando a ASCII che è a 7 bit e un sottoinsieme proprio di UTF-8. Vale a dire qualsiasi flusso ASCII valido è anche un flusso UTF-8 valido.

Se si pensasse a set di caratteri a 8 bit, un vantaggio molto importante sarebbe che tutti i caratteri rappresentabili sono esattamente a 8 bit, mentre in UTF-8 possono essere fino a 24 bit.


sì, sto parlando del set ASCII a 7 bit. riesci a pensare a 1 vantaggio di cui avremo mai bisogno per salvare qualcosa come ascii invece di utf-8? (poiché il 7 bit verrebbe comunque salvato come 8 bit, la dimensione del file sarebbe esattamente la stessa)
Pacerier

1
Se hai caratteri più grandi del valore unicode 127, non possono essere salvati in ASCII.

1
@Pacerier: qualsiasi stringa ASCII è una stringa UTF-8 , quindi non c'è alcuna differenza . La routine di codifica potrebbe essere più veloce a seconda della rappresentazione delle stringhe della piattaforma che usi, anche se non mi aspetterei un aumento di velocità significativo, mentre tu hai una perdita significativa di flessibilità.
back2dos,

@Thor è esattamente per questo che sto chiedendo se il salvataggio come ASCII ha qualche vantaggio
Pacerier

5
@Pacerier, se salvi XML come ASCII devi usare ad es. & # 160; per uno spazio indistruttibile. Questo è più completo, ma rende i tuoi dati più resistenti agli errori di codifica ISO-Latin-1 vs UTF-8. Questo è ciò che facciamo perché la nostra piattaforma sottostante fa molta magia invisibile con i personaggi. Restare in ASCII rende i nostri dati più robusti.

3

Sì, ci sono ancora alcuni casi d'uso in cui ASCII ha senso: formati di file e protocolli di rete . In particolare, per usi in cui:

  • Hai dati generati e consumati da programmi per computer, mai presentati agli utenti finali;
  • Ma è utile che i programmatori siano in grado di leggere, per facilitare lo sviluppo e il debug.

Usando ASCII come codifica si evita la complessità della codifica multi-byte mantenendo almeno un po 'di leggibilità umana.

Un paio di esempi:

  • HTTP è un protocollo di rete definito in termini di sequenze di ottetti, ma è molto utile (almeno per i programmatori di lingua inglese) che questi corrispondono alla codifica ASCII di parole come "GET", "POST", "Accept-Language" e presto.
  • I tipi di blocchi nel formato immagine PNG sono composti da quattro ottetti, ma è utile se stai programmando un codificatore o decodificatore PNG che IDATsignifica "dati immagine" e PLTE"tavolozza".

Ovviamente devi stare attento che i dati non verranno realmente presentati agli utenti finali, perché se finiscono per essere visibili (come è accaduto nel caso degli URL), gli utenti si aspetteranno giustamente che i dati vengano in una lingua che sanno leggere.


Ben detto. È un po 'ironico che HTTP, il protocollo che trasmette il più unicode del pianeta, debba solo supportare ASCII. (In realtà, suppongo che lo stesso vale per TCP e IP, supporto binario, supporto ASCII ... questo è tutto ciò che serve a quel livello dello stack)
ebyrob

2

Prima di tutto: il tuo titolo usa / d ANSI, mentre nel testo fai riferimento ad ASCII. Si noti che ANSI non equivale a ASCII. ANSI incorpora il set ASCII. Ma il set ASCII è limitato ai primi 128 valori numerici (0 - 127).

Se tutti i tuoi dati sono limitati a ASCII (7 bit), non importa se usi UTF-8, ANSI o ASCII, poiché sia ​​ANSI che UTF-8 incorporano l'intero set ASCII. In altre parole: i valori numerici da 0 a 127 inclusi rappresentano esattamente gli stessi caratteri in ASCII, ANSI e UTF-8.

Se hai bisogno di caratteri al di fuori del set ASCII, dovrai scegliere una codifica. È possibile utilizzare ANSI, ma si verificano problemi con tutte le diverse tabelle di codici. Creare un file sulla macchina A e leggerlo sulla macchina B può / produrrà testi dall'aspetto divertente se queste macchine sono impostate per utilizzare diverse tabelle di codici, semplice perché il valore numerico nnn rappresenta caratteri diversi in queste pagine di codici.

Questo "inferno della tabella codici" è il motivo per cui è stato definito lo standard Unicode . UTF-8 è solo una singola codifica di quello standard, ce ne sono molti altri. UTF-16 è il più utilizzato in quanto è la codifica nativa per Windows.

Quindi, se hai bisogno di supportare qualcosa oltre i 128 caratteri del set ASCII, il mio consiglio è di usare UTF-8 . In questo modo non importa e non devi preoccuparti di quale code page i tuoi utenti hanno configurato i loro sistemi.


se non ho bisogno di supportare oltre 128 caratteri, qual è il vantaggio di scegliere la codifica ACSII rispetto alla codifica UTF8?
Pacerier,

Oltre a limitarti a quei 128 caratteri? Non tanto. UTF-8 è stato specificamente progettato per soddisfare ASCII e la maggior parte delle lingue occidentali che "solo" necessitano di ANSI. Scoprirai che UTF-8 codificherà solo un numero relativamente piccolo di caratteri ANSI superiori con più di un byte. C'è un motivo per cui la maggior parte delle pagine HTML utilizza UTF-8 come predefinito ...
Marjan Venema,

1
@Pacerier, se non hai bisogno di codificare sopra 127, può valere la pena scegliere ASCII quando usi qualche API per codificare / decodificare, poiché UTF ha bisogno di un'ulteriore verifica dei bit per considerare byte aggiuntivi come lo stesso carattere, può richiedere un calcolo aggiuntivo anziché ASCII puro che ha appena letto 8 bit senza verifica. Ma ti consiglio di usare ASCII solo se hai davvero bisogno di un alto livello di ottimizzazione nel calcolo grande (grande grande) e sai cosa stai facendo in quella ottimizzazione. In caso contrario, utilizzare solo UTF-8.
Luciano,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.