Ian*_*oyd 7 c# encoding utf-8 utf-16 textwriter
我正在写文字给TextWriter.我希望UTF-16字节顺序标记(BOM)出现在输出中:
public void ProcessRequest(HttpContext context)
{
context.Response.ContentEncoding = new UnicodeEncoding(true, true);
WriteStuffToTextWriter(context.Response.Output);
}
Run Code Online (Sandbox Code Playgroud)
除了输出不包含字节顺序标记:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Thu, 06 Sep 2012 21:09:23 GMT
X-AspNet-Version: 4.0.30319
Content-Disposition: attachment; filename="Transactions_Calendar_20120906.csv"
Cache-Control: private
Content-Type: text/csv; filename="Transactions_Calendar_20120906.csv"; charset=utf-16BE
Content-Length: 95022
Connection: Close
JobName,ShiftName,6////09////2012 12::::00::::00 ??,...
Run Code Online (Sandbox Code Playgroud)
我如何告诉a TextWriter编写编码标记?
context.Response.ContentEncoding = new UnicodeEncoding(true, true);
Run Code Online (Sandbox Code Playgroud)
byteOrderMark
类型:true表示提供Unicode字节顺序标记; 否则,错误.System.Boolean
Ian*_*oyd 10
在某些时候,我意识到解决方案是多么简单.
我用认为该Unicode字节顺序标记是一些特殊的签名.我曾经认为我必须仔细决定我想输出哪个字节序列,以便输出正确的BOM:
但从那时起,我意识到字节Byte-Order-Mark 不是一些特殊的字节序列,你必须先添加到你的文件中.
BOM只是一个Unicode字符.你不输出任何字节; 你只输出字符U+FEFF.非常举动编写的性格,串行器将其转换为你使用任何编码为你.
选择角色U+feff(ZERO WIDTH NO-BREAK SPACE)是有充分理由的.它是一个空间,所以它没有任何意义,它是零宽度,所以你甚至不应该看到它.
这意味着我的问题从根本上是有缺陷的.没有"写一个字节顺序标记"这样的东西.你只需确保你写的第一个字符是U+FEFF.就我而言,我写的是TextWriter:
void WriteStuffToTextWriter(TextWriter writer)
{
String csvExport = GetExportAsCSV();
writer.Write("\xfeff"); //Output unicode charcter U+FEFF as a byte order marker
writer.Write(csvExport);
}
Run Code Online (Sandbox Code Playgroud)
在TextWriter将处理Unicode字符转换U+feff成任何字节编码,它已被配置为使用.
注意:任何代码都将发布到公共域中.无需归属.
| 归档时间: |
|
| 查看次数: |
5787 次 |
| 最近记录: |