1

我在 Windows 7 下的本地机器上运行 Apache/PHP/MySQL 服务器 (xampp)。在那里我安装了 MediaWiki-Software 以及许多扩展。我的目标是从维基百科下载一些页面并在本地显示。一切运行良好,除了一个大问题:

德语 Wikipedia 中的图像文件的文件名中包含德语变音符号(ä、ö、ü)。这无法更改,因为文章链接到带有元音变音的名称。

当我尝试导入这些图像(通过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()and了mb_http_output(),但这并没有改变任何东西:MediaWiki 使用仅适用于 utf-8 字符串的硬编码函数。

4

1 回答 1

1

您需要在导入文件系统之前重命名文件系统上的所有文件,以便它们与数据库内的数据匹配。

只需确保当文件名的 UTF-8 编码二进制序列命中文件系统时,找到该文件。

$fileANSI; // you have this
$fileUTF8 = ut8_encode($fileANSI); // you do this already
// insert etc, when MW is ready do:
rename($fileANSI, $fileUTF8);

因此,您需要在命中时将每个文件从当前名称重命名为二进制序列。

对于您的网络服务器,您可能还需要引入一个重写规则来处理传入的 HTTP 请求,因为网络服务器可能使用 PHP 本身以外的其他文件系统处理。

还要检查使用了哪个代码页的文件系统的系统配置。那可能会有所不同。

于 2012-12-28T14:17:56.997 回答