【问题标题】:php library providing utf-8 file functions on windows?在 Windows 上提供 utf-8 文件功能的 php 库?
【发布时间】:2013-11-16 20:30:46
【问题描述】:

我正在开发一个进行大量路径名操作的项目。它在 Mac OS X 上运行良好,但令我惊讶的是,在 Windows 上无法使用 utf-8 编码的字符串调用像 realpath 这样的函数。这是因为 Windows 上的 setlocale 不支持 utf-8:

PHP: setlocale in Windows 7

http://msdn.microsoft.com/en-us/library/x99tb11d.aspx

http://www.phpwact.org/php/i18n/utf-8

我可以在内部创建调用utf8_encodeutf8_decode 的包装函数,但是php 中有太多的文件函数,这给我带来了很大的负担。

此外,该项目是开源的,因此当用户尝试在他们自己的代码中使用我的字符串(都是 utf-8 以面向 Web 的)来读/写文件时,他们可能会认为它是破坏性的。

是否有提供 utf-8 版本的主要 php 文件功能的库?我更喜欢一个独立的目录而不是一个扩展,这样我就可以将它与我的代码捆绑在一起。

我担心如果找不到这样的库,可能是致命弱点导致 php 不适合我的跨平台开发。我也很好奇 ruby​​、python 和 c++ 等其他语言如何解决这个问题,如果他们这样做的话。如果没有,这可能只是对 Windows 的又一次打击,我将不得不想出另一种解决方法。

【问题讨论】:

  • 您的路径名中是否必须支持非 ansi 字符?如果没有,根本不需要打扰。
  • 是的,因为我想支持 ü 和 ñ 等国际字符。
  • 同样的问题。一直没有找到解决办法。另外我不确定运行 utf8_encode 和重新编码是否可以工作。如果我在测试时记得很清楚,我在文件名中丢失了一些重音符号。见comments here
  • 您想在文件名中支持国际字符吗?我敢肯定,即使您解决了与 PHP 相关的问题,您也会遇到大量其他特定于操作系统且不可避免的问题。你真的应该重新考虑这个想法。如果必须这样做,将所有文件访问函数包装在您自己的实用程序类中来管理对文件函数的调用将是一个很好的设计决策。这也将使您能够立即获得跨平台或操作系统版本的独立性,更不用说为您提供一个单一的名称修改位置。
  • 这很可悲,但 PHP does not use the Win32 API functions that support multi-byte paths。但是,utf8_encode() 不会修复任何问题:Windows 文件系统不使用 ISO-8859-1。

标签: php windows file encoding utf-8


【解决方案1】:

Windows setlocale() 函数(不是 php,而是 actual library function)不支持多字节编码。所以你是对的,在 windows 上设置 utf-8 语言环境是不可能的。

但是,您不需要定义新功能。编写一个流包装器。 Stream wrappers 可用于大多数与文件相关的功能,甚至是内部功能,例如在 XSLT 模板中加载文档。

【讨论】:

  • 好的,谢谢,这是我正在寻找的答案类型。我的计划是使用 $locale = setlocale(LC_CTYPE, "0") 检索当前语言环境,并编写一个在当前代码页内部使用 iconv() 的流包装器,类似于这个答案:stackoverflow.com/a/6810167/539149 我唯一的问题是函数是否像 file_get_contents($path) 将调用包装器,即使“file://”没有添加到路径中。我希望它会起作用,但如果不起作用,我会在这里报告。
猜你喜欢
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 2013-02-23
相关资源
最近更新 更多