C ++ 'da Unicode İşleme


Yanıtlar:


81
  • Verilerinizle (veya benzer bir kitaplıkla) ilgilenmek için YBÜ kullanın
  • Kendi veri deponuzda her şeyin aynı kodlamayla depolandığından emin olun
  • Dize uzunluğu, büyük harf durumu vb. Gibi sıradan görevler için her zaman unicode kitaplığınızı kullandığınızdan emin olun is_alpha. İstediğiniz tanım bu olmadığı sürece asla standart kitaplık yerleşikleri kullanmayın .
  • Yeterince söyleyemem: asla a'nın indislerini yinelemeyin, stringeğer doğruluğa önem veriyorsanız, bunun için daima unicode kitaplığınızı kullanın.

stringİkili veri olarak ele almadığınız sürece .
Demi

10

Önceki C ++ standartlarıyla geriye dönük uyumluluk umurunuzda değilse, mevcut C ++ 11 standardı yerleşik Unicode desteğine sahiptir: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011 /n3242.pdf

Bu nedenle, C ++ 'da Unicode işleme için gerçekten en iyi uygulama, bunun için yerleşik tesisleri kullanmak olacaktır. Standart şu anda çok yeni olsa da, eski kod tabanlarında bu her zaman bir olasılık değildir.

DÜZENLEME: Açıklığa kavuşturmak gerekirse, C ++ 11 artık Unicode değişmezlerini ve Unicode dizelerini desteklediğinden Unicode'un farkındadır. Ancak, standart kitaplık Unicode işleme ve dönüştürme için yalnızca sınırlı desteğe sahiptir . Mevcut ihtiyaçlarınız için bu yeterli olabilir. Bununla birlikte, şu anda çok miktarda ağır kaldırma yapmanız gerekiyorsa, daha derinlemesine işlemler için YBÜ gibi bir şey kullanmanız gerekebilir . Şu anda çalışmalarda , farklı kodlamalar arasında metin dönüşümü için daha sağlam destek içerecek bazı öneriler var . Benim tahminim (ve umudum) bunun bir sonraki teknik raporun parçası olacağı yönünde .


Taslak bir standart belgeye olan bu bağlantı, tartışmakta olduğunuz "yerleşik Unicode desteğini" açıklayan belirli bir bölüme atıfta bulunmadan çok yararlı olmaz.
Ben Collins

1
@BenCollins Bölüm 2.14.5 "Dize değişmezleri" - UTF-8, UTF-16 ve UTF-32 kodlamaları için dize değişmezleri dahil dize değişmezlerini tartışır. Bölüm 22.4.1.4 "Sınıf şablonu codecvt" - karakter kodlamaları arasında dönüştürme yapmak için kullanılan codecvt sınıfını (UTF-8, UTF-16 ve UTF-32 dahil) tartışır. Belgede Unicode desteği hakkında daha fazla bilgi var, ancak bunlar konuyla ilgili en kritik bölümler gibi görünüyor.
eestrada


5

İşte Windows programlama için bir kontrol listesi:

  • _T içindeki tüm dizeler ("dizem")
  • strlen () vb. işlevler _tcslen () vb. ile değiştirilir.
  • Char * ve const char * yerine LPTSTR ve LPCTSTR kullanın
  • Dev Studio'da yeni projeler başlatırken, proje özelliklerinizde Unicode seçeneğinin seçili olduğundan emin olun.
  • C ++ dizeleri için std :: string yerine std :: wstring kullanın

11
Hem Unicode hem de ANSI derlemeleri yapmayı düşünmüyorsanız, "T" dizelerini, karakterleri ve işlevleri kullanmayın. Yalnızca Unicode derlemeleri yapmayı planlıyorsanız, normal geniş karakterli şeyler yapın: L "benim geniş dizem" wcslen (L "benim dizem") vb
1800 BİLGİ

Kabul edin, genel metin istiyorsanız, yani hem Unicode hem de Ascii / MBCS için kodlama yeteneği istiyorsanız, yalnızca _T makrolarını kullanın.

1
Hem Unicode hem de ANSI for C ++ dizeleri yapmak isterseniz typedef std :: basic_string <TCHAR> tString;
Serge

Ah evet, her zaman #ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif yaparım ama senin tarzını daha çok seviyorum Serge.
Adam Pierce

4
Dürüst olmak gerekirse, UTF16'nın bir israf olduğunu düşünüyorum, tüm kodlamaları UTF8'de bırakmak daha basit ve * nix ile çok daha uyumlu.
chacham15

3

C ++ ' da Büyük / Küçük Harfe Duyarsız dize karşılaştırmasına bakın

Bu sorunun Unicode'daki Microsoft belgelerine bir bağlantısı vardır: http://msdn.microsoft.com/en-us/library/cc194799.aspx

Bu makalenin yanında MSDN'de sol taraftaki gezinme tarafına bakarsanız, Unicode işlevleriyle ilgili birçok bilgi bulmanız gerekir. "Kodlama Karakterleri" hakkındaki bir bölümün parçasıdır ( http://msdn.microsoft.com/en-us/library/cc194786.aspx )

Aşağıdaki alt bölümlere sahiptir:

  • Kod Sayfası Modeli
  • Windows'ta Çift Baytlı Karakter Setleri
  • Unicode
  • Karma Ortamlarda Uyumluluk Sorunları
  • Unicode Veri Dönüşümü
  • Windows Tabanlı Programları Unicode'a Geçirme
  • Özet

2

Bu herkes için en iyi uygulama olmasa da, isterseniz kendi C ++ UNICODE rutinlerinizi yazabilirsiniz!

Bunu bir hafta sonunda bitirdim. Çok şey öğrendim, ancak% 100 hatasız olduğunu garanti etmiyorum, çok fazla test yaptım ve doğru çalışıyor gibi görünüyor.

Kodum Yeni BSD lisansı altında ve burada bulunabilir:

http://code.google.com/p/netwidecc/downloads/list

WSUCONV olarak adlandırılır ve UTF-8, UTF-16 ve Standard ASCII arasında dönüşüm sağlayan örnek bir main () programıyla birlikte gelir. Ana kodu atarsanız, UNICODE okumak / yazmak için güzel bir kitaplığınız olur.


1

Yukarıda söylendiği gibi, bir kütüphane, büyük bir sistemi kullanırken en iyi seçenektir. Bununla birlikte, bazı zamanlarda işleri kendi başınıza halletmek istersiniz (belki kitaplığın bir mikro denetleyicide olduğu gibi birçok kaynağı kullanması nedeniyle). Bu durumda, gerçekten ihtiyacınız olan şeyler için parçaları kopyalayabileceğiniz basit bir kitaplık istersiniz.

Willow Schlanger'ın örnek kodu iyi bir kod gibi görünüyor (daha fazla ayrıntı için cevabına bakın).

Ayrıca daha küçük koda sahip, ancak tam hata kontrolünden yoksun ve yalnızca UTF-8'i işleyen, ancak parçaları çıkarmak daha kolay olan başka bir tane buldum.

İyi görünen gömülü kitaplıkların listesi burada.

Gömülü kitaplıklar



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.