我们的PHP应用程序内部使用UTF-8,我们处理.csv文件和fixedwidth(文本)文件。我们编写了一些很好的库来处理这些文件(本质上是类)。
我们最近添加了管理员上传这些类型文件的功能,以便处理这些文件并在多个操作系统中快速遇到问题。我们很快意识到,正在读取的文件对我们的应用程序(即Windows-1252或ISO-8859)编码不同。
由于无法控制向我们提交的文件编码,我的问题是;处理不同编码的上传文本文件的最佳方法是什么?我现在可以想到两种解决方案:
我也考虑过这些人的优点和内容:
请问?
编辑:我真的很想知道在哪里应用,在架构上,字符编码/转换应该发生 - 是在输入点还是在使用文件时?
答案 0 :(得分:4)
这很棘手,并没有完美的解决方案。
例如,phpMyAdmin为用户提供了指定上传文件编码的可能性。因为所有自动检测方法都不是100%可靠,如果可能的话,这是进入IMO的最佳方式。一个导入对话框,允许用户选择正确的编码,同时在该编码中查看其数据的预览可能是最佳的。
这样做的方法可能是
接收上传的文件并将其存储在临时文件中
显示一个对话框,其中包含最重要编码的下拉选项
如果下拉列表中的所选值发生更改,请使用iconv()
(来源=所选编码; target = utf-8)转换上传文件的内容并显示iframe预览。
当用户选择编码时,请执行最终iconv()
并将文件存储为UTF-8。
答案 1 :(得分:2)
根据我自己的经验,CSV的自动编码检测可能很困难。它仅对一小部分编码(例如UTF系列和其他一些编码)可靠。在这方面,Pekka的建议旨在朝着正确的方向 - 通过将识别正确编码的负担放在最终用户身上。
保持UTF8作为内部格式是一个好主意,但我建议将字符集问题与CSV处理分开,因为格式本身没有关于编码的规则。虽然实时解码确实更有效,但代码复杂性的增加可能无法证明增益。保持软件组件的专业化总是一个好主意。
如果系统遵守MVC,则在将控制权交给CSV处理器之前,应在服务器端控制器内部进行字符转换。