- ベストアンサー
EUCからSJISに上手く変換できない
- EUCからSJISに変換する際に「渕」という字が文字化けしてしまいます。
- 修正方法を教えてください。
- 関数内のコードを確認し、適切な修正を行いましょう。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。 > if (*code1 < 0x6F) ←ここの分岐があやしい? そうでした^^; *code1 >>= 1; によって、1ビット落ちてるんですね。 本来、0xDF より小さいか否かで比較するべきところなのですが、>> 1 によって 0xDF も 0xDE も 0x6F となってしまうため、正常に処理できてませんでした。 このため >>= 1 は行わず、必要箇所でのみ >> 1 を行うようにしてください。 ※No.2の方が回答されていますが、上記理由により > if (*code1 <= 0x6F) でも正常に処理できません。 以下参考までに if (*code1 & 0x01) { *code1 = (*code1 >> 1) + (*code1 < 0xDF ? 0x31 : 0x71); *code2 -= 0x60 + (*code2 < 0xE0); } else { *code1 = (*code1 >> 1) + (*code1 < 0xDF ? 0x30 : 0x70); *code2 -= 0x02; }
その他の回答 (3)
- hofuhofu
- ベストアンサー率70% (336/476)
*code1 >>= 1; の前に、 if (*code1 & 0x01) があるので、この段階ですでに偶数・奇数に分かれています。 よって、0xDF、0xDEが同じ0x6Fとなったとしても、処理自体が分岐済みなのでそれぞれ別々の処理が行われます。 たとえば*code1が、 DC DD DE DF E0 E1 であったとしたら、まずこれを偶奇に分離し、 偶数:DC DE E0 奇数:DD DF E1 半分にする。 6E 6F | 70 6E | 6F 70 これを6Fの前後で分岐するようにして、相応の数を足すようにすれば、 9E 9F | E0 9F | E0 E1 となりちゃんと変換できます。 質問文のプログラムでは両方とも6Fの前で分岐するようになっていたので本来6F+30=9Fとなるべきものが、6F+70=DFとなっていただけです。 0xDFで分岐するのも一つの方法ですが、この方法も間違いとは言えません。
お礼
具体的な説明、ありがとうございます。 たしかにその通りです。 偶数の判定文が間違っているだけのようです。 この方法で修正したいと思います。 ありがとうございました!
- hofuhofu
- ベストアンサー率70% (336/476)
http://www.net.is.uec.ac.jp/~ueno/material/kanji/euc2sjis.html この表をみると、偶数側の分岐は if (*code1 <= 0x6F) でないといけないような気がしますけど。 0xDEも0xDFの半分にすれば両方とも0x6Fですけど、片方は0x9F、もう一方は0xE0になるはずですから。
- leaz024
- ベストアンサー率75% (398/526)
euc2sjis 関数自体は問題ないと思います。 が、補足の > 「渕」は、EUCではDEB0 > SJISでは9FAEだと思います。 は誤りで、正しくは EUC では DEBC SJIS では 9FBA です。 質問にある文字コードは「洌」という字のものです。
補足
すいません。コードはその通りです。 今、デバック中なのですが、 「DE」→「DF」(「EUC」→「SJIS」)になっているので、文字化けしてるみたいです。。。 if (*code1 & 0x01) { ・ ・ ・ } else { *code1 >>= 1; if (*code1 < 0x6F) ←ここの分岐があやしい? *code1 += 0x30; else *code1 += 0x70; *code2 -= 0x02; }
お礼
分岐は、1ビット落ちる前の「DF」で判定し、その後1ビット落として処理をすると上手く行きました!! 回答、ありがとうございました! m(__)m