将HTML下载到带有中文字符的Word

时间:2011-07-26 17:07:50

标签: c# asp.net-mvc-3 character-encoding

我们的应用程序中有“下载到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,但是这给了我相同的汉字字符串。

我对如何解决这个问题感到很茫然。

1 个答案:

答案 0 :(得分:2)

事实证明,虽然找到解决方案并不容易,但实际实施却非常简单。我们刚改变了这一行:

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

对此:

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

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