2017-03-28 (火)
C++11で文字コードどう扱うの調べたりしていた.
std::locale sjis(".932", std::locale::ctype); typedef std::codecvt<wchar_t, char, std::mbstate_t> mbCvt; const mbCvt& cvt = std::use_facet<mbCvt>(sjis); std::wstring_convert<mbCvt, wchar_t> sjisConverter(&cvt); std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> utf8Converter; std::wstring ws = sjisConverter.from_bytes("sjis string"); std::string utf8 = utf8Converter.to_bytes( ws ); std::wstring ws2 = utf8Converter.from_bytes("utf8string"); std::string sjis = sjisConverter.to_bytes( ws2 );
これで,wstring と sjis文字列とutf8文字列の相互変換ができるっぽい.mbstowcs系の関数は使いたくないなと思ってたので良かった.
メタセコイアのプラグインのために,久しぶりにWindowsで実行されるコード書いたけど,ワイド文字(UTF-16)とマルチバイト文字(CP932)とUTF-8が入り乱れててひどいな.
ほとんどの関数はwchar_tなのに,オブジェクト名とかはマルチバイト文字返すのが残念.