での議論に応じて
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を操作することなく格納するだけですか?
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"महसुस");
[ウォッチ]ウィンドウにmsg.c_str(), s8
と記述して、UTF-8文字列を正しく表示できます。
C++ 11をお持ちの場合は、u8"महसुस"
と書くことができます。それ以外の場合は、UTF-8シーケンスのバイトごとに\xxx
を使用して、実際のバイトシーケンスを書き込む必要があります。
通常、このようなテキストは構成ファイルから読み取る方が適切です。
システムロケールを英語に設定し、ファイルがBOMなしのUTF-8である場合、VCを使用すると、文字列をそのまま保存できます。 についての記事を書きました。これはここにあります。
‘s8' 形式指定子 のおかげで正しい値を表示する方法があります。変数名に ‘、s8'を追加すると、Visual StudioはテキストをUTF-8で再解析し、テキストを正しくレンダリングします。
Microsoft Visual Studio 2008 Service Pack 1を使用している場合は、修正プログラムを適用する必要があります