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

Php 处理上传的不同编码文本文件的最佳方式是什么?,php,text,encoding,utf-8,character-encoding,Php,Text,Encoding,Utf 8,Character Encoding,在内部,我们的PHP应用程序使用UTF-8,我们对.csv文件和fixedwidth(文本)文件进行处理。我们已经编写了一些很好的库来处理这些文件(本质上是类) 我们最近增加了管理员上传这些类型文件的功能,以便能够处理这些文件,并在多个操作系统中快速遇到问题。我们很快意识到,正在读取的文件对我们的应用程序具有不同的编码(即Windows-1252或ISO-8859) 由于无法控制提交给我们的文件的编码,我的问题是;处理上传的不同编码文本文件的最佳方式是什么?目前我可以想到两种解决方案: 收到文

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

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

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

  • 收到文件后,检测其编码并将其转换为UTF-8,然后重新保存。然后,系统的其余部分只需要知道UTF-8,并且可以忽略“编码”问题
  • 更改csv/fixed width库,使其能够识别编码
我还考虑了这些建议的利弊:

  • 转换输入会使其余库变小并减少重复,但在处理方面似乎是浪费
  • 让库内部了解-这似乎涉及更多的代码,但可能会更快
想一想好吗


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

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

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

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

一种方法是

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

  • 显示包含最重要编码下拉选择的对话框

  • 具有一个iframe,当下拉列表中的选定值更改时,该iframe使用
    iconv()
    (源=所选编码;目标=utf-8)转换上载文件的内容并显示预览

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


  • 根据我自己的经验,CSV的自动编码检测可能很困难。它只对一小部分编码(如UTF系列和其他一些编码)可靠。在这方面,Pekka的建议指向正确的方向——将识别正确编码的责任推给最终用户

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


    角色转换应该在服务器端控制器内部进行,然后再将控制权移交给CSV处理器,前提是系统遵循MVC。

    Hiya,我没有否决投票-你的分数对我来说是0。谢谢你的回答-如果收到的文件是来自自动源,比如服务器通过FTP发送文件,而不是作为文件上传?Michael问题仍然是一样的:上传者最好告诉你该文件是哪种编码,因为自动检测可能不稳定。但在这种情况下,你几乎别无选择!好啊在哪里应用编码转换的问题如何(这是我真正感兴趣的部分)?您会在系统的其余部分开始处理文件或在应用程序内部(即csv或fixedwidth库内部)之前执行此操作吗?@Michael i个人会在收到数据时将数据标准化为UTF-8。将编码问题排除在核心库之外,让它期待UTF-8的通过。谢谢-我将等待,看看是否还有其他答案-非常感谢!