2011-10-03 23 views
12

C++ 11, yeni bir dizi hazır bilgi öneklerini (hatta kullanıcı tanımlı soneklere izin verir) sunar. Bunun üzerine, kodlama hakkında endişelenmenize gerek kalmadan belirli bir sembolü kodlamak için Unicode çıkış sekanslarını doğrudan kullanabilirsiniz.Unicode dize değişmezleri

const char16_t* s16 = u"\u00DA"; 
const char32_t* s32 = U"\u00DA"; 

Ama bunun da wchar_t dize hazır unicode kaçış dizilerini kullanabilirsiniz? Bu mümkün değilse bir kusur gibi görünüyor.

const wchar_t* sw = L"\u00DA"; 

elbette belli bir platformda ne wchar_t bağlıdır, ancak diğer tüm etkileri olacağını sw[0] tamsayı değeri, bu taşınabilir olmalı, değil mi?

+0

I sw 'değeri [0]' wchar_t' sadece ölçüde belirli bir platform üzerinde ne 'bağlıdır inanıyoruz wchar_t'nin boyutu nedir? Yani '\ u00DA', her zaman bu tip bir platformun normal kodlaması olmasa bile, U + 00DA’nın bazı Unicode kodlamasıyla (UTF-8, UTF-16, UTF-32) sonuçlanmalıdır. – bames53

+1

Aslında yukarıdaki yanlıştır. Uygulama, evrensel karakter isimlerini gerçek karakter olarak ele almalıdır. Yani, eğer uygulama karakterleri bir dizgi içinde bir karakter dizisi içinde yürütme karakter kümesine çevirirse, bunu UCN'lerle de yapmalıdır. UCN'nin bir unicode literal (örn., U8 "\ u00DA") içinde olması durumunda, UTF kodlamasını yalnızca garantilendirirsiniz. – bames53

cevap

8

Çalışır, ancak istenen semantiğe sahip olmayabilir. \u00DA, wchar_t boyutuna bağlı olarak UTF8/16/32 kodlaması için gereken sayıda hedef karaktere genişleyecektir, ancak geniş dizelerin belgelenmiş, garantili bir kodlama semantiği olmadığı unutulmamalıdır - yalnızca "sistemin kodlama ", ne olduğunu söylemek için yapılan bir girişimde bulunmadan veya kullanıcının numaralı telefon numarasını bilmesi, bunun ne olduğunu bilir.

Bu nedenle karıştırıp eşleştirmemek en iyisidir. iki ya bir, ancak her ikisini kullanarak:

  1. sistemine özgü: char*/"", wchar_t*/L"", \x değişmezler, mbstowcs/wcstombs

  2. Unicode: char*/u8"", char16_t*/u"", char32_t*/U"", \u/\U literals.

(burada konu hakkında madenin somerelatedquestions bulunmaktadır.)

+0

Bu sorunun arka planı ile ilgili tüm ayrıntılar için, [this libC++ test] (http://llvm.org/svn/llvm-project/libcxx/trunk/test/localization/locale.categories/category.ctype/locale .ctype.byname/is_1.pass.cpp), Windows'ta '\ x00DA' satırında başarısız oluyor. Bunu '\ u00DA ile değiştirip değiştiremeyeceğimi ve' wchar_t 'nin yeterince büyük (örneğin 16 veya 32 bit) için çalışmasını isteyebilir miyim? – rubenvb

İlgili konular