12,788
回編集
(ページの作成:「== 概要 == wchar_tはUTF-16に対応しており、Shift-JIS等からUTF-8に直接的で変換できない。<br> ここでは、様々な文字コードからUTF-8へ…」) |
|||
5行目: | 5行目: | ||
== サンプルコード == | == サンプルコード == | ||
< | <syntaxhighlight lang="c++"> | ||
#include <windows.h> | #include <windows.h> | ||
char * | char *pstrShiftJIS = "文字列のテスト"; | ||
wchar_t | wchar_t pstrUTF8[512]; | ||
// Shift-JISからUTF-16へ変換 | // Shift-JISからUTF-16へ変換 | ||
::MultiByteToWideChar(CP_ACP, 0, | ::MultiByteToWideChar(CP_ACP, 0, pstrShiftJIS, -1, pstrUTF8, 512); | ||
// UTF-16からUTF-8へ変換 | // UTF-16からUTF-8へ変換 | ||
::WideCharToMultiByte(CP_UTF8, 0, | ::WideCharToMultiByte(CP_UTF8, 0, pstrUTF8, -1, pstrShiftJIS, 512, NULL, NULL); | ||
</ | </syntaxhighlight> | ||
<br> | |||
以下の例では、UTF-8への変換を関数として定義している。<br> | |||
<syntaxhighlight lang="c++"> | |||
void ShiftJISToUTF8(char pstrShiftJIS[]) | |||
{ | |||
wchar_t pstrUTF16[512] = {\0}; | |||
wchar_t 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(wchar_t 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]] |