ASP.NETでエクスポートしたデータをUTF-8符号化で記憶する

4055 ワード

Response.Charset = "UTF-8";
            Response.ContentEncoding = Encoding.UTF8;
            Response.AppendHeader($"Content-Disposition", "attachment;filename=coupons.xls");
            //Response.AppendHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode("coupons.xls", System.Text.Encoding.UTF8) + "\"");
            Response.ContentType = "application/ms-excel";
 
...
 
 
////          UTF-8    ,      UTF-8 BOM    
            byte[] buffer = Encoding.UTF8.GetBytes(result.ToString());
            byte[] outBuffer = new byte[buffer.Length + 3];
            outBuffer[0] = (byte)0xEF;
            outBuffer[1] = (byte)0xBB;
            outBuffer[2] = (byte)0xBF;
            Array.Copy(buffer, 0, outBuffer, 3, buffer.Length);
            Response.Write(Encoding.UTF8.GetString(outBuffer));
 
            //Response.Write(result);
 
 
            Response.Flush();
            Response.End();

 
BOMはUTF符号化方式で符号化を識別するための標準タグであり、UTF-16ではFFFE、UTF-8ではEF BB BFである.このタグはオプションであり、UTF-8には順序がないため、バイトストリームがUTF-8符号化されているかどうかを検出するために使用することができる.マイクロソフトはこのような検査をしていますが、一部のソフトウェアはこのような検査をしないで、正常な文字として処理しています.マイクロソフトは自分のUTF-8形式のテキストファイルの前にEF BB BFの3バイトを加えて、windowsの上のnotepadなどのプログラムはこの3バイトに基づいて1つのテキストファイルがASCIIのかUTF-8のかを確定しますが、これはマイクロソフトがひそかに作ったマークにすぎません.他のプラットフォームではUTF-8のテキストファイルにこのようなマークはしていません.類UnixシステムではBOMは使用していません.既存のASCIIファイルの構文規則を破壊するためです.つまり、UTF-8ファイルにBOMがあるかもしれないし、BOMがないかもしれないが、どうやって区別するのか.3つの方法:1、UltraEdit-32でファイルを開き、16進編集モードに切り替え、ファイルヘッダにEF BB BFがあるかどうかを確認する.2、Dreamweaverで開いて、ページの属性を見て、「Unicode署名BOMを含む」の前にチェックがあるかどうかを見ます.3、Windowsのメモ帳で開き、「名前を付けて保存」を選択し、ファイルのデフォルトコードがUTF-8かANSIかを見て、ANSIであればBOMを持たない.いわゆるunicodeが保存するファイルは実際にはutf-16であり、ちょうどunicodeのコードと同じにすぎないが、概念的にunicodeとutfは別物であり、unicodeはメモリ符号化表現スキームであり、utfはunicodeをどのように保存し伝送するかのスキームである.utf-16はまた、上位(LE)と上位(BE)の2種類に分けられる.公式のutfコードにはutf-32もあり、LEとBEも分かれている.非unicode公式のutf符号化にはutf-7もあり、主にメール伝送に用いられる.utf-8のシングルバイト部分はiso-8859-1と互換性があり、これは主にいくつかの古いシステムとライブラリ関数がutf-16を正しく処理できない問題を解決するためであり、英語文字にとっても保存されたファイル空間(非英語文字の浪費空間を代価とする)を節約するためである.iso-8859-1の場合、utf 8とiso-8859-1はいずれも1バイトで表され、他の文字を表す場合、utf-8は2バイトまたは3バイトで表される.
参照先:http://www.cnblogs.com/landywzx/archive/2012/12/28/2836901.html