处理不同编码的上传文本文件的最佳方法是什么?

时间:2011-02-26 15:29:34

标签: php text encoding utf-8 character-encoding

我们的PHP应用程序内部使用UTF-8,我们处理.csv文件和fixedwidth(文本)文件。我们编写了一些很好的库来处理这些文件(本质上是类)。

我们最近添加了管理员上传这些类型文件的功能,以便处理这些文件并在多个操作系统中快速遇到问题。我们很快意识到,正在读取的文件对我们的应用程序(即Windows-1252或ISO-8859)编码不同。

由于无法控制向我们提交的文件编码,我的问题是;处理不同编码的上传文本文件的最佳方法是什么?我现在可以想到两种解决方案:

  • 收到文件后,检测其编码并将其转换为UTF-8,然后重新保存。然后,系统的其余部分只需要知道UTF-8,并且可以忽略“编码”问题。
  • 更改csv /固定宽度库,使其自身成为编码

我也考虑过这些人的优点和内容:

  • 转换输入会使其余的库变小并减少重复,但在处理方面似乎很浪费
  • 让库内部意识到 - 这似乎涉及更多代码但可能更快速

请问?

编辑:我真的很想知道在哪里应用,在架构上,字符编码/转换应该发生 - 是在输入点还是在使用文件时?

2 个答案:

答案 0 :(得分:4)

这很棘手,并没有完美的解决方案。

例如,phpMyAdmin为用户提供了指定上传文件编码的可能性。因为所有自动检测方法都不是100%可靠,如果可能的话,这是进入IMO的最佳方式。

一个导入对话框,允许用户选择正确的编码,同时在该编码中查看其数据的预览可能是最佳的。

这样做的方法可能是

  • 接收上传的文件并将其存储在临时文件中

  • 显示一个对话框,其中包含最重要编码的下拉选项

  • 如果下拉列表中的所选值发生更改,请使用iconv()(来源=所选编码; target = utf-8)转换上传文件的内容并显示iframe预览。

  • 当用户选择编码时,请执行最终iconv()并将文件存储为UTF-8。

答案 1 :(得分:2)

根据我自己的经验,CSV的自动编码检测可能很困难。它仅对一小部分编码(例如UTF系列和其他一些编码)可靠。在这方面,Pekka的建议旨在朝着正确的方向 - 通过将识别正确编码的负担放在最终用户身上。

保持UTF8作为内部格式是一个好主意,但我建议将字符集问题与CSV处理分开,因为格式本身没有关于编码的规则。虽然实时解码确实更有效,但代码复杂性的增加可能无法证明增益。保持软件组件的专业化总是一个好主意。

如果系统遵守MVC,则在将控制权交给CSV处理器之前,应在服务器端控制器内部进行字符转换。