2011-12-16 19 views
3

私はUCS-4打ち鳴らす:wstringのへのconst char16_tの*(UTF-16)に変換する(UCS-4)

にUTF-16でエンコードされた文字列を変換しようとしている私が正しく理解していれば、C++ 11が提供しますcodecvt_utf16を介してこの変換。

#include <iostream> 
#include <locale> 
#include <memory> 
#include <codecvt> 
#include <string> 

using namespace std; 

int main() 
{ 
    u16string s; 

    s.push_back('h'); 
    s.push_back('e'); 
    s.push_back('l'); 
    s.push_back('l'); 
    s.push_back('o'); 

    wstring_convert<codecvt_utf16<wchar_t>, wchar_t> conv; 
    wstring ws = conv.from_bytes(reinterpret_cast<const char*> (s.c_str())); 

    wcout << ws << endl; 

    return 0; 
} 

注:明示的なpush_backsが打ち鳴らす(Xcodeの4.2)の私のバージョンは、Unicode文字列リテラルを持っていないという事実を回避する

私のコードは次のようなものです。

コードを実行すると、終了例外が発生します。私はここで違法な行為をしていますか? wstring_convertに渡されたconst char *はUTF-16でエンコードされているため、動作するはずです。私はエンディアンが問題であるとも考えましたが、私はそうではないことを確認しました。

+0

原則として、いくつかの便利な機能がどこか ''にあるべきですが、私は[問題があった](http://stackoverflow.com/questions/7562609/what-does-cuchar-provide-and-where - それは文書化されている)それらの仕事の仕方を見つけ出す。 –

+0

@Kerrek SB ''はロケールに依存しますが、質問はUnicodeからUnicodeへの変換であり、関連するロケールはありません。 – Cubbi

+0

@Cubbi:Hm、かなり確かに ''はロケールとは関係ありませんが、私は間違っているかもしれません... –

答えて

9

2つのエラー:単一const char*を取る

1)from_bytes()過負荷がnull終端バイト文字列を期待していますが、あなたは非常に2番目のバイトは「\ 0」です。あなたはUCS-4にUTF-16LEから変換する必要があるので、

2)お使いのシステムは、おそらくリトルエンディアンです:Windowsと打ち鳴らす++/libcの++にVisual Studio 2010 SP1でテスト

#include <iostream> 
#include <locale> 
#include <memory> 
#include <codecvt> 
#include <string> 

using namespace std; 

int main() 
{ 
    u16string s; 

    s.push_back('h'); 
    s.push_back('e'); 
    s.push_back('l'); 
    s.push_back('l'); 
    s.push_back('o'); 

    wstring_convert<codecvt_utf16<wchar_t, 0x10ffff, little_endian>, 
        wchar_t> conv; 
    wstring ws = conv.from_bytes(
        reinterpret_cast<const char*> (&s[0]), 
        reinterpret_cast<const char*> (&s[0] + s.size())); 

    wcout << ws << endl; 

    return 0; 
} 

- SVNのをLinux。

+1

PS、これはもちろん、UCS4を保証するためにchar32_tを使うべきです。 wchar_tバージョンは、wchar_tが16ビットのUTF-16を生成します。 – Cubbi

+0

これは非常に素晴らしい答えです。私は本当にこのことをすべて知ってお礼を言います!もし私ができるなら、私は答えをさらに3倍upvoteしたいと思います。許可されている場合は、さらに質問をしてもらえますか: 1. 0x10ffffに設定したMaxCodeの概念を教えていただけますか?実際には必要であることに気がついたからです。 2. const char *の終端文字である '\ 0'についての良い点。 char16_tの対応するターミネータは何ですか? もう一度ありがとうございます。 – ryaner

+0

+1いい探偵の仕事Cubbi。 –

関連する問題