下载有中文字符的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对中文字符串,但返回的是相同的中文字符串

我不知道该如何解决这个问题。

下载有中文字符的HTML到Word

事实证明,虽然找到解决方案并不容易,但实际实现却相当简单。我们只是改变了这一行:

byte[] buffer = Encoding.UTF8.GetBytes( doc.ToString() );

:

byte[] buffer = Encoding.Unicode.GetPreamble()
    .Concat( Encoding.Unicode.GetBytes( doc.ToString() ) )
    .ToArray();

GetPreamble()方法将字节顺序标记添加到文件中,以便Word知道如何解释文件内容。它现在能够确定文件包含Unicode并正确解释标记,而不是将其显示在文档中。