Domanda

Qual è la differenza tra UTF e UCS.

Quali sono i modi migliori per rappresentare set di caratteri non europei (usando UTF) nelle stringhe C ++. Vorrei sapere i tuoi consigli per:

  • Rappresentazione interna all'interno del codice
    • Per manipolazione di stringhe in fase di esecuzione
    • Per utilizzare la stringa a scopo di visualizzazione.
  • Migliore rappresentazione dello spazio di archiviazione ( ovvero nel file)
  • Migliore sul formato di trasporto via cavo (trasferimento tra applicazioni che potrebbero essere su architetture diverse e avere impostazioni internazionali standard diverse)
È stato utile?

Soluzione

  

Qual è la differenza tra UTF e UCS.

Le codifiche UCS hanno una larghezza fissa e sono contrassegnate dal numero di byte utilizzati per ciascun carattere. Ad esempio, UCS-2 richiede 2 byte per carattere. I caratteri con punti di codice al di fuori dell'intervallo disponibile non possono essere codificati in una codifica UCS.

Le codifiche UTF hanno una larghezza variabile e sono contrassegnate dal numero minimo di bit per memorizzare un carattere. Ad esempio, UTF-16 richiede almeno 16 bit (2 byte) per carattere. I caratteri con punti di codice di grandi dimensioni vengono codificati utilizzando un numero maggiore di byte - 4 byte per i caratteri astrali in UTF-16.

  
      
  • Rappresentazione interna all'interno del codice
  •   
  • Migliore rappresentazione dello spazio di archiviazione (ad esempio nel file)
  •   
  • Formato migliore per il trasporto via cavo (trasferimento tra applicazioni che potrebbe   essere su architetture diverse e avere   un locale standard diverso)
  •   

Per i sistemi moderni, la codifica di archiviazione e trasporto più ragionevole è UTF-8. Ci sono casi speciali in cui altri potrebbero essere appropriati - UTF-7 per vecchi server di posta, UTF-16 per editor di testo scritti male - ma UTF-8 è più comune.

La rappresentazione interna preferita dipenderà dalla tua piattaforma. In Windows, è UTF-16. In UNIX, è UCS-4. Ognuno ha i suoi punti positivi:

  • Le stringhe UTF-16 non usano mai più memoria di una stringa UCS-4. Se si memorizzano molte stringhe di grandi dimensioni con caratteri principalmente nel piano multilingue di base (BMP), UTF-16 richiederà molto meno spazio di UCS-4. Al di fuori del BMP, utilizzerà lo stesso importo.
  • UCS-4 è più facile da ragionare. Poiché i caratteri UTF-16 potrebbero essere suddivisi su più "coppie surrogate", può essere difficile dividere o rendere correttamente una stringa. Il testo UCS-4 non presenta questo problema. UCS-4 agisce in modo molto simile al testo ASCII in "char". array, quindi gli algoritmi di testo esistenti possono essere trasferiti facilmente.

Infine, alcuni sistemi utilizzano UTF-8 come formato interno. Ciò è utile se è necessario interagire con sistemi esistenti basati su ASCII o ISO-8859 poiché i byte NULL non sono presenti nel mezzo del testo UTF-8, ma sono in UTF-16 o UCS-4.

Altri suggerimenti

Suggerirei:

  • Per la rappresentazione nel codice, wchar_t o equivalente.
  • Per la rappresentazione della memoria, UTF-8.
  • Per la rappresentazione del filo, UTF-8.

Il vantaggio di UTF-8 in situazioni di archiviazione e cavi è che l'endianness della macchina non è un fattore. Il vantaggio di utilizzare un carattere di dimensioni fisse come wchar_t nel codice è che puoi facilmente scoprire la lunghezza di una stringa senza doverla scansionare.

UTC è Coordinated Universal Time, non un set di caratteri (non ho trovato alcun set di caratteri chiamato UTC).

Per la rappresentazione interna, potresti voler usare wchar_t per ogni carattere e std :: wstring per le stringhe. Usano esattamente 2 byte per ogni personaggio, quindi la ricerca e l'accesso casuale saranno veloci.

Per l'archiviazione, se la maggior parte dei dati non è ASCII (cioè codice > = 128), potresti voler usare UTF-16 che è quasi uguale a wstring e serializzati wchar_t .

Poiché UTF-16 può essere little endian o big endian, per il trasporto via cavo, prova a convertirlo in UTF-8, che è indipendente dall'architettura.

Nella rappresentazione interna all'interno del codice, è meglio farlo sia per i caratteri europei che per quelli non europei:

\ unnnn

I caratteri nell'intervallo da \ u0020 a \ u007E e un po 'di spazio bianco (ad es. fine della linea) possono essere scritti come caratteri ordinari. Qualunque cosa sopra \ u0080, se la scrivi come un normale carattere, verrà compilata solo nella tua tabella codici (ad es. OK in Francia ma rompendo in Russia, OK in Russia ma rompendo in Giappone, OK in Cina ma rompendo negli Stati Uniti, ecc. .).

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