dragon spx

文字コードを自由に変換したい

WindowsでSJISベースで汲まれた文字表示ルーチンをiOS/Androidで動作させるときに毎度変換が必要になるため、Windowsに依存しない変換方法をメモ。

SJIS ->UTF-8 / UTF-8 -> SJISに変換したい

test.cpp(SJISで記述)

#include <locale.h>

void TestProg()
{
	char *mbstbl = {
		"あ"	//82a0 SJIS
	};
	wchar_t wcstbl[32] = {
		L"あ",	//4230 UTF-8
	};
	setlocale(LC_ALL, "JPN");

	//utf-8 -> sjis

	char tblm[32] = {0};
	size_t ret = wcstombs( tblm, wcstbl, 32);

	//tblm = 82a0 ->sjis

	//sjis ->utf16

	wchar_t tblm2[32] = { 0 };
	ret = mbstowcs(tblm2, tblm, 32);

	//4230 sjis ->utf16

	tblm2[0] = 0x00;
	ret = mbstowcs(tblm2, mbstbl, 32);

	//4230 sjis ->utf16

	ret = wcstombs(tblm, tblm2, 32);

	//8xa0 utf16 -> sjis

}

setlocaleに注意

mbstowcs / wcstombsは事前にどこの地域であるかを設定するsetlocaleをしておかないと変換に失敗するので注意。

setlocale(LC_ALL, "JPN"); //←日本に設定

LC_ALLは地域設定に含まれる、言語や時間などを全部変更する。
言語だけならLANG、時間ならLC_TIMEなどで個別の指定も可能。