Domanda

Esiste un wchar_t portatile in C ++? Su Windows, i suoi 2 byte. Su tutto il resto è di 4 byte. Vorrei utilizzare wstring nella mia applicazione, ma ciò causerà problemi se decido di effettuare il porting in linea.

È stato utile?

Soluzione

Se hai a che fare con l'uso interno del programma, non preoccuparti; un wchar_t nella classe A è uguale alla classe B.

Se stai pianificando di trasferire dati tra le versioni Windows e Linux / MacOSX, devi preoccuparti di più di wchar_t e devi trovare i mezzi per gestire tutti i dettagli.

Potresti definire un tipo che definirai quattro byte ovunque, e implementare le tue stringhe, ecc. (dal momento che la maggior parte della gestione del testo in C ++ è basata su modelli), ma non so quanto funzionerebbe le tue esigenze.

Qualcosa come typedef int my_char; typedef std::basic_string<my_char> my_string;

Altri suggerimenti

Cosa intendi con " portable wchar_t " ;? Esiste un tipo uint16_t largo 16 bit ovunque, che è spesso disponibile. Ma questo ovviamente non costituisce ancora una stringa. Una stringa deve conoscere la sua codifica per dare un senso a funzioni come length(), substring() e così via (quindi non taglia i caratteri nel mezzo di un punto di codice quando si usa utf8 o 16). Ci sono alcune classi di stringhe compatibili unicode che conosco e che puoi usare. Tutti possono essere utilizzati gratuitamente nei programmi commerciali (quello Qt sarà compatibile con i programmi commerciali gratuitamente tra un paio di mesi, quando verrà rilasciato Qt 4.5).

ustring dal gtkmm . Se programmi con gtkmm o usi glibmm, questa dovrebbe essere la prima scelta, usa utf-8 internamente. Qt ha anche una classe di stringhe, chiamata QString. È codificato in utf-16. ICU è un altro progetto che crea classi di stringhe Unicode portatili e ha una classe UnicodeString che internamente sembra essere codificato in utf-16, come Qt. Non l'ho usato però.

Lo standard C ++ 0x proposto avrà char16_t e char32_t tipi. Fino ad allora, dovrai ricorrere all'utilizzo di numeri interi per il tipo di carattere non wchar_t.

#if defined(__STDC_ISO_10646__)
    #define WCHAR_IS_UTF32
#elif defined(_WIN32) || defined(_WIN64)
    #define WCHAR_IS_UTF16
#endif

#if defined(__STDC_UTF_16__)
    typedef _Char16_t CHAR16;
#elif defined(WCHAR_IS_UTF16)
    typedef wchar_t CHAR16;
#else
    typedef uint16_t CHAR16;
#endif

#if defined(__STDC_UTF_32__)
    typedef _Char32_t CHAR32;
#elif defined(WCHAR_IS_UTF32)
    typedef wchar_t CHAR32;
#else
    typedef uint32_t CHAR32;
#endif

Secondo lo standard, dovrai specializzarti char_traits per i tipi interi. Ma su Visual Studio 2005, sono andato via con std::basic_string<CHAR32> senza una gestione speciale.

  

Ho intenzione di utilizzare un database SQLite.

Quindi dovrai usare UTF-16, non <=>.

L'API di SQLite ha anche una versione UTF-8. Potresti voler usare questo invece di affrontare le <=> differenze.

Il mio consiglio. Usa UTF-8 e std :: string. Le stringhe ampie non porterebbero troppo valore aggiunto. Dato che comunque non puoi interpretare un carattere largo come una lettera come alcuni caratteri creati da diversi punti di codice unicode.

Quindi usa ovunque UTF-8 e usa una buona libreria per gestire i linguaggi naturali. Come ad esempio Boost.Locale.

Cattiva idea: definire qualcosa come typedef uint32_t mychar; è cattiva. Dato che non puoi usare iostream con esso, non puoi creare ad esempio stringstream basato su questo personaggio poiché non saresti in grado di scriverlo.

Ad esempio questo non funzionerebbe:

std::basic_ostringstream<unsigned> s;
ss << 10;

Non ti creerebbe una stringa.

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