Скачать HTML в Word с китайскими иероглифами - PullRequest
0 голосов
/ 26 июля 2011

В нашем приложении есть функция «Загрузить в 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 на Encoding.Unicode и Encoding.UTF32, но в обоих случаях Word заканчиваетсядо отображения всей разметки с нулем / пробелом между каждым символом (и китайские строки по-прежнему не отображаются правильно).

Я также пытался использовать Server.HtmlEncode для китайской строки, но это дает мнеобратно ту же строку китайских символов.

Я не знаю, как решить эту проблему.

1 Ответ

2 голосов
/ 28 июля 2011

Как оказалось, найти решение было нелегко, но фактическая реализация была довольно простой. Мы только что изменили эту строку:

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

К этому:

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

Метод GetPreamble () добавляет в файл метку порядка байтов, чтобы Word знал, как интерпретировать содержимое файла. Теперь он может определить, что файл содержит Unicode и правильно интерпретирует разметку, а не отображать ее в документе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...