SORU
11 AĞUSTOS 2014, PAZARTESİ


Unicode C 11

Yaptigimdan biraz okuma konudan Unicode -- özellikle, UTF-8 -- (olmayan) destek C 11, ve ben umuyordum uzmanları Yığın Taşması olabilir güven bana benim anlayış doğru veya işaret nerede olduğum yanlış veya gözden kaçan bir şey varsa o durumda.

Kısa bir özet

İlk olarak, iyi: UTF-8, UTF-16 ve USC-4 kaynak kod harfleri. tanımlayabilirsiniz Ayrıca, <locale> başlık içerir birkaç std::codecvt uygulamaları hangi dönüştürebilirsiniz arasında herhangi bir UTF-8, UTF-16, USC-4 ve platform kısaltması kodlama (olsa da API gibi, koyun hafif, az daha basit). codecvt Bu uygulamaları imbue()'seni okumak gibi bir dönüşüm yapmak için izin veya bir dosya yazmak için akışları (veya başka bir stream) d olabilir.

[DÜZENLEME:Cubbi std::codecvt yerel bağlı olmayan uygulamaları sağlar <codecvt> Başlığı, bundan bahsetmedim ama bu yorum puan. Ayrıca, std::wstring_convert wbuffer_convert fonksiyonlar codecvtBu dizeleri ve tamponlar doğrudan, dere dayanarak değil dönüştürmek için kullanabilirsiniz.]

C 11 de içerir C99/C11 <uchar.h> başlık içeren fonksiyonları dönüştürmek bireysel karakter platform kısaltması kodlama (hangi olabilir veya olmayabilir UTF-8) ve USC-2 ve USC-4.

Ancak, o da bunun bir parçasıydı. Elbette UTF-8 saklayabilirsiniz ** 10, orada metin ile gerçekten yararlı bir şey yapmak için hiçbir yolu vardır. Örneğin, diğerinden daha belirleyici bir edebi kodunuzu, yapamazsın doğrulamak bir dizi bayt olarak içeren geçerli bir UTF-8, yapamazsın bulmak uzunluğu (yani sayının Unicode karakterleri için bazı tanımının "karakter") UTF-8-içeren std::string ve üzerinde yineleme std::string herhangi bir şekilde başka bayt bayt.

Benzer şekilde, hatta C 11 ek std::u16string değil gerçekten destek UTF-16, ama sadece eski USC-2 ... destek için yedek çifti, bırakarak sadece BMP.

Gözlemler

Verilen bu UTF-8 Unıx türevi her çok iyi bir Unicode işleme sistemi standart yolu (dahil olmak üzereMac OS X ve* Linux) ve büyük ölçüde web üzerinde de-facto standart haline gelmiştir, modern C desteği olmaması çok ciddi bir eksiklik gibi görünüyor. Hatta Windows üzerinde, std::u16string yeni gerçekten UTF-16 desteği yok aslında biraz üzücü gibi görünüyor.

* Gibi yorumlar dikkat çekti ve Kakao UTF-16 kullanır iken açık here, Mac OS kullanmak BSD türetilmiş parçalar UTF-8 yaptı.

Soru

Eğer hepsini okumak için başardınız, teşekkürler! Bu Taşma sonra tüm Yığını gibi hızlı soru, sadece bir kaç...

  • Yukarıdaki analiz doğru mu, ya da başka bir Unicode-destek kaçırıyorum imkanı var mı?

  • Standartları Komitesi son birkaç yıl içinde harika bir iş ileri C hızla hareket yaptı. Bütün akıllı insanlar olduklarını ve yukarıdaki eksikliklerin farkında olduklarını sanıyorum. Unicode desteği C çok zayıf kalır o çok iyi bilinen özel bir nedeni var mı ?

  • İleriye dönük olarak, kimsenin bu durumu düzeltmek için herhangi bir öneri biliyor mu? İsocpp.org hızlı bir arama bir şey söylüyor gibi görünmüyordu.

DÜZENLEME:Teşekkürler cevaplar için herkese. Onları biraz -- statükonun yakın gelecekte değişmeyecek gibi görünüyor cesaret kırıcı bulduğumu itiraf etmeliyim. Arasında bir görüş birliği yoksanatçıtam Unicode desteği sadece çok zor olduğunu ve herhangi bir çözüm YOĞUN bakımdan en faydalı olarak kabul edilmesi için yeniden gerçeklemek gerekir gibi görünüyor.

Ben şahsen bu konuda aynı fikirde değilim; değerli orta yol bulunabilir bence. Örneğin, doğrulama ve normalleştirme algoritmaları için UTF-8 ve UTF-16 iyi tarafından belirtilen Unicode Konsorsiyumu, ve olabilir tarafından sağlanan standart kütüphane olarak ücretsiz işlevleri, diyelim ki, bir std::unicode ad. Bu yalnız kütüphaneler Unicode giriş bekliyor arayüzü için ihtiyacı olan C programları için büyük bir yardım olurdu. Ama cevap aşağıda dayanarak (geldi, acı bir ipucu ile söylenmesi gerekir) sınırlı işlevsellik sadece bu tür iyi karşılanmadı için Yavrunun öneri gibi görünüyor.

CEVAP
30 EYLÜL 2014, Salı


Yukarıdaki analiz doğru

Bir bakalım.

geçerli bir UTF-8 olarak içeren bir bayt dizisi doğrulayabilirsiniz

Yanlış. std::codecvt_utf8<char32_t>::length(start, end, max_lenght) dizi içinde geçerli bayt sayısını verir.

uzunluğu öğrenebilirsiniz

Kısmen doğru. Char32_t dönüştürmek ve sonuç uzunluğunu bulmak mümkündür. Yokkolayyol gerçek dönüşüm (ama aşağıya bakınız) yapmadan uzunluğu bulmak için. Karakterleri saymaya gerek (herhangi bir anlamda) oldukça seyrek olarak ortaya çıkar.

bir std üzerinde yineleme yapabilirsiniz.:: herhangi bir şekilde dize bayt bayt dışında

Yanlış. std::codecvt_utf8<char32_t>::length(start, end, 1) size bir ihtimali üzerinde yineleme UTF-8 "karakter" (Unicode kod birimi), ve tabii ki onların sayısını belirler (bu bir "kolay" bir şekilde saymak için karakter, ama bir şekilde).

gerçekten destek UTF-16 yok

Yanlış. Ve örneğin std::codecvt_utf8_utf16<char16_t> ile UTF-16 dönüştürmek mümkündür. UTF-16 dönüşüm sonucu, iyi, UTF-16. BMP ile sınırlı değildir.

Demo that illustrates these points.

Eğer "değil" lütfen bu adresi vereceğim. başka bir cevapsız varsa

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bcbauer

    bcbauer

    7 ŞUBAT 2007
  • MattSteffanina 2

    MattSteffani

    28 Kasım 2007
  • Techmoan

    Techmoan

    31 Mayıs 2009