« Java の後継? 新言語 Scala | トップページ | [.NET] Tuple は、 配列じゃないのよ~ »

2009年11月 9日 (月)

[.NET] UNICODE のファイルを Shift_JIS として読み込んだら、 当然文字化け …しないこともある (@@;

いやぁ、 驚いた。 f(^^;

テキストファイルの文字エンコーディングを Shift JIS から UTF-16 に変えたので、 そのファイルを Shift_JIS として読み込んでいる部分のユニットテストは、 当然コケるはず… と、 確認のためにテストを流したら。 通っちゃったんですねぇ。
※ 「ユニットテストがコケてないなら、 コードを修正するべからず。 ( リファクタリングは別 )」 って TDD の原則から、 引数から GetEncoding("Shift_JIS") を削らなきゃいけないハズと分かっていても、 ユニットテストを流してみるんです。 原則通りにやってると、 たまにこういうことに遭遇します。

あんまり驚いたので、 MSDN ライブラリに追記しときました。 f(^^;

MSDN ライブラリ: ReadAllLines メソッド (String, Encoding)

ファイルを開き、指定したエンコーディングが適用されたファイルのすべての行を読み取った後、ファイルを閉じます。

Community Content
BOM 付き UNICODE のファイルの場合には encoding パラメーターは無視されます

解説に、 「バイト順マークの存在に基づいて、ファイルのエンコーディングを自動的に検出することを試みます」 とあり、 検出対象として UTF-8 と UTF-32 が挙げられていますが、 UTF-16 でも BOM が付いていれば正しくエンコーディングが自動検出されるようです。 ( VS2008SP1@VistaSP2 で確認 )

この機能により、 自動検出に成功した場合は、 第2引数に指定した encoding は無視されることになります。
たとえば、 UTF-16 で書き出されたファイルを、 encoding に Shift_JIS を指定して File.ReadAllLines メソッドで読み込ませると、 直観的な予想に反して文字化けは起きません。


# え? それでどうしたかって? もちろん! TDD から外れて、 第2引数を削除しましたよ。

|

« Java の後継? 新言語 Scala | トップページ | [.NET] Tuple は、 配列じゃないのよ~ »

プログラミング」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [.NET] UNICODE のファイルを Shift_JIS として読み込んだら、 当然文字化け …しないこともある (@@;:

« Java の後継? 新言語 Scala | トップページ | [.NET] Tuple は、 配列じゃないのよ~ »