下载有中文字符的HTML到Word
本文关键字:Word HTML 有中文 字符 下载 | 更新日期: 2023-09-27 18:03:41
我们的应用程序中有一个"下载到Word"的功能。我们不是创建一个实际的二进制.doc文件,而是创建一个HTML文档,并设置MIME类型以表明它是一个Word文档。下面是我们正在使用的方法的精简版本。
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>
在我们将Unicode字符引入htmlSource之前,上述所有工作都很好。如果htmlSource包含
<p>这是一个测试</p>
那么在Word文档中我们得到
这是一个测试
我们已经尝试替换Encoding。带编码的UTF8。Unicode和编码。但在这两种情况下,Word最终都会显示每个字符之间带有空/空格的所有标记(并且中文字符串仍然无法正确显示)。
我也试过使用服务器。htmlcode对中文字符串,但返回的是相同的中文字符串
我不知道该如何解决这个问题。
事实证明,虽然找到解决方案并不容易,但实际实现却相当简单。我们只是改变了这一行:
byte[] buffer = Encoding.UTF8.GetBytes( doc.ToString() );
:
byte[] buffer = Encoding.Unicode.GetPreamble()
.Concat( Encoding.Unicode.GetBytes( doc.ToString() ) )
.ToArray();
GetPreamble()方法将字节顺序标记添加到文件中,以便Word知道如何解释文件内容。它现在能够确定文件包含Unicode并正确解释标记,而不是将其显示在文档中。