Какой набор символов мне нужен, чтобы правильно кодировать японский в CSV, чтобы открыть в Excel? - PullRequest
4 голосов
/ 14 ноября 2011

Мое приложение asp.net должно экспортировать набор данных в виде файла CSV для открытия в Excel. Набор данных содержит японские символы кандзи двойной ширины в дополнение к английским символам.

Я пробовал несколько различных комбинаций заголовков, наборов символов и кодировки содержимого, но мне не удалось найти правильную комбинацию, которая позволяет Excel открывать файл и правильно отображать японские символы.

Если, однако, я открою файл в Блокноте, а затем сохраню его в кодировке UTF-8, я смогу открыть файл в Excel и увидеть японские символы, как и предполагалось. Поэтому это должно быть возможно, но я не могу найти правильную комбинацию заголовков, чтобы она работала без открытия и сохранения экспортированного файла в Блокноте.

Private Sub TestCSV()

    Dim context As HttpContext = HttpContext.Current

    context.Response.Clear()
    context.Response.ClearHeaders()
    context.Response.ClearContent()
    context.Response.Cache.SetCacheability(HttpCacheability.NoCache)
    context.Response.AddHeader("Content-Disposition", "attachment; filename=test.csv")
    context.Response.ContentType = "text/csv"        
    context.Response.Charset = Encoding.UTF8.WebName

    context.Response.Write("English,Japanese")
    context.Response.Write(Environment.NewLine)
    context.Response.Write("Test,日本語")

    context.Response.End()

End Sub

Любая помощь в получении этого кода будет принята с благодарностью.

Я также пытался использовать следующие строки кодов в различных комбинациях и порядках, но ничего не получалось.

    context.Response.BinaryWrite(Encoding.UTF8.GetPreamble())
    context.Response.BinaryWrite(Encoding.GetEncoding("utf-16le").GetPreamble())
    context.Response.Charset = Encoding.GetEncoding("utf-16le").WebName
    context.Response.AddHeader("Content-Type", "text/csv; charset=utf-16")
    context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250")

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 апреля 2013
/// <summary>
/// method to export report into excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void linkProcess_Click(object sender, EventArgs e)
{
    Response.ClearContent();
    Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.xls", "YTDReviewsData"));
    Response.ContentType = "application/ms-excel";
    Response.ContentEncoding = System.Text.Encoding.Unicode;
    Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble());      
    System.IO.StringWriter stringWrite = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
    gvDealDetails.RenderControl(htmlWrite);
    Response.Write(stringWrite.ToString());
    Response.End();
}
0 голосов
/ 15 ноября 2011

Понял!Я добавил некоторые другие языки и символы только для того, чтобы удостовериться вдвойне.

Ключ был в том, чтобы установить кодировку в заголовке, кодировку содержимого и для преамбулы в UTF-8.*

Private Sub TestCSV()

    Dim context As HttpContext = HttpContext.Current

    context.Response.Clear()
    context.Response.ClearHeaders()
    context.Response.ClearContent()
    context.Response.Cache.SetCacheability(HttpCacheability.NoCache)
    context.Response.ContentType = "text/csv"
    context.Response.AddHeader("Content-Disposition", "attachment; filename=test.csv")
    context.Response.Charset = Encoding.UTF8.WebName
    context.Response.ContentEncoding = Encoding.UTF8
    context.Response.BinaryWrite(Encoding.UTF8.GetPreamble)

    context.Response.Write("Language,Sample")
    context.Response.Write(Environment.NewLine)
    context.Response.Write("Symbol,™£©€®")
    context.Response.Write(Environment.NewLine)
    context.Response.Write("Japanese,日本語")
    context.Response.Write(Environment.NewLine)
    context.Response.Write("Chinese Simplified,中文(简体)")
    context.Response.Write(Environment.NewLine)
    context.Response.Write("Spanish,Español")
    context.Response.Write(Environment.NewLine)
    context.Response.Write("Chinese Traditional,中文(繁體)")
    context.Response.Write(Environment.NewLine)
    context.Response.Write("Korean,한국어")

    context.Response.End()

End Sub

Спасибо!

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