【问题标题】:PHPExcel file "corrupt" when Unicode in data数据中的 Unicode 时 PHPExcel 文件“损坏”
【发布时间】:2015-06-03 04:38:21
【问题描述】:

我已经成功使用 PHPExcel 几个月了。现在我有一些用户正在将 Unicode 输入到他们的数据中,现在他们的报告没有在 Excel 中打开。

Excel 2010 给出的确切错误是:
Excel 在“blahblahblah.xlsx”中发现了不可读的内容。是否要恢复此工作簿的内容?如果您信任此工作簿的来源,请单击“是”。

单击是...
文件已损坏,无法打开。

当我查看文件时(转到 .zip 并打开 .xml 内容),我可以看到所有内容都已正确格式化。 UTF-8 字符显示在我的文本编辑器中(带重音的“o”显示为 xC3 作为单个项目),但这些编码似乎杀死了 Excel。

我注意到在单元格和工作表名称中都使用了 Unicode。

【问题讨论】:

  • phpexcel.codeplex.com/wikipage?title=FAQ "字符编码似乎有问题... PHPExcel中的所有文本都必须使用UTF-8编码。如果脚本使用不同的编码,则可以使用 PHP 的 iconv() 函数转换文本。"
  • xC3 表示单个 0xC3 字节,它不是有效的 UTF-8 序列。这将使 XML 解析器无法读取整个文件(例如,尝试将其加载到 Web 浏览器中,您可能会遇到错误)。您需要确保所有字符串都是 UTF-8。

标签: unicode phpexcel


【解决方案1】:

我将要使用的解决方案(虽然并不完美):

  function PHPExcel_UnicodeFix($value) {

    //data seems to be UTF-8, despite internal encoding
    // $iconv = iconv_get_encoding();
    // $it = $iconv['internal_encoding'];
    //such that $it == 'ISO-8859-1'

    //but iconv($it,"ASCII//TRANSLIT",$value) doesn't work (data is already UTF-8?)

    //Excel does not accept UTF-8?
    $value_fixed = iconv("UTF-8","ASCII//TRANSLIT",$value);

    return $value_fixed;
  }

我尝试了许多 iconv() 的组合,然后才发现它可以工作。我也认为 UTF-8 对 PHPExcel 有效,但它不起作用。这种转换并不完美,但它是可读的。

【讨论】:

  • 因此,尽管有“internal_encoding”设置,但似乎发生的事情是编写 UTF-8 字符的模块正在这样做。因此,由于该模块忽略了编码,所有内部功能和编码器都被破坏了。我应该that 模块运行之前调用 iconv_set_encoding,以确保它写入的 UTF-8 不违反“internal_encoding”。
猜你喜欢
  • 2017-12-04
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多