「MFCの基礎 - UTF-8」の版間の差分

ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == wchar_tはUTF-16に対応しており、Shift-JIS等からUTF-8に直接的で変換できない。<br> ここでは、様々な文字コードからUTF-8へ…」)
 
5行目: 5行目:


== サンプルコード ==
== サンプルコード ==
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <windows.h>
  #include <windows.h>
   
   
  char *buf1;
  char *pstrShiftJIS = "文字列のテスト";
  wchar_t buf2[512];
  wchar_t pstrUTF8[512];
   
   
  // Shift-JISからUTF-16へ変換
  // Shift-JISからUTF-16へ変換
  ::MultiByteToWideChar(CP_ACP, 0, buf1, -1, buf2, 512);
  ::MultiByteToWideChar(CP_ACP, 0, pstrShiftJIS, -1, pstrUTF8, 512);
   
   
  // UTF-16からUTF-8へ変換
  // UTF-16からUTF-8へ変換
  ::WideCharToMultiByte(CP_UTF8, 0, buf2, -1, buf1, 512, NULL, NULL);
  ::WideCharToMultiByte(CP_UTF8, 0, pstrUTF8, -1, pstrShiftJIS, 512, NULL, NULL);
  </source>
  </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であることを示す3バイトのデータ0xEF、0xBB、0xBFが付加されている。(BOMという)<br>
UTF-8のファイルを出力する場合、以下のように出力しないと、UTF-8として正しく認識されない。<br>
UTF-8のファイルを出力する場合、以下のように出力しないと、UTF-8として正しく認識されない。<br>
(BOMが付加されていないUTF-8をUTF-8Nという)<br>
(BOMが付加されていないUTF-8を、UTF-8Nという)<br>
  <source lang="c++">
  <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;
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:MFC]]
[[カテゴリ:MFC]]

案内メニュー