Dosya ve dizinleri içeren bir taşınabilir kitaplık yazıyorum. Girişim (dizin yolları) ve çıktı (dosya yolları) için UTF-8 kullanmak istiyorum. Sorun şu ki, Windows bana UTF-16-kullanılan-UCS-2 ve kod sayfaları arasında bir seçim sunuyor. Bu yüzden tüm UTF-8 dizelerini UTF-16'ya dönüştürmem, WinAPI'ye geçirmem ve sonuçları UTF-8'e çevirmem gerekiyor. C++ 11 sadece bunun için <locale>
kitaplığı sağladı, anladığım kadarıyla, önceden tanımlanmış uzmanlıklardan hiçbiri UTF-8'i dahili (yani, benim-yanım) kodlama olarak kullanmıyor - en yakın olan UTF-16-to- olan UTF-8, istediğimin tam tersi. İşte ilk soru:C++ 11 yerel dizeleri UTF-8 dizelerinin iç gösterimi olarak kullanmak için nasıl kullanılır?
1) WinAPI çağrıları için UTF-8 dizelerimi UTF-16'ya dönüştürmek için codecvt thingamajigs nasıl kullanılır ve UTF-16 sonuçları UTF-8'e geri döndü?
Başka bir sorun: Linux'u da hedefliyorum. Linux'ta birçok farklı yer için çok iyi bir destek var - ve ben farklı olmak istemiyorum. Umarım herkes Linux makinelerinde UTF-8 kullanacaktır, ancak bunun kesin garantisi yoktur. Bu yüzden, Windows'a özgü yukarıdaki davranışı genişletmek ve her zaman UTF-8-to-system-locale-kodlamasını yapmak iyi bir fikir olacağını düşündüm. Görmüyorum hariç, mevcut sistem kodlamasını almak için C++ 11'in <locale>
kitaplığında herhangi bir yol var! Varsayılan std :: locale yapıcısı, tek tek yerel ayarı yapar ve bunu yapmazsam, klasik "C" yerel değerini döndürür. Ve farkında olduğum başka bir alıcı yok. Yani ikinci soru:
2) Geçerli sistem yerel ayarı nasıl algılanır? <locale>
'da bir şey var mı? Belki bazı standart C kütüphane işlevi veya (bu durumda daha az taşınabilir ancak tamam) POSIX API'sinde bir şey var mı?
Bu soruyu geri almamdan önce düzenleyen kişiye: ikinci paragraf ** NOT ** ilk sorunun bir parçasıdır !!! – Xirdus
olası bir kopyası [String, u16string & u32string arasında dönüştürme] (http://stackoverflow.com/questions/7232710/convert-between-string-u16string-u32string) – tclamb
@tclamb Tam olarak bir kopya değil, ancak bu soruya cevaplar bana yardımcı ol. Bağlantı için teşekkürler. Ama soru 2) hala duruyor. – Xirdus