【发布时间】:2013-11-16 20:30:46
【问题描述】:
我正在开发一个进行大量路径名操作的项目。它在 Mac OS X 上运行良好,但令我惊讶的是,在 Windows 上无法使用 utf-8 编码的字符串调用像 realpath 这样的函数。这是因为 Windows 上的 setlocale 不支持 utf-8:
http://msdn.microsoft.com/en-us/library/x99tb11d.aspx
http://www.phpwact.org/php/i18n/utf-8
我可以在内部创建调用utf8_encode 和utf8_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