【C++】std::codecvtで文字コード変換を行う【標準ライブラリ】
std::codecvtとは
std::codecvt
はC++標準ライブラリに含まれるファセット(facet)の一つで、
文字コード変換を行うためのクラスです。Unicodeのエンコーディング変換や、ワイド文字とマルチバイト文字の相互変換に利用されます。
基本的な使い方
典型的な使い方は std::wstring_convert
を使う方法です。
例えば、UTF-8からワイド文字(UTF-16またはUTF-32)に変換する例を示します。
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
int main() {
std::wstring_convert> converter;
std::string utf8_str = "こんにちは";
std::wstring wide_str = converter.from_bytes(utf8_str);
std::wcout << L"変換後: " << wide_str << std::endl;
return 0;
}
UTF-8とUTF-16の変換
UTF-8とUTF-16の変換には、std::codecvt_utf8_utf16
を使用できます。
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
int main() {
std::wstring_convert, char16_t> converter;
std::string utf8_str = u8"こんにちは";
std::u16string utf16_str = converter.from_bytes(utf8_str);
std::wcout << L"UTF-16変換後のサイズ: " << utf16_str.size() << std::endl;
return 0;
}
UTF-8とUTF-32の変換
UTF-8とUTF-32の変換には、std::codecvt_utf8
を使用します。
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
int main() {
std::wstring_convert, char32_t> converter;
std::string utf8_str = u8"こんにちは";
std::u32string utf32_str = converter.from_bytes(utf8_str);
std::wcout << L"UTF-32変換後のサイズ: " << utf32_str.size() << std::endl;
return 0;
}
カスタムstd::codecvtの実装
std::codecvt
を継承して独自の文字変換ルールを定義できます。
#include <iostream>
#include <locale>.
#include <codecvt>.
class CustomCodecvt : public std::codecvt {
protected:
result do_in(std::mbstate_t&, const char*, const char*, const char*&, wchar_t*, wchar_t*, wchar_t*&) const override {
return ok;
}
result do_out(std::mbstate_t&, const wchar_t*, const wchar_t*, const wchar_t*&, char*, char*, char*&) const override {
return ok;
}
result do_unshift(std::mbstate_t&, char*, char*, char*&) const override {
return noconv;
}
int do_encoding() const noexcept override {
return 1;
}
};
これは単純なサンプルで、実際には do_in
や do_out
内で適切なエンコーディング変換を実装する必要があります。
std::codecvtの制限と非推奨について
std::codecvt
はC++17で非推奨となり、C++20で削除されました。
そのため、新しいC++バージョンでは std::codecvt
を使わずに、std::u8string
や ICUライブラリを利用することが推奨されます。
#include <iostream>
#include <string>.
int main() {
std::u8string utf8_str = u8"こんにちは";
std::cout << "UTF-8文字列: " << reinterpret_cast(utf8_str.data()) << std::endl;
return 0;
}
もしC++20以降を使用する場合、標準ライブラリのみでのエンコーディング変換は難しくなるため、ICUやBoost.Localeなどの外部ライブラリの使用を検討してください。