「MFCの基礎 - UTF-8」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「== 概要 == wchar_tはUTF-16に対応しており、Shift-JIS等からUTF-8に直接的で変換できない。<br> ここでは、様々な文字コードからUTF-8へ…」) |
|||
(同じ利用者による、間の2版が非表示) | |||
5行目: | 5行目: | ||
== サンプルコード == | == サンプルコード == | ||
< | <syntaxhighlight lang="c++"> | ||
#include <windows.h> | #include <windows.h> | ||
char * | char *pstrShiftJIS = "文字列のテスト"; | ||
wchar_t | wchar_t pstrUTF16[512] = {\0}; | ||
char *pstrUTF8[512] = {\0}; | |||
// Shift-JISからUTF-16へ変換 | // Shift-JISからUTF-16へ変換 | ||
::MultiByteToWideChar(CP_ACP, 0, | ::MultiByteToWideChar(CP_ACP, 0, pstrShiftJIS, -1, pstrUTF16, 512); | ||
// UTF-16からUTF-8へ変換 | // UTF-16からUTF-8へ変換 | ||
::WideCharToMultiByte(CP_UTF8, 0, | ::WideCharToMultiByte(CP_UTF8, 0, pstrUTF8, -1, pstrUTF16, 512, NULL, NULL); | ||
</ | </syntaxhighlight> | ||
<br> | |||
以下の例では、UTF-8への変換を関数として定義している。<br> | |||
<syntaxhighlight lang="c++"> | |||
void ShiftJISToUTF8(char pstrShiftJIS[]) | |||
{ | |||
wchar_t pstrUTF16[512] = {\0}; | |||
char pstrUTF8[512] = {\0}; | |||
// UTF-16へ変換する前に、文字列を代入するバッファのサイズを確認する | |||
int iLengthUTF16 = ::MultiByteToWideChar(CP_ACP, 0, pstrShiftJIS, lstrlen(pstrShiftJIS) + 1, NULL, 0); | |||
if(iLengthUTF16 <= sizeof(pstrUTF16) / sizeof(pstrUTF16[0])) | |||
{ | |||
// まず、UTF-16へ変換する | |||
::MultiByteToWideChar(CP_ACP, 0, pstrShiftJIS, lstrlen(pstrShiftJIS) + 1, pstrUTF16, MAX_PATH); | |||
// UTF-8へ変換する前に、文字列を代入するバッファのサイズを確認する | |||
int iLengthUtf8 = ::WideCharToMultiByte(CP_UTF8, 0, pstrUTF16, iLengthUTF16, NULL, 0, NULL, NULL); | |||
if(iLengthUtf8 <= sizeof(pstrUTF8)) | |||
{ | |||
// 次に、UTF-16からUTF-8へ変換する | |||
::WideCharToMultiByte(CP_UTF8, 0, pstrUTF16, iLengthUTF16, pstrUTF8, sizeof(pstrUTF8), NULL, NULL); | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
以下の例では、UTF-8からShift-JISへの変換を関数として定義している。<br> | |||
<syntaxhighlight lang="c++"> | |||
void UTF8ToShiftJis(char pstrUTF8[]) | |||
{ | |||
wchar_t pstrUTF16[512] = {\0}; | |||
char pstrShiftJIS[512] = {\0}; | |||
// UTF-16へ変換する前に、文字列を代入するバッファのサイズを確認する | |||
int iLengthUTF16 = ::MultiByteToWideChar(CP_UTF8, 0, pstrUTF8, lstrlen(pstrUTF8) + 1, NULL, 0); | |||
if(iLengthUTF16 <= sizeof(pstrUTF16) / sizeof(pstrUTF16[0])) | |||
{ | |||
// まず、UTF-16へ変換する | |||
::MultiByteToWideChar(CP_UTF8, 0, pstrUTF8, lstrlen(pstrUTF8) + 1, pstrUTF16, MAX_PATH); | |||
// Shift-JISへ変換する前に、文字列を代入するバッファのサイズを確認する | |||
int iLengthShiftJIS = ::WideCharToMultiByte(CP_ACP, 0, pstrUTF16, iLengthUTF16, NULL, 0, NULL, NULL); | |||
if(iLengthShiftJIS <= sizeof(pstrShiftJIS)) | |||
{ | |||
// 次に、UTF-16からShift-JISへ変換する | |||
::WideCharToMultiByte(CP_ACP, 0, pstrUTF16, iLengthUTF16, pstrShiftJIS, sizeof(pstrShiftJIS), NULL, NULL); | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== UTF-8のBOM == | |||
UTF-8では、ファイルの先頭にUTF-8であることを示す3バイトのデータ0xEF、0xBB、0xBFが付加されている。<br> | |||
これを、BOMと呼ぶ。<br> | |||
<br> | <br> | ||
UTF-8のファイルを出力する場合、以下のように出力しないと、UTF-8として正しく認識されない。<br> | UTF-8のファイルを出力する場合、以下のように出力しないと、UTF-8として正しく認識されない。<br> | ||
(BOMが付加されていないUTF- | (BOMが付加されていないUTF-8を、UTF-8Nという)<br> | ||
< | <syntaxhighlight lang="c++"> | ||
buf2[0] = 0xEF; | buf2[0] = 0xEF; | ||
buf2[1] = 0xBB; | buf2[1] = 0xBB; | ||
buf2[2] = 0xBF; | buf2[2] = 0xBF; | ||
buf2[3] = nullptr; | buf2[3] = nullptr; | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:MFC]] | [[カテゴリ:MFC]] |
2021年5月21日 (金) 13:09時点における最新版
概要
wchar_tはUTF-16に対応しており、Shift-JIS等からUTF-8に直接的で変換できない。
ここでは、様々な文字コードからUTF-8へ変換する方法を記載する。
サンプルコード
#include <windows.h>
char *pstrShiftJIS = "文字列のテスト";
wchar_t pstrUTF16[512] = {\0};
char *pstrUTF8[512] = {\0};
// Shift-JISからUTF-16へ変換
::MultiByteToWideChar(CP_ACP, 0, pstrShiftJIS, -1, pstrUTF16, 512);
// UTF-16からUTF-8へ変換
::WideCharToMultiByte(CP_UTF8, 0, pstrUTF8, -1, pstrUTF16, 512, NULL, NULL);
以下の例では、UTF-8への変換を関数として定義している。
void ShiftJISToUTF8(char pstrShiftJIS[])
{
wchar_t pstrUTF16[512] = {\0};
char pstrUTF8[512] = {\0};
// UTF-16へ変換する前に、文字列を代入するバッファのサイズを確認する
int iLengthUTF16 = ::MultiByteToWideChar(CP_ACP, 0, pstrShiftJIS, lstrlen(pstrShiftJIS) + 1, NULL, 0);
if(iLengthUTF16 <= sizeof(pstrUTF16) / sizeof(pstrUTF16[0]))
{
// まず、UTF-16へ変換する
::MultiByteToWideChar(CP_ACP, 0, pstrShiftJIS, lstrlen(pstrShiftJIS) + 1, pstrUTF16, MAX_PATH);
// UTF-8へ変換する前に、文字列を代入するバッファのサイズを確認する
int iLengthUtf8 = ::WideCharToMultiByte(CP_UTF8, 0, pstrUTF16, iLengthUTF16, NULL, 0, NULL, NULL);
if(iLengthUtf8 <= sizeof(pstrUTF8))
{
// 次に、UTF-16からUTF-8へ変換する
::WideCharToMultiByte(CP_UTF8, 0, pstrUTF16, iLengthUTF16, pstrUTF8, sizeof(pstrUTF8), NULL, NULL);
}
}
}
以下の例では、UTF-8からShift-JISへの変換を関数として定義している。
void UTF8ToShiftJis(char pstrUTF8[])
{
wchar_t pstrUTF16[512] = {\0};
char pstrShiftJIS[512] = {\0};
// UTF-16へ変換する前に、文字列を代入するバッファのサイズを確認する
int iLengthUTF16 = ::MultiByteToWideChar(CP_UTF8, 0, pstrUTF8, lstrlen(pstrUTF8) + 1, NULL, 0);
if(iLengthUTF16 <= sizeof(pstrUTF16) / sizeof(pstrUTF16[0]))
{
// まず、UTF-16へ変換する
::MultiByteToWideChar(CP_UTF8, 0, pstrUTF8, lstrlen(pstrUTF8) + 1, pstrUTF16, MAX_PATH);
// Shift-JISへ変換する前に、文字列を代入するバッファのサイズを確認する
int iLengthShiftJIS = ::WideCharToMultiByte(CP_ACP, 0, pstrUTF16, iLengthUTF16, NULL, 0, NULL, NULL);
if(iLengthShiftJIS <= sizeof(pstrShiftJIS))
{
// 次に、UTF-16からShift-JISへ変換する
::WideCharToMultiByte(CP_ACP, 0, pstrUTF16, iLengthUTF16, pstrShiftJIS, sizeof(pstrShiftJIS), NULL, NULL);
}
}
}
UTF-8のBOM
UTF-8では、ファイルの先頭にUTF-8であることを示す3バイトのデータ0xEF、0xBB、0xBFが付加されている。
これを、BOMと呼ぶ。
UTF-8のファイルを出力する場合、以下のように出力しないと、UTF-8として正しく認識されない。
(BOMが付加されていないUTF-8を、UTF-8Nという)
buf2[0] = 0xEF;
buf2[1] = 0xBB;
buf2[2] = 0xBF;
buf2[3] = nullptr;