Domanda

Abbiamo un set di applicazioni sviluppate per il set di caratteri ASCII. Ora stiamo provando a installarlo in Islanda e stiamo riscontrando problemi in cui i personaggi islandesi vengono rovinati.

Stiamo risolvendo i nostri problemi, ma mi chiedevo: esiste una buona "guida"? là fuori per la scrittura di codice C ++ progettato per caratteri a 8 bit e che funzionerà correttamente quando gli vengono dati i dati UTF-8?

Non posso aspettarmi che tutti leggano l'intero standard Unicode, ma se c'è qualcosa di più digeribile disponibile, vorrei condividerlo con il team, quindi non incontreremo di nuovo questi problemi.

Al momento non è possibile riscrivere tutte le applicazioni per usare wchar_t o qualche altra rappresentazione di stringa. Noterò anche che queste applicazioni comunicano su reti con server e dispositivi che usano caratteri a 8 bit, quindi anche se facessimo Unicode internamente, avremmo ancora problemi con la traduzione ai limiti. Per la maggior parte, queste applicazioni trasmettono semplicemente dati; non " processano " il testo in alcun modo diverso da copiarlo da un luogo all'altro.

I sistemi operativi utilizzati sono Windows e Linux. Usiamo std :: string e stringhe C semplici. (E non chiedermi di difendere nessuna delle decisioni di progettazione. Sto solo cercando di aiutare a risolvere il pasticcio.)


Ecco un elenco di ciò che è stato suggerito:

È stato utile?

Soluzione

Sembra una guida rapida completa:
http://www.cl.cam.ac.uk/~mgk25/ unicode.html

Altri suggerimenti

Sii pulito a 8 bit, per la maggior parte. Tuttavia, dovrai essere consapevole del fatto che qualsiasi carattere non ASCII si divide su più byte, quindi devi tenerne conto in caso di interruzione di riga o troncamento del testo per la visualizzazione.

UTF-8 ha il vantaggio di poter sempre dire dove ci si trova in un carattere multi-byte: se il bit 7 è impostato e il bit 6 ripristinato (il byte è 0x80-0xBF) questo è un byte finale, mentre se i bit 7 e 6 sono impostati e 5 è resettato (0xC0-0xDF) è un byte iniziale con un byte finale; se sono impostati 7, 6 e 5 e 4 è resettato (0xE0-0xEF) è un byte iniziale con due byte finali e così via. Il numero di bit consecutivi impostati sul bit più significativo è il numero totale di byte che compongono il carattere. Cioè:

110x xxxx = carattere a due byte
1110 xxxx = carattere a tre byte
1111 0xxx = carattere a quattro byte
etc

L'alfabeto islandese è tutto contenuto in ISO 8859-1 e quindi Windows-1252. Se si tratta di un'applicazione in modalità console, tenere presente che la console utilizza codici IBM, quindi (a seconda delle impostazioni internazionali del sistema) potrebbe essere visualizzata in 437, 850 o 861 . Windows non supporta il display nativo per UTF-8; devi trasformarti in UTF-16 e utilizzare le API Unicode.

Chiamare SetConsoleCP e SetConsoleOutputCP, specificando la tabella codici 1252, aiuterà con il tuo problema, se si tratta di un'applicazione in modalità console. Sfortunatamente il font della console selezionato deve essere un font che supporti la tabella codici e non riesco a vedere un modo per impostare il font. I caratteri bitmap standard supportano solo la tabella codici OEM predefinita di sistema.

Tieni presente che l'unicode completo non si adatta ai caratteri a 16 bit; quindi usa caratteri a 32 bit o codifica a larghezza variabile (UTF-8 è il più popolare).

UTF-8 è stato progettato esattamente pensando ai tuoi problemi. Una cosa su cui starei attento è che ASCII è davvero una codifica a 7 bit, quindi se una parte della tua infrastruttura utilizza l'ottavo bit per altri scopi, potrebbe essere complicato.

Potresti voler dare un'occhiata a icu . Potrebbero avere funzioni disponibili che faciliterebbero il lavoro con le stringhe UTF-8.

L'islandese utilizza ISO Latin 1, quindi otto bit dovrebbero essere sufficienti. Abbiamo bisogno di maggiori dettagli per capire cosa sta succedendo.

L'islandese, come il francese, il tedesco e la maggior parte delle altre lingue dell'Europa occidentale, può essere supportato utilizzando un set di caratteri a 8 bit (CP1252 su Windows, ISO 8859-1 aka Latin1 su * x). Questo era l'approccio standard prima dell'invenzione di Unicode ed è ancora abbastanza comune. Come dici tu hai un vincolo che non puoi riscrivere la tua app per usare wchar, e non è necessario.

Non dovresti essere sorpreso che UTF-8 stia causando problemi; UTF-8 codifica i caratteri non ASCII (ad es. I caratteri latini accentati, spina, eth, ecc.) Come DUE BYTES ciascuno.

L'unico consiglio generale che può essere dato è abbastanza semplice (in teoria): (1) decidi quale set di caratteri supportare (Unicode, Latin1, CP1252, ...) nel tuo sistema (2) se vi vengono forniti dati codificati in qualche altro modo (ad es. UTF-8), quindi transcodificarli secondo lo standard (ad es. CP1252) al confine del sistema (3) se è necessario fornire dati codificati in qualche altro modo, ...

Potresti voler usare caratteri ampi (wchar_t invece di char e std :: wstring invece di std :: string). Questo non risolve automaticamente il 100% dei tuoi problemi, ma è un buon primo passo.

Utilizza anche funzioni stringa che sono compatibili con Unicode (consulta la documentazione). Se qualcosa manipola caratteri o stringhe ampi, generalmente è consapevole che sono larghi.

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