ソフトバンクの絵文字変換
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()で内部形式に変換される。