【问题标题】:What is the best way to handle uploaded text files of different encodings?处理上传的不同编码文本文件的最佳方法是什么?
【发布时间】:2011-02-26 15:29:33
【问题描述】:

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

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

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

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

我也考虑过这些的优缺点:

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

有什么想法吗?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    一种方法可以是

    • 接收上传的文件并保存在临时文件中

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

    • 有一个 iframe,当下拉列表中的选定值发生变化时,使用 iconv()(源 = 选定编码;目标 = utf-8)转换上传文件的内容并显示预览.

    • 当用户选择编码时,做一个最终的iconv() 并将文件存储为UTF-8。

    【讨论】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-09-19
      • 2018-12-03
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多