2012-12-15 23 views
6

Şu anda varolan bir kitaplığın etrafındaki sarıcı olan bir eklenti yazıyorum. Eklentinin ana bilgisayarı, aşağıdaki gibi tanımlanmış bir utf-16 biçimlendirilmiş dizgeyi izler:Nasıl utf16 ushort dizisini utf8 std :: string dosyasına dönüştürebilirim?

typedef unsigned short PA_Unichar;

Ve sarılmış kütüphane beni atma, ben bu işe yaramazsa açıkçası

std::string toUtf8(const PA_Unichar* data) 
{ 
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> convert; 
return std::string(convert.to_bytes(static_cast<const char16_t*>(data)); 
} 

Fakat böyle bir dönüşüm fonksiyonu yazma çalıştı ancak const char * veya bir std :: string utf-8 biçimlendirilmiş dize kabul "const işaretçisinden" (aka 'const unsigned short *') 'const char16_t *' öğesine bir derleme hatası "derlenmiyor"

Bunu yapmanın en zarif/doğru yolu nedir?

Önceden teşekkür ederiz. Eğer teşebbüs olarak

+0

Platformunuzda std :: is_same :: value 'değeri nedir? Ayrıca hangi derleyici? – moshbear

+0

'std :: is_same :: value' 0 (false) değerine sahip ve Apple LLVM derleyicisi 4.1 ile Mac'te derledim, ancak Visual Studio 2012 ile derlemeyi de yaptım – Robotex

+1

: //www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2018.html, 'char16_t' uint16_least_t' değil, uint16_t' değil. Platformunuzda, 'uint16_least_t' * imzasız kısalara takma * gibi görünüyor, dolayısıyla sizeof (char16_t)! = Sizeof (imzasız kısa). 'dipnot's eşleşmediğinde 'static_cast' işaretçi türlerinde başarısız olur. – moshbear

cevap

2

Ardından std::codecvt_utf8_utf16 faset kullanın basic_string(Iterator, Iterator) yapıcısı kullanılarak char16_t bir dizeye PA_unichar dize dönüştürmek olabilir:

std::string conv(const PA_unichar* str, size_t len) 
{ 
    std::u16string s(str, str+len); 
    std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> convert; 
    return convert.to_bytes(s); 
} 

Doğruyu düşünüyorum . Maalesef, uygulamam henüz desteklemediğinden, bunu test edemiyorum. GCC 4.9'a dahil etmeyi planladığım wstring_convert numaralı bir uygulamam var ancak bunu test etmek için codecvt_utf8_utf16 numaralı bir uygulamam yok.

+0

Çok teşekkür ederim, iyi çalışıyor gibi görünüyor ve bu da beni korkunç bazı türlerden kurtardı :) – Robotex

+0

Harika, kafamdaki derleyicinin doğru kontrol türünü aldığına sevindim! İlgilendiğiniz, hangi derleyicileri kullanıyorsunuz bu sınıfları destekliyorsunuz? –

+0

Mac tabanlı sistemlerdeki LLVM 4.1 derleyicisiyle ('-std = C++ 11' işaretini ayarladıktan sonra) ve Visual Studio 2012, Windows sistemlerinde – Robotex

İlgili konular