UTF-8がBOM付いたり付かなかったりして切り替えるのに戸惑ったので備忘録として保存しておきます。
log4netのインストール方法~最低限動かす方法については以下の記事に手順を記載しています。
目次
規定の文字コード
初期設定はsjis
<Encoding value="shift_jis" />
この文言で明示的に文字コードをshiftjisに指定することもできます。
UTF-8でログを出力する
UTF-8でログファイルを出力したいのであればconfig中appenderの下に以下の記述を追加します。
<Encoding type="System.Text.UTF8Encoding" />
UTF-8(BOM付)でログを出力する
UTF-8(BOM付)でログファイルを出力したいならconfig中appenderの下に以下の記述を追加します。
<Encoding value="utf-8" />
typeとvalueの違いは何か
同じEncodingでもtypeとvalueでなんか動きが変わることは分かったけど、他の文字コードにするには一体何を入れたらいいの?
type指定
<Encoding type="///A///" />
「///A///」の部分にはSystem.Text.Encodingの派生クラス名を入力します。
上のUTF8(BOMなし)のコードでは「System.Text.UTF8Encoding」をtypeの値として設定しました。
System.Text.ASCIIEncoding | ASCII |
System.Text.UnicodeEncoding | Unicode(UTF-16) |
System.Text.UTF32Encoding | UTF-32 |
System.Text.UTF7Encoding | UTF-7 |
System.Text.UTF8Encoding | UTF-8 |
value指定
<Encoding value="///B///" />
「///B///」の部分にはSystem.Text.Encodingのエンコード表の中の「Name」を入力します。
上のUTF8(BOMつき)のコードでは「utf-8」をtypeの値として設定しました。
shift_jis | Japanese (Shift-JIS) |
x-mac-japanese | Japanese (Mac) |
IBM290 | IBM EBCDIC (Japanese katakana) |
EUC-JP | Japanese (JIS 0208-1990 and 0212-1990) |
iso-2022-jp | Japanese (JIS) |
csISO2022JP | Japanese (JIS-Allow 1 byte Kana) |
iso-2022-jp | Japanese (JIS-Allow 1 byte Kana – SO/SI) |
euc-jp | Japanese (EUC) |
utf-7 | Unicode (UTF-7) |
utf-8 | Unicode (UTF-8) |
上記サイトから日本語で使いそうなものを抽出しました。使いたい文字コードはこの中にあるでしょうか?
指定方法によってBOMが付いたり付かなかったり結果が変わるのは何故?
ズバリ、「初期設定値の違い」です。
以下の記事でEncodingクラスでUnicode体系を指定した場合に初期設定でBOMが付いているか付いていないかを検証しているので興味のある方はご覧ください。
BOMとかBEとか設定ファイルで指定できないの?
現在、log4netの設定ファイルに明示的に引数としてEncodingクラスの引数を渡す方法は見つかっていません。
(以下の記事に書いたように色々実験しましたが、上手くいかず…)