2011-12-14 9 views
10

per verificare se C++ è il linguaggio giusto per un mio progetto, voglio testare le capacità UTF-8. Secondo i riferimenti, ho costruito questo esempio:Gestione UTF-8 in C++

#include <string> 
#include <iostream> 

using namespace std; 

int main() { 
    wstring str; 
    while(getline(wcin, str)) { 
     wcout << str << endl; 
     if(str.empty()) break; 
    } 

    return 0; 
} 

Ma quando si digita in un caratteri UTF-8, si comporta male:

$ > ./utf8 
Hello 
Hello 
für 
f 
$ > 

Non solo non stampa il ü, ma si chiude anche subito. gdb mi ha detto che non c'era un incidente, ma una normale uscita, eppure trovo difficile crederlo.

+0

Quale piattaforma stai targeting (Windows, Linux, ecc)? –

+0

Linux, in realtà. Se funziona anche su Windows, è una specie di bonus. – Lanbo

+2

Le impostazioni internazionali sono impostate su una codifica UTF-8? –

risposta

8

Non utilizzare wstring su Linux.

std::wstring VS std::string

Date un'occhiata a prima risposta. Sono sicuro che risponda alla tua domanda.

  1. Quando devo usare std :: wstring sopra std :: string?

su Linux? Quasi mai (§).

su Windows? Quasi sempre (§).

+0

+1: dai un'occhiata a questa risposta. Sono sicuro che si collega a una risposta alla tua domanda. – Klaim

+0

Nei commenti di 'boost :: spirit' su UTF-8 si parla sempre dell'uso di' wchar_t'. – Lanbo

+0

@ Scán: Suppongo che usino 'wchar_t' tutto il tempo per i punti di codice, usati quando si traduce UTF8 da qualsiasi cosa. 'wchar_t' non è un buon personaggio per UTF8 stesso. –

7

Il linguaggio in sé non ha nulla a che fare con unicode o con qualsiasi altra codifica di caratteri. È legato al sistema operativo. Windows usa UTF16 per il supporto Unicode che implica l'utilizzo di caratteri wide (caratteri wide a 16 bit) - wchar_t o std: wstring. Ogni funzione Win Api che funziona con stringhe richiede un ampio input di char.

Ma basati su sistemi UNIX cioè Mac OS X o Linux usano UTF8. Ovviamente, è solo questione di come gestisci i byte nell'array, quindi puoi avere una stringa UTF16 memorizzata nell'array C o nel contenitore standard: string string. Questo è il motivo per cui non vedi alcun wstring nel codice cross-platform; invece tutte le stringhe vengono gestite come UTF8 e ricodificate quando necessario in UTF16 (su Windows).

si hanno più opzioni come gestire questa roba un po 'di confusione. Io personalmente faccio come detto sopra - rigorosamente utilizzando la codifica UTF-8 in tutte le applicazioni, le stringhe ri-codifica quando si interagisce con Windows Api e direttamente il loro utilizzo su Mac OS X. Per la vittoria ricodifica Io uso grandi aiutanti di conversione:

C++ UTF-8 Conversion Helpers (su MSDN, disponibile con licenza Apache, versione 2.0).

È inoltre possibile utilizzare Qt String multipiattaforma che definisce le funzioni di conversione da UTF8 a/da UTF16 e altre codifiche (ANSI, latino ...).

Quindi la risposta di cui sopra - in UNIX Utilizzare sempre UTF8 (std :: string, char), su Windows UTF16 (std :: wstring, wchar_t) è vero.

+0

Quindi cosa dovrei fare se voglio fare un compilatore/interprete di lingua che tratta tutto come UTF-8 su entrambi i sistemi? – Lanbo

+0

Beh, non esiste una risposta semplice e una soluzione "definitiva". Dipende da quali compilatori, IDE e API usi. Ti consiglierei di utilizzare un framework per applicazioni multipiattaforma, idealmente Qt di Nokia - http://qt.nokia.com. È completamente gratuito per progetti open source e anche per quelli commerciali - se si garantisce la conformità con la GNU General Public License (LGPL). – vitakot

3

Ricordate che all'avvio del programma principale, il locale "C" è selezionata come predefinita. Probabilmente non lo vuoi se gestisci utf-8. Calling setlocale(LC_CTYPE, "") si spegne questa impostazione predefinita, e si ottiene tutto ciò che è definito nell'ambiente (presumibilmente un locale UTF-8).

+1

Sì! Contrariamente ad altre risposte, è perfettamente OK usare 'wchar_t' su Linux. Devi assolutamente usare il locale giusto però. –