jisからshiftjisに変換

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あかり

jisからshiftjisに変換

#1

投稿記事 by あかり » 11年前

いつもお世話になっています。
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
どうすればいいでしょうか?よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: jisからshiftjisに変換

#2

投稿記事 by みけCAT » 11年前

あかり さんが書きました:

コード:

sjis[i + 1] = sjis[i + 1] + 0x7e;
ここに相当する部分で、リンク先では0x7eではなく0x7dを足しているように見えます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あかり

Re: jisからshiftjisに変換

#3

投稿記事 by あかり » 11年前

コード:

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

コード:

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

かずま

Re: jisからshiftjisに変換

#4

投稿記事 by かずま » 11年前

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に変換

#5

投稿記事 by あかり » 11年前

みけCATさん、かずまさん
返信、ありがとうございます。
unsignedを使っていない初歩的なミスでした、すいません。
かずまさんが上げていたコードがシンプルなので、そちらを使っていこうかと思います。
ありがとうございました。

Alex

Re: jisからshiftjisに変換

#6

投稿記事 by Alex » 10年前

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る