• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EUCからSJISに上手く変換できない)

EUCからSJISに上手く変換できない

このQ&Aのポイント
  • EUCからSJISに変換する際に「渕」という字が文字化けしてしまいます。
  • 修正方法を教えてください。
  • 関数内のコードを確認し、適切な修正を行いましょう。

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

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;   }

dekomika
質問者

お礼

分岐は、1ビット落ちる前の「DF」で判定し、その後1ビット落として処理をすると上手く行きました!! 回答、ありがとうございました! m(__)m

その他の回答 (3)

  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.4

*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で分岐するのも一つの方法ですが、この方法も間違いとは言えません。

dekomika
質問者

お礼

具体的な説明、ありがとうございます。 たしかにその通りです。 偶数の判定文が間違っているだけのようです。 この方法で修正したいと思います。 ありがとうございました!

  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.2

http://www.net.is.uec.ac.jp/~ueno/material/kanji/euc2sjis.html この表をみると、偶数側の分岐は if (*code1 <= 0x6F) でないといけないような気がしますけど。 0xDEも0xDFの半分にすれば両方とも0x6Fですけど、片方は0x9F、もう一方は0xE0になるはずですから。

参考URL:
http://www.net.is.uec.ac.jp/~ueno/material/kanji/euc2sjis.html
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.1

euc2sjis 関数自体は問題ないと思います。 が、補足の > 「渕」は、EUCではDEB0 >      SJISでは9FAEだと思います。 は誤りで、正しくは  EUC では DEBC  SJIS では 9FBA です。 質問にある文字コードは「洌」という字のものです。

dekomika
質問者

補足

すいません。コードはその通りです。 今、デバック中なのですが、 「DE」→「DF」(「EUC」→「SJIS」)になっているので、文字化けしてるみたいです。。。 if (*code1 & 0x01) {     ・     ・     ・ } else {    *code1 >>= 1;    if (*code1 < 0x6F) ←ここの分岐があやしい?      *code1 += 0x30;     else      *code1 += 0x70;    *code2 -= 0x02; }

関連するQ&A