我在Windows 7下的本地计算机上运行Apache / PHP / MySQL服务器(xampp)。我已经安装了MediaWiki-Software以及许多扩展。我的目标是从维基百科下载一些页面并在本地显示它们。一切都运行良好,除了一个大问题:
德语维基百科中的图像文件在其文件名中包含德语Umlaute(ä,ö,ü)。这是无法更改的,因为文章链接到带有Umlaute的名称。
当我尝试导入这些图像时(通过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字符串的硬编码函数。
答案 0 :(得分: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本身之外的其他文件系统处理。
同时检查文件系统的系统配置使用了哪个代码页。这可能有所不同。