在Windows上提供UTF-8文件功能的PHP库是什么?

5
我正在处理一个大量使用路径名操作的项目。它在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 中有很多文件函数,这对我来说是一种负担。

此外,该项目是开源的,因此用户可能会认为在尝试使用我的字符串(全部都是面向 Web 的 utf-8)来读/写文件时出现了错误。

是否有一个库提供主要 php 文件函数的 utf-8 版本?我更喜欢一个自包含的目录而不是扩展,以便我可以将其与我的代码捆绑在一起。

我担心如果找不到这样的库,它可能是使 PHP 对于跨平台开发不适合的致命弱点。我也很好奇其他语言如 Ruby、Python 和 C++ 是否遇到过这个问题,如果他们确实遇到了,那么这可能只是另一个打击 Windows 的原因,我将不得不想出另一种解决方法。


你的路径名中是否需要支持非 ANSI 字符?如果不需要,就不必费心了。 - ToBe
是的,因为我想支持像ü和ñ这样的国际字符。 - Zack Morris
同样的问题。从未找到解决方案。而且我不确定运行utf8_encode和重新编码能够起作用。如果我没记错,在测试时我在文件名中丢失了一些重音符号。请参见此处的评论 - yuri
你想在文件名中支持国际字符吗?我非常确定,即使你解决了与PHP相关的问题,你也会遇到许多其他特定于操作系统且无法避免的问题。你应该真正重新考虑这个想法。如果必须这样做,将所有文件访问函数包装在自己的实用程序类中,以管理对文件函数的调用,这将是一个好的设计决策。这还将使您能够快速跨平台或独立于操作系统版本,更不用说为名称处理提供一个单一的位置了。 - ToBe
很遗憾,但是PHP不使用支持多字节路径的Win32 API函数。然而,utf8_encode()也无法解决问题:Windows文件系统不使用ISO-8859-1。 - Álvaro González
我在这个问题上找到了一些链接:https://dev59.com/jVnUa4cB1Zd3GeqPXBFm?rq=1 https://dev59.com/RnI-5IYBdhLWcg3wBjhR - Zack Morris
1个回答

1

Windows的setlocale()函数(不是php,而是实际库函数)不支持多字节编码。所以你是对的,在Windows上无法设置utf-8语言环境。

但是你不需要定义新的函数。编写一个流包装器即可。流包装器可以被大多数文件相关函数使用,甚至是像在XSLT模板中加载文档这样的内部函数。


好的,谢谢,这正是我要寻找的答案。我的计划是使用$locale = setlocale(LC_CTYPE, "0")检索当前区域设置,并编写一个流包装器,内部使用当前代码页的iconv(),类似于此答案:http://stackoverflow.com/a/6810167/539149 ,我的唯一问题是,如果在路径前面没有加上“file://”,像file_get_contents($path)这样的函数是否会调用包装器。我希望它能正常工作,但如果不能,我会在这里报告。 - Zack Morris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接