大ざっぱな文字コードと、相互変換についての説明。ウソも混じっているかも‥‥。 主目的は EUC → SJIS 変換を調べた際の覚え書きです。間違いがあっても気にしない。お互いに存在しない文字や記号がある場合も考えられますが、そういうことを気にする方はさらに詳しく調べてください。 |
|
|
JIS から EUC に変換する場合、1バイト目、2バイト目に 0x80 を加算するか、論理和。半角カタカナは1バイト目に 0x8E 、2バイト目に JIS の半角コードがそのままはいる。 EUC から JIS であれば、逆になる。 JISのエスケープコード、半角カタカナの扱いに注意。 JIS から EUC の変換アルゴリズムとしては
|
|
JIS から SJIS に変換する場合 1バイト目が 0x21〜0x5E は 0x81〜0x9F に、 0x5F〜0x7E は 0xE0〜0xEF に。 2バイト目は1バイト目が
JIS から SJIS の変換アルゴリズムとしては
|
|
EUC とJISの差は 0x80 しかないのでEUC-JIS JIS-SJIS の二段構えで操作した方が簡単(苦笑。 だが、せっかくなので直接変換を考える。変換式自体はこれ以外にも当然あり得る。 EUC から SJIS に変換する場合 1バイト目が 0xA1〜0xDE は 0x81〜0x9F に、 0xDF〜0xFE は 0xE0〜0xEF に。 2バイト目は1バイト目が
EUC から SJIS の変換アルゴリズムとしては
サンプルソース 返り値:SJISコード。上位が1バイト目、下位が2バイト目。 0x100以下は半角文字。 int EUC2SJIS(unsinged char *euc){ int code, hi; if(*euc == 0x8E) /* 半角カタカナの処理 */ code = *(euc+1); else if(*euc >= 0xA1){ /* 2バイト文字の処理 */ /* 2バイト目を先に処理 */ code = *(euc+1); code -= (*euc & 1) ? 0x61 : 0x03; if( *(euc+1) >= 0x7F) code++; /* 1バイト目 */ hi = ( *euc + 1 ) / 2; hi += (hi < 0x70 ) ? 0x30 : 0x70; code += hi * 0x100; }else code = *euc; /* 1バイト文字の処理 */ return code; }SJIS から EUC の変換アルゴリズムとしては
|
|