SORU
22 Temmuz 2011, Cuma


Unicode C 11 string kullanmak için kodlama

** 37, ben şu yeni karakter ve dizi hakkında bir şey sormak istiyorum C 11 edebi tür. Şimdi karakter dört sıralar dizelerini beş çeşit var gibi görünüyor. Karakter türleri:

char     a =  '\x30';         // character, no semantics
wchar_t  b = L'\xFFEF';       // wide character, no semantics
char16_t c = u'\u00F6';       // 16-bit, assumed UTF16?
char32_t d = U'\U0010FFFF';   // 32-bit, assumed UCS-4

Ve dize hazır bilgi için:

char     A[] =  "Hello\x0A";         // byte string, "narrow encoding"
wchar_t  B[] = L"Hell\xF6\x0A";      // wide string, impl-def'd encoding
char16_t C[] = u"Hell\u00F6";        // (1)
char32_t D[] = U"Hell\U000000F6\U0010FFFF"; // (2)
auto     E[] = u8"\u00F6\U0010FFFF"; // (3)

Soru şu: \x/\u/\U karakter başvuruları tüm dize türleri ile serbestçe birleştirilebilir. Tüm dize türleri sabit genişlikte, yani diziden tam olarak birçok unsur olarak görünür değişmez ya \x/\u/\U başvuruları almak, genişletilmiş bir değişken sayıda bayt? u"" u8"" dizeleri kodlama mantığı vardır, örneğin ben char16_t x[] = u"\U0010FFFF" ve non-BMP codepoint iki birim UTF16 kodlanmış bir dizi içine alır diyorsun? Ve aynı şekilde u8 için? (1), \u ile yalnız Suretler yazabilirim? Son olarak, dize işlevleri farkında (yani karakter farkındalar ve geçersiz bayt dizileri algılayabilir) kodlama var mı?

Bu ucu açık bir soru oldu, ama UTF-kodlama yeni ve yeni C 11 tür tesislerin mümkün olduğu kadar tam bir resim elde etmek istiyorum.

CEVAP
23 Temmuz 2011, CUMARTESİ


X/\u/\U karakter başvuruları serbestçe birleştirilebilir, tüm dize türleri ile\?

Hayır. \x bir şey kullanılabilir, ama \u \U sadece özel olarak UTF-kodlanmış dizeleri kullanılabilir. Ancak, UTF-kodlanmış herhangi bir dize için, \u \U uygun gördüğünüz olarak kullanılabilir.

Tüm dize türleri sabit genişlikte, yani diziden tam olarak birçok unsur olarak görünür değişmez, ya da \x/\u/\U göndermeler genişletilmiş bir değişken sayıda bayt?

O anlamda söylemiyorum. \x, \u \U dize kodlama göre dönüştürülür. Bu sayısı "birim kodu" (kullanarak Unicode şart. char16_t UTF-16 kod birimi) değerleri içeren bir dize kodlama bağlıdır. u8"\u1024" sabit bir dize 2 chars plus null bir sonlandırıcı içeren yaratacak. u"\u1024" sabit bir dize 1 char16_t artı boş bir sonlandırıcı içeren yaratacak.

Kod kullanılan birim sayısı Unicode kodlama dayanmaktadır.

U"" u8"" dizeleri kodlama anlambilim, örneğin diyebilirim char16_t x[] = u"\U0010FFFF", ve non-BMP codepoint alır kodlanmış içine bir iki ünite UTF16 sırası mı?

u"" UTF-16 kodlanmış bir dize oluşturur. u8"" UTF-8 kodlanmış bir dize oluşturur. Unicode belirtimi başına kodlanmış olacak.

(1), \u ile yalnız Suretler yazabilirim?

Kesinlikle değil. Belirtimi açıkça UTF-16 temsilci çiftleri (0xD800-0xDFFF) kullanarak \u \U codepoints olarak yasaklıyor.

Son olarak, dize işlevleri farkında (yani karakter farkındalar ve geçersiz bayt dizileri algılayabilir) kodlama var mı?

Kesinlikle değil. Peki, düzeltmeme izin ver.

std::basic_string Unicode kodlama ile uğraşmaz. KesinliklemağazaUTF-kodlanmış dizeleri. Ama sadece onlar düşünmek onlar gibi dizileri char, char16_t char32_t; düşünemiyorum onları bir dizi Unicode codepoints bu kodlanmış ile belirli bir mekanizma. basic_string::length() kod birim sayısı, kod noktaları dönecektir. Ve tabii ki, standart string kütüphane fonksiyonları C tamamen işe yaramaz

"Uzunluk" bir Unicode dize için codepoints sayısı değil, ancak dikkat edilmeli Bazı kod noktaları birleştirme "" ile bir araya gelen, (talihsiz bir isim), önceki codepoint. karakterler Birden fazla codepoints tek görsel karakterine göster.

İostreams aslında Unicode ile kodlanmış/yazma değerlerini okuyabilir. Bunu yapmak için, kodlama belirtin ve düzgün çeşitli yerlerde içine aşılamak için bir yerel ayarı kullanmak zorunda olacak. Bu daha kolay yapılır daha söyledi, ve bana nasıl göstermek için herhangi bir kod yok.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chip Johnson

    Chip Johnson

    30 AĞUSTOS 2007
  • Gigawipf

    Gigawipf

    18 ŞUBAT 2010
  • xiaoyu85

    xiaoyu85

    20 ŞUBAT 2010