質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

6921閲覧

C# WebClientでUTF-8のファイルをシフトJISにエンコードしてダウンロードする方法

GiveAHand

総合スコア286

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/04/25 09:24

C#でサーバーに置かれたCSVファイルをWindowsのローカルにダウンロードするプログラムを作成しています。

WebClientを使い、DownloadFileメソッドでダウンロードさせているのですが、UTF-8のファイルをシフトJISに変換してダウンロードする方法がわかりません。

DownloadFileメソッドの直前で、

// エンコード指定 wc.Encoding = Encoding.GetEncoding("shift_jis");

としても、うまくいきません。

なにかいい方法は無いものなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

以下のようにするといいと思います。
イメージとしては
byte[] -> string -> ファイル
です。

C#

1// バイナリを文字列に変換(UTF8 -> 文字列) 2string str = System.Text.Encoding.UTF8.GetString(bs, 0, bs.Length); 3 4// StreamWriter の作成 5System.IO.StreamWriter sw = new System.IO.StreamWriter(@"c:\test\test.txt", false, System.Text.Encoding.GetEncoding("shift_jis")); 6// ファイルへの書き込み(このとき文字列 -> Shift-JIS) 7sw.Write(str); 8// 後片付け 9sw.Close();

投稿2016/04/25 16:08

andooown

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GiveAHand

2016/04/25 23:16

andoown様 うまくいきました! ありがとうございました!!!
guest

0

こんにちは。

WebClient.EncodingメソッドはDownloadString系メソッドで使用されます。
https://msdn.microsoft.com/ja-jp/library/system.net.webclient.encoding(v=vs.110).aspx

DownloadFileメソッドは只のバイナリ保存だと思いますので、DowloadDataメソッドでバイナリ配列を取得してから明示的にエンコード設定をしたうえでテキストファイルの保存をしては如何でしょう。

投稿2016/04/25 09:33

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GiveAHand

2016/04/25 10:03

Tak1waさん、ありがとうございます。 理由はわかりました。 そして、DowloadDataでバイナリで取得も出来ました。 ただ、バイナリで取得したデータをシフトJIS指定で書き出す方法がわかりません。 byte[] bs = wc.DownloadData("ftp://xxx.co.jp/public_html/test/test.txt"); まずこのようにして、bsにバイナリデータとしてデータを取得して、bsにバイナリデータが格納されました。 その後、 System.IO.StreamWriter sw = new System.IO.StreamWriter( @"c:\test\test.txt", false, System.Text.Encoding.GetEncoding("shift_jis")); このように書いた後、 w.Write(System.Text.Encoding.GetEncoding(932).GetString().ToCharArray(), 0, sourceData.Length); これで、バイナリデータをcharに変換して保存しようとしましたが、作成されたファイルは空なんです。 System.IO.FileStream fs = new System.IO.FileStream( @"C:\test.txt", System.IO.FileMode.Create, System.IO.FileAccess.Write); //バイト型配列の内容をすべて書き込む fs.Write(bs, 0, bs.Length); このようにしてバイナリデータを直接書く方法もありますが、これは文字コードを指定する方法がわかりません。 こんな感じなのですが、後何がおかしいのでしょうか?
Tak1wa

2016/04/25 10:10 編集

fs.Closeメソッドまたは, fs.Flushメソッドは行っていますか?using句を用いることをお勧めします。(FileStreamでもStreamWriterでも同様です。)
GiveAHand

2016/04/25 23:18

fs.Closeは行っていました。 using区は、メモリ解放の忘れがなくなるからという事でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問