我们的应用程序中有“下载到Word”功能。我们创建一个HTML文档并设置MIME类型以指示它是一个Word文档,而不是创建一个实际的二进制.doc文件。这是我们正在使用的方法的精简版本。
private FileContentResult ExportToWord( string htmlSource, string filename )
{
StringBuilder doc = new StringBuilder();
doc.Append( "<html><body>" );
doc.Append( htmlSource );
doc.Append( "</body></html>" );
byte[] buffer = Encoding.UTF8.GetBytes( doc.ToString() );
FileContentResult result = new FileContentResult( buffer, "application/msword" );
result.FileDownloadName = string.Format( "{0}.doc", filename );
return result;
}
在上面的示例中,htmlSource是文档的主体,因此它包含类似的内容:
<p>This is the first paragraph.</p>
在我们将htmlSource中引入Unicode字符之前,上述所有工作都可以正常工作。如果htmlSource包含
<p>这是一个测试</p>
然后在Word文档中我们得到
这是一个测试
我们已经尝试用Encoding.Unicode和Encoding.UTF32替换Encoding.UTF8,但在这两种情况下,Word最终显示所有标记,每个字符之间都有空/空格(并且中文字符串仍未正确显示)
我也尝试过针对中文字符串使用Server.HtmlEncode,但是这给了我相同的汉字字符串。
我对如何解决这个问题感到很茫然。
答案 0 :(得分:2)
事实证明,虽然找到解决方案并不容易,但实际实施却非常简单。我们刚改变了这一行:
byte[] buffer = Encoding.UTF8.GetBytes( doc.ToString() );
对此:
byte[] buffer = Encoding.Unicode.GetPreamble()
.Concat( Encoding.Unicode.GetBytes( doc.ToString() ) )
.ToArray();
GetPreamble()方法将字节顺序标记添加到文件中,以便Word知道如何解释文件内容。它现在能够确定该文件包含Unicode并正确解释标记而不是在文档中显示它。