SORU
19 HAZİRAN 2012, Salı


's "yanlış" C wchar_t ve wstrings? Geniş karakterler için bazı alternatifler nelerdir?

C toplum içinde bir sürü insan gördüm(özellikle ##freenode üzerinde c) wstrings wchar_t, kullanımı ve windows kendi apı kızıyor. Tam olarak" wchar_t wstring, ve eğer uluslararası desteği istersem, geniş karakterler için bazı alternatifler nelerdir? "yanlış nedir

CEVAP
19 HAZİRAN 2012, Salı


Wchar_t nedir?

wchar_t herhangi bir yerel karakter kodlamasını her wchar_t tam bir codepoint gösterir wchar_t gösterimi için dönüştürülebilir böyle tanımlanır:

Yazın wchar_t büyük genişletilmiş karakter kümesi desteklenen yerel ayarları (22.3.1) arasında belirtilen tüm üyeler için ayrı kodlar temsil edebilecek farklı bir türüdür.

— [Temel.C temel] 3.9.1/5

Budeğilbu wchar_t tüm yerel ayarlar herhangi bir karakter aynı anda temsil etmek için yeterince büyük olması gerekir. Bu, kodlama wchar_t için kullanılan yerel ayarları arasında farklılık gösterebilir. Mutlaka bir dize bir yerel ayarı kullanarak wchar_t ve sonra başka bir yerel ayar kullanarak char dönüştürmek olamaz anlamına gelir.1

Uygulamada tüm yerel ayarlar arasında ortak bir temsil wchar_t için birincil kullanımı gibi görünüyor wchar_t kullanarak bu yana değil, eğer ne işe yaradığını merak edebilirsiniz.

Orijinal niyet ve amaç wchar_t oldu yapmak metin işleme basit tanımlayarak bunu böyle gerektirir bir bire-bir eşleme bir dize kod birimleri için metnin karakter, böylece sağlayan kullanımı basit bir algoritma olarak kullanılan ascıı dizeleri ile diğer diller.

Ne yazık ki wchar_t var belgesiyle bire bir eşleme karakterleri ve codepoints arasında bunu başarmak için varsayalım. Unicode bu varsayım keser2çok güvenli bir şekilde basit için wchar_t kullanamazsın metin ya. algoritmalar

Bu taşınabilir bir yazılım kullanamazsınız ya da yerel ayarlar arasında metin için ortak bir temsili olarak, ya da basit metin algoritmaları kullanımını etkinleştirmek için wchar_t anlamına gelir.

Kullanım wchar_t bugün nedir?

Çok değil, taşınabilir kod zaten. __STDC_ISO_10646__ sonra tanımlanmışsa wchar_t değerleri doğrudan tüm bölgelerde, aynı değerlerle Unicode codepoints temsil eder. Bu güvenli inter-yerel ayar dönüşümleri daha önce de belirttiğimiz yapmak için yapar. Ancak hiç güven olmuyor sadece bu karar için kullanabileceğiniz wchar_t çünkü bu şekilde, en çok unıx işletim sistemleri tanımlamak, Windows olsa bile Windows kullanan aynı wchar_t yerel tüm yerel ayarlar.

Sebebi Windows değil tanımlamak __STDC_ISO_10646__ çünkü Windows kullanan UTF-16 olarak wchar_t kodlama, çünkü UTF-16 kullanır çiftlerini temsil codepoints büyük U FFFF, UTF-16 değil gereksinimlerini karşılamak için __STDC_ISO_10646__.

Platform için belirli bir kod wchar_t daha faydalı olabilir. Bu aslında gerekli Windows (örneğin, bazı dosyaları sadece siksen açmam kullanmadan wchar_t dosya adları) ama Windows tek platform burası mı doğru bildiğim kadarıyla (belki de olabilir wchar_t 'Windows_char_t').

Gez wchar_t açıkça, ya da yerel olarak depolama metin işleme bağımsız metni basitleştirmek için yararlı değildir. Taşınabilir kod bu amaç için kullanmaya çalışmamalısınız. Taşınabilir kod sadece bazı API gerektirir, çünkü bu yararlı olabilir.

Alternatifleri

Benim gibi alternatif UTF-8 doğru UTF-8 C dizeleri, platformlarda bile kodlanmış olarak değil dostu kullanmaktır.

Bu şekilde bir yazma taşınabilir kod kullanarak bir ortak metin gösterimi platformlarda kullanın standart veri türleri için hedeflenen amaç, elde dil desteği için o türleri (örneğin, dize hazır, ancak bazı hileler gerekli çözüm sağlamak için bazı Derleyiciler), bazı standart kütüphane desteği, hata ayıklayıcı desteği (Daha fazla hileler gerekli olabilir), vb. Geniş karakterler genellikle zor ya da bunları elde etmemiz imkansız, ve farklı platformlarda farklı parçaları alabilirsiniz.

UTF-8 sağlamaz bir şey ASCII ile mümkün gibi basit metin algoritmaları kullanmak için yeteneğidir. Bu UTF-8 başka bir Unicode kodlama daha kötü. Aslında olabilir kabul etmek için de iyi olur çünkü çoklu kod birimi gösterimi UTF-8 daha yaygın ve çok hata işleme kodu gibi değişken genişlik temsilleri karakterler daha fazla fark ve sabit daha denerseniz ayrılmamak için UTF-32 ile NFC veya NFKC.

Birçok platform kullanımı UTF-8 olarak yerel char kodlama ve birçok program gerektirmez herhangi bir önemli metin işleme, ve bunu yazılı bir uluslararası program bu platformları biraz farklı kod yazma olmadan dikkate alınarak uluslararası. Daha yaygın olarak taşınabilir kod yazma, ya da diğer platformlarda yazılı diğer kodlamalar kullanan API sınırlarında ekleme dönüşüm gerektirir.

Başka bir alternatif kullanılan bazı yazılım seçimi için çapraz platform gösterimi gibi imzasız kısa diziler tutarken, UTF-16 veri ve tedarik tüm kütüphane desteği ve basit bir yaşam ile maliyeti dil desteği, vb.

C 11 görevlisi dil/kütüphane özellikleri ile wchar_t, char16_t ve char32_t alternatif olarak geniş karakter yeni bir tür ekler. Bu aslında UTF-16 olması garanti değil ve UTF-32, fakat herhangi bir önemli uygulama başka bir şey kullanacağını sanmıyorum. C 11 de artırır UTF-8 desteği, örneğin ile UTF-8 dize hazır bilgi bu yüzden buna gerek yok hilesi VC üretim yapan UTF-8 kodlanmış dizeleri (her ne kadar devam edebilirsem bunu yapmak yerine kullanın u8 önek).

Alternatifleri önlemek için

TCHAR: TCHAR wchar_t ve en iyi program biraz önceki binyılda yazıldığı sürece unutulur char eski kodlamalar varsayalım eski Windows programlarını geçirmek için. Taşınabilir değil ve kendi kodlama ve hatta veri türü doğası gereği belirsiz olmayan TCHAR tabanlı API ile kullanılamaz hale getiriyor. Amacı iyi bir fikir değil yukarıda gördüğümüz wchar_t, geçiş olduğu için, değeri ne olursa olsun TCHAR kullanarak yok.


1. Wchar_t dizeleri olarak temsil edilebilir, ancak herhangi bir yerel olarak desteklenmeyen karakterler tek wchar_t bir değer ile temsil edilmesi gerekli değildir. Bu wchar_t bazı karakterler, wchar_t niyeti başka açık bir ihlali için değişken genişlik bir kodlama kullanmak anlamına gelir. Ancak bu tartışılabilir bir karakter olması gösterilebilir tarafından wchar_t yeter ki bu yerel 'destekler' bu karakter, bu durumda değişken genişlikli kodlamaları değil yasal ve Pencere kullanımı UTF-16 olmayan uyumlu.

2. Unicode ve birçok karakter kodlamaları değişken genişlik olarak basit metin algoritmaları için aynı sorunları yaratan birden fazla kod noktaları ile temsil edilmesini sağlar. Eğer tam anlamıyla oluşan bir normalleşme tutuyorsa bile, yine de bazı karakterler birden fazla kod noktaları gerektirir. Bakın: http://www.unicode.org/standard/where/

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Anthony

    Eric Anthony

    13 AĞUSTOS 2011
  • Joshua Kywn

    Joshua Kywn

    17 Mayıs 2010
  • William Sledd

    William Sled

    24 EYLÜL 2006