2010-04-27 12 views
7

Su piattaforme diverse da Windows è possibile utilizzare facilmente le stringhe char * e trattarle come UTF-8.Come gestire le stringhe Unicode in C/C++ in modo cross-platform friendly?

Il problema è che su Windows è necessario accettare e inviare messaggi utilizzando wchar * stringhe (W). Se utilizzerai le funzioni ANSI (A) non supporterai Unicode.

Quindi, se si vuole scrivere applicazioni veramente portatile è necessario compilarlo come Unicode su Windows.

Ora, per mantenere pulito il codice mi piacerebbe vedere quale sia il modo consigliato di gestire le stringhe, un modo che minimizzi la bruttezza nel codice.

Tipo di stringhe potrebbe essere necessario: std::string, std::wstring, std::tstring, char *, wchat_t *, TCHAR*, CString (ATL uno).

problemi che potrebbero verificarsi:

  • cout/cerr/cin e la loro Unicode varianti wcout,wcerr,wcin
  • tutte le funzioni rinominati ampi archi e le loro macro TCHAR - come strcmp, wcscmp e _tcscmp.
  • stringhe costanti all'interno del codice, con TCHAR si dovrà compilare il codice con _T() macro.

Quale approccio ritiene migliore? (esempi sono i benvenuti)

Personalmente vorrei andare per un approccio std::tstring ma mi piacerebbe vedere come farebbe alle conversioni dove sono necessarie.

+1

http://utf8everywhere.org spiega tutto. –

risposta

3

Posso solo suggerire di controllare questa libreria: http://cppcms.sourceforge.net/boost_locale/docs/
Potrebbe essere d'aiuto, per ora è un buon candidato ma credo che ce la farà.

+0

La documentazione più recente è posto a http://cppcms.sourceforge.net/boost_locale/html/tutorial.html – Artyom

+0

Thanks :) Come sta andando? È già fatto? –

+1

funziona correttamente.Aspetto solo alcune correzioni in boost-build per fare in modo che bjam/boost-build trovi correttamente la libreria ICU e costruisca boost-locale. – Artyom

1

È possibile mantenere tutte le stringhe UTF-8 codificate e convertirle in UTF-16 prima di interagire con l'API WIn32. Date un'occhiata a UTF8-CPP libreria per qualche facile da usare funzioni di conversione

1

Se la scrittura di codice portabile:

1 ° Non utilizzare mai wchar_t è né portatile e la sua codifica non è ben definito tra le piattaforme (UTF-16 finestre/utf-32 tutti gli altri).

Non utilizzare mai TChar, utilizzare codice std::string codificato come UTF-8.

Quando si ha a che fare con l'API Win32 danneggiata del cervello, basta convertire la stringa UTF-8 in UTF-16 prima di chiamarla.

Vedere https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful e su come il progetto Windows adotta UTF-8 come codifica principale.

+1

in Visual Studio, quando eseguo 'std :: string msg =" महसुस ";', non riesco a vederlo. E tutto è sostituito dal punto interrogativo. Qualche idea? –

+2

Il post SO a cui si fa riferimento in questa risposta ora è un collegamento morto. Sembra che fosse un post importante ... – Dan

+0

Non c'è niente di cerebrale danneggiato su Windows usando UTF-16. Windows ha iniziato il supporto Unicode con Windows NT (rilasciato nel 1993). UTF-8 è stato inventato solo come concetto nel settembre 1992 https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt, quindi non c'era modo in cui Windows potesse adottarlo. In effetti, Windows era uno dei primi ad adottare la tecnologia Unicode in modo molto progressivo - si scopre forse troppo presto. –

Problemi correlati