アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のような関数でEUCからSJISに変換しているのですが、
「渕」という字が文字化けしてしまいます。

どんなふうに修正したらいいか、教えて下さい。

【関数】
void euc2sjis(BYTE *code1, BYTE *code2)
{
  if (*code1 & 0x01) {
    *code1 >>= 1;
    if (*code1 < 0x6F)
      *code1 += 0x31;
    else
      *code1 += 0x71;
    if (*code2 > 0xDF)
      *code2 -= 0x60;
    else
      *code2 -= 0x61;
   } else {
    *code1 >>= 1;
    if (*code1 < 0x6F)
      *code1 += 0x30;
    else
      *code1 += 0x70;
    *code2 -= 0x02;
   }
}
【補足】
「渕」は、EUCではDEB0
     SJISでは9FAEだと思います。

A 回答 (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;
  }
    • good
    • 0
この回答へのお礼

分岐は、1ビット落ちる前の「DF」で判定し、その後1ビット落として処理をすると上手く行きました!!

回答、ありがとうございました!
m(__)m

お礼日時:2003/04/25 19:33

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

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

ありがとうございました!

お礼日時:2003/04/28 16:48

http://www.net.is.uec.ac.jp/~ueno/material/kanji …
この表をみると、偶数側の分岐は
if (*code1 <= 0x6F)
でないといけないような気がしますけど。

0xDEも0xDFの半分にすれば両方とも0x6Fですけど、片方は0x9F、もう一方は0xE0になるはずですから。

参考URL:http://www.net.is.uec.ac.jp/~ueno/material/kanji …
    • good
    • 0

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

補足日時:2003/04/25 17:25
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!