C#.NETで、(Windows-31Jではなく)Shift_JISでエンコードされた文字列を処理したいのですが、.NET Frameworkでサポートしているエンコーディング一覧の中に(Windows-31Jではない)Shift_JISが無いようです。(Encodingクラスの解説で確認)
.NET FrameworkではShift_JISを使えないのでしょうか?
使える・使えないの定義がわかりませんが、Shift_JISを表すEncodingクラスの派生クラスインスタンスは以下で取得できます。
Encoding e = Encoding.GetEncoding("Shift_JIS");
これを文字列処理のメソッドに対して受け渡すことで、例えばShift_JISで保存されたテキストファイルの文字列を読み取ることなどは問題なくできるはずです。
Encoding クラスの解説というのは、↓みたいなやつですよね。
http://msdn.microsoft.com/ja-jp/library/system.text.encoding%28v=vs.80%29.aspx
http://msdn.microsoft.com/en-us/library/dd317756%28v=vs.85%29.aspx
↑のページだと、.NET Name がつけられてないのも載ってますが、IANA で言うところの Shift_JIS に相当するコードページがありません。
Windows の API だと、I18N の実装は、IANA の charcter sets で定められている character set ではなく、
code page をベースにしているので、該当する CP が無い以上、使えないでしょうね。
「どんなときに困るかなあ」と想像しながら書いてたんですけど、
Windows 以外のシステムにデータを渡すときに困る、という話でしょうか?
選択の余地があるなら、Unicode 系を使うか、相手に Windows-31J を使ってもらうしか
無いような気がします。
# あまり、答えになって無くてごめんなさい
Encoding クラスの解説というのは、↓みたいなやつですよね。
それです。
どんなときに困るかなあ
具体的には、以下のようにデコード時にShift_JISとして不正なコードは特別な処理をしようとしています。
文字コードは既に仕様でShift_JISと決まっているので、今更変えられないんですよね…。(今時そんなもの使うなよと思いますが)
Encoding shiftJIS = Encoding.GetEncoding("(Windows-31Jではない)Shift_JIS", new EncoderReplacementFallback("?"), new DecoderReplacementFallback("\uFFFD")); byte[] bytes = { 0x87, 0x40 }; // '①' char[] chars = shiftJIS.GetChars(bytes); // ↑U+2460ではなくU+FFFDとなることを期待
大事なことなので2度言いました。