web-dev-qa-db-ja.com

ユニコードUTF-8文字列をstd :: stringに保存する

での議論に応じて

C++のクロスプラットフォーム文字列(およびUnicode)

クロスプラットフォームに適した方法でC/C++のUnicode文字列を処理する方法は?

UTF-8環境のstd::string変数にVisual Studio 2010文字列を割り当てようとしています

std::string msg = "महसुस";

ただし、文字列ビューデバッガーを表示すると、「?????」しか表示されません。ファイルをUnicode(署名付きのUTF-8)として保存し、文字セット「use unicodecharacterset」を使用しています

「महसुस」はネパール語で、5文字で15バイトを占めます。ただし、VisualStudioデバッガーではメッセージサイズが5と表示されます

私の質問は:

どのようにstd :: stringを使用して、utf-8を操作することなく格納するだけですか

12
Pritesh Acharya

C++ 11を使用している場合、これは簡単です。

std::string msg = u8"महसुस";

しかし、そうではないので、エスケープシーケンスを使用し、ソースファイルの文字セットに依存せずにエンコーディングを管理できます。これにより、コードの移植性が向上します(誤って非UTF8形式で保存した場合)。

std::string msg = "\xE0\xA4\xAE\xE0\xA4\xB9\xE0\xA4\xB8\xE0\xA5\x81\xE0\xA4\xB8"; // "महसुस"

それ以外の場合は、代わりに実行時に変換を行うことを検討してください。

std::string toUtf8(const std::wstring &str)
{
    std::string ret;
    int len = WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.length(), NULL, 0, NULL, NULL);
    if (len > 0)
    {
        ret.resize(len);
        WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.length(), &ret[0], len, NULL, NULL);
    }
    return ret;
}
std::string msg = toUtf8(L"महसुस");
15
Remy Lebeau

[ウォッチ]ウィンドウにmsg.c_str(), s8と記述して、UTF-8文字列を正しく表示できます。

5
Sergey K.

C++ 11をお持ちの場合は、u8"महसुस"と書くことができます。それ以外の場合は、UTF-8シーケンスのバイトごとに\xxxを使用して、実際のバイトシーケンスを書き込む必要があります。

通常、このようなテキストは構成ファイルから読み取る方が適切です。

4
James Kanze

システムロケールを英語に設定し、ファイルがBOMなしのUTF-8である場合、VCを使用すると、文字列をそのまま保存できます。 についての記事を書きました。これはここにあります。

enter image description here

1
raymai97

‘s8' 形式指定子 のおかげで正しい値を表示する方法があります。変数名に ‘、s8'を追加すると、Visual StudioはテキストをUTF-8で再解析し、テキストを正しくレンダリングします。

Microsoft Visual Studio 2008 Service Pack 1を使用している場合は、修正プログラムを適用する必要があります

http://support.Microsoft.com/kb/98026

1
DNamto