【发布时间】:2012-12-28 22:23:37
【问题描述】:
我在 Windows 7 下的本地计算机上运行 Apache/PHP/MySQL 服务器 (xampp)。在那里我安装了 MediaWiki 软件以及许多扩展。我的目标是从维基百科下载一些页面并在本地显示。一切运行良好,除了一个大问题:
德语维基百科中的图像文件的文件名中包含德语变音符号(ä、ö、ü)。这无法更改,因为文章链接到带有元音变音的名称。
当我尝试导入这些图像(通过maintenance/importImages.php 脚本)时,它不起作用。我追踪了代码并找出了原因:
当 PHP 扫描目录中的文件时,它会将文件名读取为 ANSI 字符串。 MediaWiki 内部要求所有字符串都是 utf-8。因此,文件名中的元音变音符号被解释为(不存在的)unicode 字符的一部分,这会破坏脚本。
如果我在脚本中手动添加对utf8_encode() 的调用,则名称很好,并且已正确添加到数据库中。但是实际写入“images”目录的文件有一个损坏的名称 - 两个特殊字符而不是变音符号。原因是 PHP 脚本将 utf-8 字符串发送到文件系统函数(“copy”,...),但操作系统需要 ANSI 字符串。我可以在每个文件系统调用之前手动添加对utf8_decode() 的调用,但是有成千上万个!
再次简而言之:操作系统在 ANSI 中运行(这对于 Windows 来说不容易更改),PHP 服务器内的 MediaWiki 软件在 utf-8 中运行(也无法更改)。有没有办法在文件名字符串每次进出 PHP 服务器时自动编码/解码?
我已经在使用mb_internal_encoding() 和mb_http_output(),但这并没有改变任何东西:MediaWiki 使用仅适用于 utf-8 字符串的硬编码函数。
【问题讨论】:
-
您可以在哪里进行更改?示例:您能否将 utf-8 变音符号更改为字母 a、o 或 u,并且仍然可以创建有效的解决方案?
-
也许这里的答案可能有用-> stackoverflow.com/questions/1089966/…
-
是的,我解决了。 Apache RewriteRule 的想法很棒。无需更改 PHP 代码。我在我的 httpd.conf 中添加了以下重写规则(仅适用于 Umlaut:ä)RewriteEngine On RewriteRule ^(/?mywiki\/images/.*/[^/]*?)\xC3\xA4([^/]* ?\xC3\xA4[^/]*)$ $1\%C3\%83\%C2\%A4$2 [NE,N] RewriteRule ^(/?mywiki\/images/.*/[^/]*? )\xC3\xA4([^/\xC3\xA4]*)$ $1\%C3\%83\%C2\%A4$2 [NE,R=301] 它所做的只是将每个 'ä' 替换为 ' %C3%83%C2%A4' 在指向 /mywiki/images/* 的 URL 中。因此 MediaWiki 可以访问 Windows 文件系统中名称损坏的文件。
标签: php windows encoding mediawiki