ソフトバンクの絵文字変換

utf8_to_sjisは、内部でSoftBankEncode::unicodeToEscaped()を呼び出している。
SoftBankEncode::unicodeToEscaped()は、utf-8の絵文字コードをwebコードに変換する関数である。この部分を見ていった。

unicodeToEscaped()

ソフトバンクの絵文字コード(utf-8)は、unicodeのプライベートエリアを用いている。その範囲は「0xe000〜0xf8ff」であり、「SoftBankEncode.xs」では、

#define U_PRIVATE_USE_MIN (WCHAR)(0xe000)
#define U_PRIVATE_USE_MAX (WCHAR)(0xf8ff)

と定義されている。

unicodeToEscapedでは、この範囲にある文字についてチェックしている。

// pwchIN: 文字列先頭のポインタ
// cchIn : 文字数

for (pIn = pwchIN; pIn < pwchIN + cchIn; pIn++) {
   if (U_PRIVATE_USE_MIN <= *pIn && *pIn <= U_PRIVATE_USE_MAX) {
      
   }
} 

utf-8の絵文字コードは、それに対応するwebコード形式に変換される。
SoftBankEncode.xsでは、utf-8とwebコードの対応を表わすマップを定義している。

typedef struct {
   WCHAR  wch;
   char*  pEncoded;
} EMOTICON_MAP;

static EMOTICON_MAP emoticonMap[] =
{
      { 0xE001,  "G!"},

 ///////////ずらっと続く//////////////

      { 0xE537,  "QW"},
      { 0xE538,  "QX"},
      { 0xE539,  "QY"},
      { 0     ,  NULL}
};     

関数_findEmoticonFromUnicode()は、このマップを用いて、utf-8に対応するwebコードを探す。

static EMOTICON_MAP* _findEmoticonFromUnicode(WCHAR *wch)
{
   EMOTICON_MAP* p;
   for ( p = emoticonMap; p->wch != 0; p++) {
      if (p->wch == wch) {
         return p;
      }
   }
   return NULL;
}

対応するwebコードが見つかると、webコード形式で出力バッファに書き込まれる。

*(pOut + 0) = (WCHAR)0x1b;
*(pOut + 1) = (WCHAR)0x24;
*(pOut + 2) = (WCHAR)(map->pEncoded[0]);
*(pOut + 3) = (WCHAR)(map->pEncoded[1]);
*(pOut + 4) = (WCHAR)0x0f;

このようにソフトバンクutf-8形式の絵文字は、webコード(1b 24 {C1} {C2} 0f)形式に変換される。この後、auとドコモと同様にmcode_any2u()で内部形式に変換される。