- ベストアンサー
機種依存文字をチェックするメソッドの問題箇所とは?
- 質問者は機種依存文字をチェックするメソッドを作成しましたが、一部の特殊文字や表にある文字を正しくチェックできない問題が発生しています。
- 質問者はC#のShift_JISエンコーディングを使って機種依存文字をチェックするメソッドを作成しましたが、半角カナや特殊文字、縦書き文字、外字のチェックに問題があります。
- 質問者は作成したメソッドの中で、特定のUnicodeコード範囲(半角カナ、特殊文字、縦書き文字、外字)をチェックしていますが、一部の文字が正しく検出できない問題があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No4です。 16進数はC#他多くの言語で「0x」を頭につけて表記します。 https://ja.wikipedia.org/wiki/%E5%8D%81%E5%85%AD%E9%80%B2%E6%B3%95#.E8.A1.A8.E8.A8.98.E6.96.B9.E6.B3.95 256を掛けて足すというのは、 int charCode = 0; foreach (byte item in bytes) { charCode *= 256; charCode += byte; } ということです。(多分動くつもりですが未チェック)
その他の回答 (4)
- SortaNerd
- ベストアンサー率43% (1185/2748)
それは正しい動作です。 「≒」は、Shift_JISでは機種依存文字とそうでない文字の2種類がありますが、現在のPCは機種依存文字の方を使うことはできません。 機種依存文字の方を使おうとしても、Unicodeでは同じ文字なので、普通の文字の方に直されてしまいます。 問題点としては、すでに指摘があるように、これはShift_JISに含まれない文字をチェックできません。 Encoding.EncoderFallbackでたぶん設定できます。 他に気になる点がいくつかあります。 ・半角カナはA0~FFでなくA0~DFです。 ・2バイトを数値に変換する部分ですが、これでは下位バイトが0F以下のとき正しい数値になりません。ただしShift_JISコードを扱う限りは問題ありません。 ・そもそも文字に直して数字に戻すのは無駄が多いので256を掛けて足せばいいでしょう。 ・文字コードを10進数で書いてわかりづらくないですか? ・「外字」の部分の数値が「縦文字」と同じになっています。 ・またそもそもこの2つは隣接しているので1つの範囲にしたほうが楽でしょう。
- wormhole
- ベストアンサー率28% (1626/5665)
わざわざShift_JISのバイト配列に直す必要ないのでは? 日本語の文字セットに含まれていない文字があった場合どうなるのかわかります?
- pringlez
- ベストアンサー率36% (598/1630)
あなたが何をどうしたいのかイマイチ分かりませんし、何がどう問題なのか具体的には分かりません。ただ「≒とか、表にあるのにうまくチェック出来ない」といっているあたりから、おそらくは「機種依存文字」の理解が間違っているもしくはあなたの文字認識が不正確というオチなだけの気がします。 まず「≒」に見える文字でも「8790」と「81E0」にあります。見た目が同じなら何でもいいわけではありません。どちらをチェックしたのでしょうか? 「8790」ならば「特殊文字(8540~889E)を含むか」のチェックで引っかかると思いますが、「81E0」ならばスルーするでしょうし。 どちらなのか自分でも分からないというのであれば、まずは自分が何をチェックしようとしているのかきちんと把握するところから始めましょう。
お礼
ありがとうございます。 8790のほうを入力していたみたいです。
- Tacosan
- ベストアンサー率23% (3656/15482)
例えば「≒」を入れたときに ・プログラムがどう動作するのか ・各変数の値はどのように変化していくのか を書いてみてください.
お礼
すみません、 >そもそも文字に直して数字に戻すのは無駄が多いので256を掛けて足せばいいでしょう これについても掘り下げて教えていただけないでしょうか。
補足
ありがとうございます。 shift_jisに含まれないものは置換フォールバックをし、NGにしました。 >文字コードを10進数で書いてわかりづらくないですか? これなのですが、16進数のままチェックできるものでしょうか? ご教授いただければ幸いです。