2011-07-28 11 views
3

std::wstringにUTF-8文字列を格納し、std::stringに別のストア文字列(UTF-8)を格納する2つのライブラリを使用しています。
2つのライブラリ間で文字列を渡すために使用できる最も効率的な方法は何ですか?
私は現在Windows上でVisual C++ v9 Expressを使用していますが、ポータブルなソリューションを好むでしょう。std :: wstringとstd :: stringの間のUTF-8エンコード文字列の処理

+5

「UTF-8文字列をstd :: wstringに格納する」と言うと、正確には何を参照していますか?あなたは実際にUTF-16を意味しましたか? std :: wstringはUTF-8オクテットを格納するのには適していません(ただし、std :: stringは)。 –

+0

@Remy LebeauデータベースからUTF-8データを取得し、std :: wstringsにデータを渡すODBCライブラリです。 実際にデータが実際にライブラリに格納される方法はわかりません。 – user754425

+0

ライブラリが内部的にどのようにデータを操作するかは関係ありません。重要なことは、そのデータをコードとの間でどのように渡すかです。そのために 'std :: wstring'を使用している場合は、UTF-16を使用している/期待している可能性があります。 UTF-8とUTF-16は、同じUnicode文字セットの異なるエンコーディングであるため、意味があります。データベースはUTF-8以外の文字セットを使用している可能性があり、ODBCは内部的にそれを処理し、一貫性のためにUTF-16を使用してデータを渡します。 –

答えて

5

std::wstringの場合はUTF-16を意味し、UTF-8を意味しないと仮定すると、1つのライブラリから別のライブラリに文字列をエンコード/デコードする必要があります。 STLが提供しているかどうかはわかりませんが、Windowsの独自のMultiByteToWideChar()WideCharToMultiByte()関数を使用すると、ほんの数行のコードでUTF-8とUTF-16を変換できます。あなたはよりポータブルなものを見つけたときにロジックを置き換えることができますので、あなたはその後、例えば、独自の関数にその可能性をラップ:

std::wstring Utf8ToUtf16(const std::string &s) 
{ 
    std::wstring ret; 
    int len = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), s.length(), NULL, 0); 
    if (len > 0) 
    { 
     ret.resize(len); 
     MultiByteToWideChar(CP_UTF8, 0, s.c_str(), s.length(), const_cast<wchar_t*>(ret.c_str()), len); 
    } 
    return ret; 
} 

std::string Utf16ToUtf8(const std::wstring &s) 
{ 
    std::string ret; 
    int len = WideCharToMultiByte(CP_UTF8, 0, s.c_str(), s.length(), NULL, 0, NULL, NULL); 
    if (len > 0) 
    { 
     ret.resize(len); 
     WideCharToMultiByte(CP_UTF8, 0, s.c_str(), s.length(), const_cast<char*>(ret.c_str()), len, NULL, NULL); 
    } 
    return ret; 
} 
+0

これはWindows固有のものですが、UTF-16はうまくいけばWindowsを意味することに注意してください。 – rubenvb

+0

'c_str'がconst C文字列を返すので、コンパイルされません。しかし、正しい方法でいるために+1。 – dalle

+0

UTF-16はWindows固有ではありません。唯一のWindows固有の部分は、使用されるAPI関数です。私が言ったように、これはそれを行う方法を示すことでした。 OPがよりポータブルなソリューションを見つけたら、彼/彼女はコードの残りの部分を書き換えることなくAPI関数を置き換えることができます。 –

1

ICU考えてみましょう。これは移植性があり、エンコーディングの間に多くのコンバータを持っています

+2

私の現在のニーズには大きすぎます。私のプログラムは、ランタイムに静的にリンクされた400KB未満です。 ICUはおそらくサイズが2倍以上になり、静的にリンクできるかどうかはわかりません。 – user754425

+0

ICUでなければ 'iconv'。これもPOSIXです。 –

関連する問題