ページ 11

jisからshiftjisに変換

Posted: 2014年7月21日(月) 23:28
by あかり
いつもお世話になっています。
char配列に入っているjisコードをshift-jisに変換するプログラムをC++で作成しているのですが、うまくいきません。
http://www.tohoho-web.com/wwwkanji.htm
のプログラムを使わせていただいたのですが、変換が失敗する文字があります。

コード:

if (sjis[i] % 2) {
sjis[i] = ((sjis[i] + 1) / 2) + 0x70;
sjis[i + 1] = sjis[i + 1] + 0x1f;
}
else {
sjis[i] = (sjis[i] / 2) + 0x70;
sjis[i + 1] = sjis[i + 1] + 0x7e;
}
if (sjis[i] >= 0xa0) { sjis[i] = sjis[i] + 0x40; }
if (sjis[i + 1] >= 0x7f) { sjis[i + 1] += 1; }
今確認している変換ミスする文字は
jis 「寺」 0x3B7B → shift-jis 「字」 0x8E9A
jis 「事」 0x3B76 → shift-jis 「歯」 0x8E95
どうすればいいでしょうか?よろしくお願いします。

Re: jisからshiftjisに変換

Posted: 2014年7月21日(月) 23:47
by みけCAT
あかり さんが書きました:

コード:

sjis[i + 1] = sjis[i + 1] + 0x7e;
ここに相当する部分で、リンク先では0x7eではなく0x7dを足しているように見えます。

Re: jisからshiftjisに変換

Posted: 2014年7月21日(月) 23:54
by あかり

コード:

sjis[i + 1] = sjis[i + 1] + 0x7e;

コード:

sjis[i + 1] = sjis[i + 1] + 0x7d;
で実行すると「寺」などの文字はミスしたまま、ほかの文字が変換ミスするため変更しました。
コード表を見ると1ずれてしまっています。

Re: jisからshiftjisに変換

Posted: 2014年7月22日(火) 03:08
by かずま
sjis が char だと、それが 0xa0 の場合、値は負になり、
if (sjis >= 0xa0) は常に偽です。
次のよう、unsigned char にキャストすれば正しくなります。

コード:

if (sjis[i] % 2) {
    sjis[i] = ((sjis[i] + 1) / 2) + 0x70;
    sjis[i + 1] = sjis[i + 1] + 0x1f;
}
else {
    sjis[i] = (sjis[i] / 2) + 0x70;
    sjis[i + 1] = sjis[i + 1] + 0x7d;
}
if ((unsigned char)sjis[i] >= 0xa0) { sjis[i] = sjis[i] + 0x40; }
if ((unsigned char)sjis[i + 1] >= 0x7f) { sjis[i + 1] += 1; }
しかし、割り算を使うなんて嫌なので、私なら次のようにします。

コード:

	sjis[i+1] += sjis[i] & 1 ? sjis[i+1] < 0x60 ? 0x1f : 0x20 : 0x7e;
	sjis[i] = sjis[i]+0x21 >> 1 ^ 0xa0;

Re: jisからshiftjisに変換

Posted: 2014年7月22日(火) 20:49
by あかり
みけCATさん、かずまさん
返信、ありがとうございます。
unsignedを使っていない初歩的なミスでした、すいません。
かずまさんが上げていたコードがシンプルなので、そちらを使っていこうかと思います。
ありがとうございました。

Re: jisからshiftjisに変換

Posted: 2014年10月27日(月) 15:12
by Alex
あかり さんが書きました:みけCATさん、かずまさん
返信、ありがとうございます。
unsignedを使っていない初歩的なミスでした、すいません。
かずまさんが上げていたコードがシンプルなので、そちらを使っていこうかと思います。
ありがとうございました。

変換のプログラムコードを提供できますか。