BOMでEncodingを使用してC#でgetBytes()を取得する方法は?
-
08-10-2019 - |
質問
C#でASP.NET MVC 2アプリケーションでUTF8エンコードに問題があります。文字列から簡単なテキストファイルをユーザーにダウンロードさせようとしています。次の行でバイト配列を取得しようとしています。
var x = Encoding.UTF8.GetBytes(csvString);
しかし、私がダウンロードのためにそれを返すとき:
return File(x, ..., ...);
BOMがないファイルを取得するので、クロアチアのキャラクターが正しく表示されません。これは、私のバイト配列にエンコード後のBOMが含まれていないためです。私はそれらのバイトを手動で挿入し、それが正しく表示されますが、それはそれを行うための最良の方法ではありません。
また、UTF8ENCODINGクラスインスタンスを作成し、BOMを含むコンストラクターにブール値(TRUE)を渡すことも試みましたが、機能しません。
誰かが解決策を持っていますか?ありがとう!
解決
このように試してみてください:
public ActionResult Download()
{
var data = Encoding.UTF8.GetBytes("some data");
var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
return File(result, "application/csv", "foo.csv");
}
その理由は、ブールパラメーターを取るUTF8ENCODINGコンストラクターが、あなたが期待することをしないためです。
byte[] bytes = new UTF8Encoding(true).GetBytes("a");
結果の配列には、97の値の単一バイトが含まれます。UTF8はBOMを必要としないため、BOMはありません。
他のヒント
エンコード内の文字列をバイト配列の表現に変換するための簡単な拡張機能を作成しました。
public static class StreamExtensions
{
public static byte[] ToBytes(this string value, Encoding encoding)
{
using (var stream = new MemoryStream())
using (var sw = new StreamWriter(stream, encoding))
{
sw.Write(value);
sw.Flush();
return stream.ToArray();
}
}
}
使用法:
stringValue.ToBytes(Encoding.UTF8)
これは、BOMを必要とするUTF-16のような他のエンコーディングでも機能します。
UTF-8は、1バイトの単語のシーケンスであるため、BOMを必要としません。 UTF-8 = UTF-8BE = UTF-8LE。
対照的に、UTF-16はUTF-16が2バイトの単語のシーケンスであり、BOMが識別しているため、Streamの開始時にBOMがStreamの開始時にUTF-16BEまたはUTF-16LEであるかを識別する必要があります。言葉のバイトはbeまたはleです。
問題はにありません Encoding.UTF8
クラス。問題は、ファイルを表示するために使用しているプログラムにあります。
.NET文字列はすべてUnicodeであり、メモリにとどまることを忘れないでください。そのため、デバッガーでCSVStringを正しく見ることができれば、問題はファイルを書いています。
私の意見では、あなたは返すべきです FileResult
ファイルと同じエンコードで。返信ファイルエンコードを設定してみてください。