DOBON.NET DOBON.NETプログラミング掲示板過去ログ

文字コードを判別する

環境/言語:[Vista, C#2008, .NET Framework 3.5 など ]
分類:[.NET]

まだ、プログラミング初心者の雅階凡と申します。
文字コードの判定について考えていたのですが、

「.NET Tips」→「文字列、暗号化」→「文字列」→「文字コードを判別する」
 ( http://dobon.net/vb/dotnet/string/detectcode.html )

の記事を読んで大変参考にさせていただきました。感謝いたします。

そこで、質問なんですが、この記事内の、「Jcode.pmを参考にした方法」の C# のソースコード中にある GetCodeメソッド内の

 else if (len - 2 > i &&
      b1 == 0x8E && (b2 >= 0xA1 && b2 <= 0xFE) &&
      (byts[i + 2] >= 0xA1 && byts[i + 2] <= 0xFE))
 {
   euc += 3;
   i += 2;
 }

上記のコードの2行目にある b1 == 0x8E は euc-jp の補助漢字を判定するためなら b1 == 0x8F ではないかなと思っているのですがいかがでしょうか?まだプログラミングに自信がもてない私にお教えいただければ幸いです。

ちなみに、まだ一般に知られていない私のサイト内の「C#2008 文字コードの判定」

  ( http://www.geocities.jp/gakaibon/tips/csharp2008/charset-check.html )

でも参考にさせていただいたものを公開させていただきました。
雅階凡さんのご指摘は全くその通りで、間違えていました。ご連絡、ありがとうございました。早速修正させていただきます。

またこの記事の中で雅階凡さんの記事へのリンクをはらせて頂きたいと思っています。よろしくお願いいたします。
■No21303に返信(管理人さんの記事)

早速のご回答ありがとうございます。
お陰様で疑問が一つ減り、ホッとしているところでございます。

> またこの記事の中で雅階凡さんの記事へのリンクをはらせて頂きたいと思っています。よろしくお願いいたします。

こちらこそ、どうぞよろしくお願いします。

申し訳ないのですが、疑問な点がもう一点ございます。
こちらで質問させていただいてよいかどうか迷っていましたので、
不適切な質問だと思われましたら、どこかに誘導させていただければ幸いです。

「Jcode.pmを参考にした方法」の C# のソースコード中にある GetCodeメソッド内の

 if (((b1 >= 0x81 && b1 <= 0x9F) || (b1 >= 0xE0 && b1 <= 0xFC)) &&
   ((b2 >= 0x40 && b2 <= 0x7E) || (b2 >= 0x80 && b2 <= 0xFC)))
 {
   sjis += 2;
   i++;
 }
※インデントの仕方がわかりませんでしたので全角のスペースを使用しています。

上記のコードの1行目にある (b1 >= 0xE0 && b1 <= 0xFC) の部分は
shift_jis の漢字 1 バイト目の判定にご使用になられてると思います。

今回、私なりに文字コードを判定することを考えてみようと思い、参考にさせて頂いたサイトによっては、
この部分のコード範囲が異なっていたりしています。

0xE0〜0xFC と解説してあるサイトとしては、

 「文字コードの話」 ( http://euc.jp/i18n/charcode.ja.html )
 「Shift_JIS - Wikipedia」 ( http://ja.wikipedia.org/wiki/Shift_JIS )

0xE0〜0xEF と解説してあるサイトとしては、

 「日本語と文字コード」 ( http://www.kanzaki.com/docs/jcode.html#sjis )
 「■G-PROJECT■ -日本語文字コードの判別」 ( http://www.gprj.net/dev/tips/other/kanji.shtml )

等があります。

多分、私の勉強不足だとは思いますが、
このような違いがなぜ生じているのかが理解できていないのが私の現状です。

ご解説、他への誘導、もしくはお叱り等を頂ければ幸いに存じます。
(解決済みにしたほうがよいのかどうかも迷っています。)
私も分からないというのが正直なところです。私も文字判定を行うコードを幾つか見ましたが、色々な方法があり、まとめることができなかったので、単純にJcode.pmをそのまま使うということにしました。

無責任なようで心苦しいですが、雅階凡さんのように研究熱心な方がその成果をサイトで発表していただけると、非常に助かります。お役に立てず申し訳ありません。
■No21313に返信(管理人さんの記事)

返信ありがとうございます。

今の段階では、これ以上のことを調べるのは私にとっては難しいのかなと感じておりますが、
もし分かった場合にはどこかで公表したいと思います。

ということで、ここでは解決済みにチェックさせて頂きます。

お付き合いをして頂きましてありがとうございました。
解決済み!
Shift_JIS の 1 バイト目 0xF0-0xFC は、使用できるけど文字が未定義な領域です。いわゆる外字領域ですね。
■No21316に返信(Hongliangさんの記事)

ご親切に、教えて頂きましてありがとうございます。
これで私の頭の中もスッキリしました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板