2010-04-27 13 views
7

Windows'tan farklı platformlarda char * dizeleri kolayca kullanabilir ve bunları UTF-8 olarak kullanabilirsiniz. Sorun, Windows'ta wchar * dizeleri (W) kullanarak iletileri kabul etmeniz ve göndermeniz gerektiğidir. ANSI işlevlerini (A) kullanırsanız, Unicode'u desteklemezsiniz.C/C++ 'da Unicode dizeleri çapraz platform dostu bir şekilde nasıl ele alınır?

Gerçekten taşınabilir bir uygulama yazmak istiyorsanız, Windows üzerinde Unicode olarak derlemeniz gerekir.

Şimdi, kodu temiz tutmak için, kodda çirkinliği en aza indirecek şekilde, dizelerle uğraşmanın önerilen yolunun ne olduğunu görmek istiyorum.

ihtiyacınız olabilecek dizeleri tipi: std::string, std::wstring, std::tstring, char *, wchat_t *, TCHAR*, CString (ATL bir).

karşılaşabileceğiniz sorunlar:

  • cout/cerr/cin ve bunların Unicode wcout,wcerr,wcin
  • tüm değiştirildi geniş dize işlevlerini ve bunların TCHAR makro varyantları - strcmp, wcscmp ve _tcscmp gibi.
  • kodun içindeki sabit dizeler, TCHAR ile _T() makroları ile kodunuzu doldurmanız gerekecektir.

En iyi nasıl bir yaklaşım olarak görüyorsunuz? (örnekler bekleriz)

Şahsen ben bir std::tstring yaklaşımına gidecektim, ancak dönüşümlerin gerekli olduğu yere nasıl yapıldığını görmek isterim.

+1

http://utf8everywhere.org hepsini açıklar. –

cevap

3

Sadece bu kütüphaneyi kontrol etmenizi öneriyorum: http://cppcms.sourceforge.net/boost_locale/docs/
Şimdilik bir destek adayı olabilir ama bunu yapacağına inanıyorum.

+0

Daha yeni belgeler http://cppcms.sourceforge.net/boost_locale/html/tutorial.html – Artyom

+0

adresinde bulunmaktadır. Teşekkürler :) Nasıl gidiyor? Daha bitmedi mi? –

+1

iyi çalışıyor.ICU kütüphanesini doğru bir şekilde bulabilmek ve güçlendirmek için destek oluşturmak için destek-kurulumdaki bazı düzeltmeleri beklemekteyim. – Artyom

1

Tüm dizelerinizi UTF-8 kodlanmış halde tutabilir ve WIn32 API'siyle etkileşim kurmadan önce bunları UTF-16'ya dönüştürebilirsiniz. Taşınabilir bir kod yazma Eğer bazı kolay

1

dönüşüm fonksiyonlarının kullanılabilmesi için UTF8-CPP kütüphanede bir göz atın: (utf-16 pencere

1 portatif nede wchar_t asla kullanmayın ve kodlama iyi platformlar arasında tanımlanmamıştır/utf-32 diğerleri.

TChar'ı asla kullanmayın, UTF-8 olarak kodlanmış düz std::string kullanın.

Beyin Zararlı Win32 API'siyle çalışırken, arama yapmadan önce UTF-8 dizesini UTF-16'ya dönüştürün. Windows projesinin UTF-8'i ana kodlama olarak nasıl benimsediği ile ilgili olarak https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful'a bakın.

+1

, std :: string msg = "महसुस"; 'yi görüntülediğimde, onu görüntüleyemiyorum. Ve her şey soru işareti ile değiştirilir. Herhangi bir fikir? –

+2

Bu yanıtta başvurulan SO gönderi şimdi bir ölü bağlantıdır. Önemli bir yazı gibi görünüyor .... – Dan

+0

UTF-16 kullanarak pencereler hakkında hiçbir şeyden beyin hasar görmez. Windows, Windows NT ile Unicode desteği başladı (1993 yayınlandı). UTF-8, Eylül 1992'de sadece bir kavram olarak icat edildi. Https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt, Windows bunu benimsemenin hiçbir yolu yoktu. Aslında, Windows, Unicode'un çok ilerici bir erken evlatıcısıydı - belki de çok erken çıkıyor. –

İlgili konular