以下のような関数で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だと思います。
No.1
- 回答日時:
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;
}
No.2
- 回答日時:
この表をみると、偶数側の分岐は
if (*code1 <= 0x6F)
でないといけないような気がしますけど。
0xDEも0xDFの半分にすれば両方とも0x6Fですけど、片方は0x9F、もう一方は0xE0になるはずですから。
参考URL:http://www.net.is.uec.ac.jp/~ueno/material/kanji …
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;
}
分岐は、1ビット落ちる前の「DF」で判定し、その後1ビット落として処理をすると上手く行きました!!
回答、ありがとうございました!
m(__)m
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で分岐するのも一つの方法ですが、この方法も間違いとは言えません。
具体的な説明、ありがとうございます。
たしかにその通りです。
偶数の判定文が間違っているだけのようです。
この方法で修正したいと思います。
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP $_SESSIONについて教えて下さい。 4 2023/03/13 13:45
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) ローマ字、ハイフン付きの並び替え ローマ字抽出方法 Excelマクロ 4 2022/04/01 14:10
- Visual Basic(VBA) CODE関数のvbaバージョンか方法はありますか? 5 2022/09/01 17:00
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- その他(プログラミング・Web制作) visual studio code 共有方法 1 2022/04/06 17:55
- JavaScript jQueryローディングアニメーションのコードの以下のURL内参考サイトで提示されている 3 2023/07/03 18:29
- その他(プログラミング・Web制作) vscodeエラー 1 2022/05/01 21:01
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
switch の範囲指定
-
【Excel】特定の文字を含むセル...
-
Do~Loopした回数をカウントしたい
-
VBの質問#if 0 then ってどう...
-
EXCEL VBA マクロ 実行する度に...
-
DoEventsがやはり分からない
-
メルカリのメルカードで買い物...
-
インタラクティブの反対語は?
-
リョウ・・・量?料?
-
2重のDo~Loopは?
-
VB.NET Excelを読み込んでDataT...
-
FFTの結果ついて
-
タッチパッドはチャタリングは...
-
C# 画面のちらつきを解消したい
-
セルの値が0はクリアするマクロ
-
VBA SaveChanges 上書きされない
-
UMLでの例外処理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
メルカリのメルカードで買い物...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
【Excel】特定の文字を含むセル...
-
EXCEL VBA マクロ 実行する度に...
-
switch の範囲指定
-
DoEventsがやはり分からない
-
VBの質問#if 0 then ってどう...
-
UMLでの例外処理
-
Do~Loopした回数をカウントしたい
-
VB.NET Excelを読み込んでDataT...
-
月度は何て読みますか?
-
findは動くがfindnextがマクロ...
-
リョウ・・・量?料?
-
iD
-
VBA SaveChanges 上書きされない
-
Select Case文でこのようなこと...
-
Loadイベント中にほかのイベン...
-
セルの値が0はクリアするマクロ
おすすめ情報