目次
はじめに
C#で.thd
ファイルを.csv
ファイルに変換するプログラムを作っていたとき、
出力されたCSVファイルに含まれる「カタカナ・ひらがな・漢字」がすべて文字化けして困りました。
今回はその原因と、文字化けを防ぐエンコーディング指定の方法を勉強したので備忘録としてまとめます。
私の環境
- OS:Windows 10 Pro
- バージョン:20H2
- 開発言語:C#
- 出力ファイル:CSV形式(.csv)
結論:Encoding
を明示的に指定する
文字化けの原因は、エンコーディング(文字コード)の不一致でした。StreamWriter
で出力時に適切なエンコーディングを指定していなかったのが問題です。
実装例:Shift_JISでエンコーディング指定
以下のように、読み込み(StreamReader
)と書き出し(StreamWriter
)の両方でエンコーディングを指定することで文字化けは防げました。
// .thdファイルの読み込み(Shift_JISで指定)
StreamReader reader = new StreamReader("input.thd", Encoding.GetEncoding("Shift_JIS"));
// .csvファイルへの書き出し(Shift_JISで指定)
StreamWriter writer = new StreamWriter("output.csv", false, Encoding.GetEncoding("Shift_JIS"));
注意点:StreamWriter
側の指定を忘れがち
私の場合、読み込み側(StreamReader
)ばかり気にしていて、
出力側(StreamWriter
)のエンコーディングをデフォルトのままにしていたことが原因でした。
その結果、日本語の部分だけがすべて「??」や意味不明な記号になってしまうというトラブルに見舞われました。
他のエンコーディング例(環境によっては変更)
もしShift_JIS
でうまくいかない場合は、以下のようなエンコーディングも試す価値があります:
Encoding.UTF8
(BOM付き or なしに注意)Encoding.GetEncoding("EUC-JP")
(一部のレガシー環境で使用)Encoding.Default
(OS依存だが安定)
まとめ
.thd
ファイルなど、日本語が含まれるテキストファイルをCSVに出力する際は、StreamWriter
とStreamReader
の両方で文字コード(Encoding)を明示的に指定することが重要です。
ポイント:
- 日本語の文字化けはエンコーディングミスが原因
- C#では
Encoding.GetEncoding("Shift_JIS")
がWindowsと相性が良い - 書き込み側の
StreamWriter
にもエンコーディングを忘れずに設定
地味な部分ですが、文字化けは一度ハマると面倒なので、最初から設定しておくと安心です。