Domanda

Sono obsoleti? Sembrano la peggior idea di sempre: incorporare qualcosa nel contenuto del tuo file che nessuno può vedere, ma influisce sulla funzionalità del file. Non capisco perché ne vorrei uno.

È stato utile?

Soluzione

Sono necessari in alcuni casi, sì, perché ci sono implementazioni sia little-endian che big-endian di UTF-16.

Quando si legge un file UTF-16 sconosciuto, come si può sapere quale dei due viene utilizzato? L'unica soluzione è quella di inserire una sorta di marker facilmente identificabile nel file, che non può mai essere scambiato per nient'altro, indipendentemente dall'endianità utilizzata.

Ecco cosa fa la DBA.

E ne hai bisogno? Solo se stai 1) stai usando una codifica UTF in cui l'endianness è un problema (è importante per UTF-16, ma UTF8 ha sempre lo stesso aspetto indipendentemente dall'endianness), e il file verrà condiviso con applicazioni esterne.

Se la tua app è l'unica che leggerà e scriverà il file, puoi omettere la DBA e decidere semplicemente una volta per tutte quale endianness userai. Ma se un'altra applicazione deve leggere il file, non conoscerà l'endianness in anticipo, quindi aggiungere la DBA potrebbe essere una buona idea.

Altri suggerimenti

Alcuni estratti delle FAQ UTF e BOM del consorzio Unicode possono essere utili.

  

D: Cos'è una DBA?

     

A: Un contrassegno di ordine di byte (DBA) è costituito dal codice carattere U + FEFF all'inizio di un flusso di dati , dove può essere utilizzato come firma definire l'ordine dei byte e la forma di codifica, principalmente di file di testo in chiaro non contrassegnati. In base ad alcuni protocolli di livello superiore, l'uso di una DBA potrebbe essere obbligatorio (o proibito) nel flusso di dati Unicode definito in quel protocollo. (Enfasi mia.)

Non direi esattamente che il segno dell'ordine dei byte sia incorporato nei dati. Piuttosto, prefissa i dati. Il carattere è solo un segno di ordine byte quando è la prima cosa nel flusso di dati. Ovunque altro, ed è lo spazio non-break a larghezza zero . I programmi compatibili con Unicode che non rispettano il segno dell'ordine dei byte non sono comunque realmente danneggiati dalla sua presenza poiché il personaggio è invisibile e un word-joiner all'inizio di un blocco di testo non unisce il carattere successivo a nulla, quindi non ha alcun effetto.

  

D: Dove è utile una DBA?

     

A: Una DBA è utile all'inizio di file digitati come testo, ma per i quali non è noto se siano in formato endian grande o piccolo & # 8212; può anche servire come suggerimento per indicare che il file è in Unicode, al contrario di una codifica legacy e inoltre, funge da firma per il modulo di codifica specifico utilizzato.

Quindi, vorresti una DBA quando il tuo programma è in grado di gestire codifiche multiple di Unicode. In quale altro modo il tuo programma saprà quale codifica utilizzare per interpretare il suo input?

  

D: Quando viene utilizzata una distinta base, è solo nel testo Unicode a 16 bit?

     

A: No, una distinta base può essere utilizzata come firma indipendentemente dalla trasformazione del testo Unicode: UTF-16, UTF-8, UTF-7, ecc. I byte esatti che compongono il La distinta base sarà qualunque sia il carattere Unicode U + FEFF convertito in quel formato di trasformazione. In tale forma, la DBA serve ad indicare sia che si tratta di un file Unicode, sia in quale formato si trova.

Questo è probabilmente il caso in cui la distinta base viene utilizzata più frequentemente oggi. Distingue il testo con codifica UTF-8 da qualsiasi altra codifica; non sta davvero marcando l'ordine dei byte poiché UTF-8 ha un solo ordine.

Se si sta progettando il proprio protocollo o formato dati, non è necessario utilizzare una DBA. Un'altra domanda delle FAQ tocca questo:

  

D: Come posso taggare i dati che non interpretano U + FEFF come una distinta base?

     

A: Utilizza il tag UTF-16BE per indicare il testo UTF-16 di big endian e UTF-16LE per indicare il testo UTF-16 di little endian. Se usi una DBA, tagga il testo come semplicemente UTF-16.

Menziona il concetto di tagging nel formato dei tuoi dati. Ciò significa specificare il formato fuori banda dai dati stessi. È fantastico se una tale struttura è disponibile per te, ma spesso non lo è, specialmente quando i sistemi più vecchi vengono adattati per Unicode.

La distinta base indica in quale codifica Unicode si trova il file. Senza questa distinzione, un lettore unicode non saprebbe leggere il file.

Tuttavia, UTF-8 non richiede una DBA.

Consulta articolo di Wikipedia .

Mentre lo hai taggato con UTF-8, sto per dire che non hai bisogno di una DBA. I marchi Byto Order sono utili solo per UTF-16 e UTF-32 in quanto informano il computer se il file è in Big Endian o Little Endian . Alcuni editor di testi possono utilizzare il Byte Order Mark per decidere quale codifica utilizzare il documento ma questo non fa parte dello standard Unicode.

Il " BOM " è un blocco dai primi giorni di Unicode quando si presumeva che l'utilizzo di Unicode avrebbe significato l'utilizzo di caratteri a 16 bit. È completamente inutile in una codifica come UTF-8 che ha un solo ordine di byte. La scelta di U + FEFF è anche non ottimale per UTF-32, perché non è in grado di distinguere tra tutti i possibili ordini di byte di fascia medio-endiana (per fare ciò richiederebbe una distinta base codificata con 4 diversi byte).

L'unico motivo per cui dovresti usarne uno è quando invii dati UTF-16 o UTF-32 tra piattaforme con diversi ordini di byte, ma (1) la maggior parte delle persone usa comunque UTF-8 e (2) il MIME charset Il parametro fornisce un meccanismo migliore.

UTF16 e UTF32 possono essere scritti in entrambe le forme Big-Endian e Little-Endian. Potresti provare a determinare euristicamente l'endianess analizzando il risultato del trattamento del file in entrambe le endianess, ma per salvarti tutto quel fastidio, la distinta componenti può dirti subito.

UTF-8 non ha davvero bisogno di una DBA, poiché la decodifichi byte per byte.

Indipendentemente dal fatto che tu li usi tu stesso durante la creazione di file di testo, è probabilmente utile essere consapevoli di quando leggi i file di testo. cioè rilevare e saltare (e gestire idealmente di conseguenza) la DBA all'inizio del file. Ne ho incontrati alcuni che lo avevano e che mi hanno causato alcuni problemi inizialmente fino a quando non ho capito cosa stava succedendo.

Dato che le distinte base UTF16 e UTF32 indicano se il contenuto è in formato Big-Endian o Little-Endian e anche che il contenuto è Unicode, la distinta base UTF-8 classifica il file come codificato utf-8. Senza la distinta base UTF-8, come si può sapere se si tratta di un file ANSI o di un file codificato UTF-8? Ovviamente la distinta base UTF-8 non indica l'endianità, poiché utf-8 è sempre un flusso di byte, ma indica se il contenuto è codificato in Unicode o ANSI. Naturalmente è possibile cercare sequenze utf-8 valide, ma a mio avviso, è più facile controllare i primi tre byte del file.

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