mingw c++ で使える文字エンコーディング変換ライブラリ

ソースコードのエンコーデングは多言語化対応のためにUTF8が主流であるがUTF8だと単純にprintf(“日本語”)すると化けてしまう。

日本ではコンソールのコードページがCP932であるから化けるのは当たり前ではあるのだがUTF8からCP932にいちいち変換するのは煩わしいし、-fexec-charset=CP932を使う方法はCP932専用アプリになってしまうのでお勧めでもない。

最良な方法はソースコードのエンコーデングに合わせてコンソールのコードページもUTF8にすることであるが次のように手動で切り替えするのも煩わしかったりする。

chcp 65001

そこでコンソールのコードページをUTF8に変更したりコードページ文字列/UTF8文字列/ワイド文字列の三つ巴の双方向変換が行えるライブラリを作ってみた。

変換バッファ領域は自動管理なので簡単に使えるし、おまけにマルチスレッド対応も...って、余計なお世話かな?(-_-;)

ちなみにコンソールのコードページを変更しても起動時のコードページはそのままなのでコマンドライン引数のエンコーディングには気を付ける必要がある。

コンソールのコードページを変更した場合はfromCP(argv[x])或いはtoXXX(fromCP(argv[x]))のようにコマンドライン引数のエンコーディングを変換してから処理しなければならない。

変換バッファ領域の開放はスコープを抜けた時点で行われるためループ内で変換関数を使うときはループ内でのWideChar宣言を推奨。ループ外で宣言するとループ毎にメモリ消費量が増加するので注意してほしい。

【メモリ消費量が多い】

【メモリ消費量が少ない】

【概要】

引数にtrueを指定したときコンソールの入出力コードページを変更(規定値はUTF8)しスコープを抜けたときに元に戻す。

UTF8文字列をANSI文字列へ変換する。

UTF8文字列をOEM文字列へ変換する。

UTF8文字列を現在のコンソールのコードページ文字列へ変換する。

UTF8文字列を起動時のコンソールのコードページ文字列へ変換する。

UTF8文字列を指定のコードページ文字列へ変換する。

ANSI文字列をUTF8文字列へ変換する。

OEM文字列をUTF8文字列へ変換する。

現在のコンソールのコードページ文字列をUTF8文字列へ変換する。

起動時のコンソールのコードページ文字列をUTF8文字列へ変換する。

指定のコードページ文字列をUTF8文字列へ変換する。

ワイド文字列をANSI文字列へ変換する。

ワイド文字列をOEM文字列へ変換する。

ワイド文字列をUTF8文字列へ変換する。

ワイド文字列を現在のコンソールのコードページ文字列へ変換する。

ワイド文字列を起動時のコンソールのコードページ文字列へ変換する。

ワイド文字列を指定のコードページ文字列へ変換する。

ANSI文字列をワイド文字列へ変換する。

OEM文字列をワイド文字列へ変換する。

UTF8文字列をワイド文字列へ変換する。

現在のコンソールのコードページ文字列をワイド文字列へ変換する。

起動時のコンソールのコードページ文字列をワイド文字列へ変換する。

指定のコードページ文字列をワイド文字列へ変換する。

【修正】
2024-01-20
コンソールのコードページをUTF8固定ではなく指定できるように変更。

2024-01-18
変換メソッドを追加。

【ライブラリ】
GUIにはA/WサフィックスのAPIがある。AサフィックスのAPIにはOEMCP文字列、WサフィックスのAPIにはワイド文字列を使うこと。