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

File.WriteAllTextメソッドでのエンコード

環境/言語:[WinXP/C#3.5]
分類:[.NET]

現在File.WriteAllTextメソッドを使用してテキストファイルに書き込みをしているのですが、エンコーディングが自動でShift-JISになってしまいます。
本当はUTF-8(BOM無し)で保存したいのですが、文字コードを指定しなければUTF-8(BOM無し)で保存されると思っていました。
何とかUTF-8(BOM無し)で保存したいのですが、何かアドバイス等あればご教示願います。


----------以下コード----------
class test
{
 public static void Main()
 {
  System.IO.File.WriteAllText(@"C:\test.txt", "test");
 }
}
WriteAllText には、Encoding オブジェクトを渡せるオーバーロードもありますが。

UTF-8 で保存されていないというのはどうやって確認されましたか?
書き込む文字列が "test" では Shift_JIS と区別がつかないと思いますが。
返信ありがとうございます。


> WriteAllText には、Encoding オブジェクトを渡せるオーバーロードもありますが。
この場合UTF-8(BOM付)となってしまいます。

> UTF-8 で保存されていないというのはどうやって確認されましたか?
> 書き込む文字列が "test" では Shift_JIS と区別がつかないと思いますが。
文字コードを判別するフリーソフトを使用しました。
上記のUTF-8(BOM付)の判定ができるので問題ないと思っていましたが、書き出す内容に問題はあるのでしょうか。
2010/11/29(Mon) 16:46:51 編集(投稿者)

>>WriteAllText には、Encoding オブジェクトを渡せるオーバーロードもありますが。
> この場合UTF-8(BOM付)となってしまいます。
Encoding.UTF8 を使うのではなく、UTF8Encoding を new して使います。new する際の引数で BOM の有無を指定できます。

> 上記のUTF-8(BOM付)の判定ができるので問題ないと思っていましたが、書き出す内容に問題はあるのでしょうか。
test
は、UTF-8 でも Shift_JIS でも全く同じ、0x74 0x65 0x73 0x74 で表現されます。
// いわゆる ASCII 文字の範囲が同じバイナリに割り当てられます。
全く同じなので、この 4 バイトが記述されただけのファイルは、使用されているエンコーディングが UTF-8 なのか Shift_JIS なのか(あるいは ASCII なのか EUC-JP なのか)を区別することはできません。
そのフリーソフトとやらは、UTF-8 の BOM があったから UTF-8 であると判定しただけではないでしょうか? そして区別できない場合、既定で Shift_JIS であると表示しているのではないでしょうか。
BOM 無しのものを正しく判定させたいのなら、十分な長さの日本語文字列を与えるなどする必要があります。
>Encoding.UTF8 を使うのではなく、UTF8Encoding を new して使います。new する際の引数で BOM の有無を指定できます。
そもそも UTF8Encoding というクラスがあること事態知りませんでした。
少し弄ってみます。

> test
> は、UTF-8 でも Shift_JIS でも全く同じ、0x74 0x65 0x73 0x74 で表現されます。
> // いわゆる ASCII 文字の範囲が同じバイナリに割り当てられます。
> 全く同じなので、この 4 バイトが記述されただけのファイルは、使用されているエンコーディングが UTF-8 なのか Shift_JIS なのか(あるいは ASCII なのか EUC-JP なのか)を区別することはできません。
> そのフリーソフトとやらは、UTF-8 の BOM があったから UTF-8 であると判定しただけではないでしょうか? そして区別できない場合、既定で Shift_JIS であると表示しているのではないでしょうか。
> BOM 無しのものを正しく判定させたいのなら、十分な長さの日本語文字列を与えるなどする必要があります。
日本語文字列を加えて保存しなおすとUTF-8のBOM無しと判定しました。
Hongliangさんの仰るとおり、ただ判定できていなかっただけですね。
もっと勉強してから質問するべきでした^^;

色々とありがとうございました。
解決済み!

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