我使用mkdir()通过PHP在波斯语和阿拉伯语言中创建一些目录。
我想将文件夹移到Windows中,但文件夹名称有问题。
示例:我写道:“سلام”
但是在windows中显示我不知名的字符:“ط³غŒطaط³طھظ...ط¹ط§ظ...ظ”ط¬ظ“ط¯ط¯ظظ......”
似乎应该转换为除UTF-8之外的其他编码
对不起,如果我的英语不是很好。
谢谢。
编辑: 我使用了这个Powershell代码并为我工作:
Get-ChildItem | ForEach-Object {
$filename = Split-Path -Leaf $_
$new = [Text.Encoding]::Utf8.GetString([Text.Encoding]::Default.GetBytes($filename))
if ($_.Name -ne $new) {
Rename-Item $_ $new
}
}
enter code here
但我希望上面的代码也能纠正所有子文件夹名称......
答案 0 :(得分:3)
似乎应该转换为除UTF-8之外的其他编码
是:当您在C标准库基于字节的文件接口(这是PHP和大多数其他跨平台语言)中使用文件名字符串时,您将获得Windows默认('ANSI')代码页。这种编码依赖于语言环境,并且更加严重,绝不是UTF-8。
根据上述文件名判断,您的默认代码页为1256阿拉伯语。如果您将文件名编码为cp1256,则应该可以使用:
$localfilename= iconv('utf-8', 'windows-1256', $filename);
然而:
这意味着您只能在文件名中使用阿拉伯语(和ASCII)字符 - 任何其他Unicode字符都会中断;
如果部署在默认代码页不是1256的其他服务器上,这将自然会失败。服务器通常在美国语言环境中运行,并选择代码页1252西欧。
< / LI>虽然您通常可以更改代码页,并且原则上在Windows中可以使用UTF-8作为代码页65001,但是有很多错误可能会使其无法用于此目的 - UTF-8是第二个Windows下的公民。 (在任何情况下,更改Web服务器线程内的区域设置都是狡猾的。)
获取完整的Unicode文件名以在Windows中工作的唯一方法是调用本机Win32 API函数来访问文件(使用UTF-16LE字符串)而不是C标准库函数。这就是PowerShell / .NET所做的 - 因为它是Windows特有的软件,它可以直接进入Win32功能。 Python还支持转换到Win32而不是C的Unicode文件名。
然而,PHP目前没有此功能。您可以使用w32api_invoke_function直接调用Win32 API CreateDirectoryW来手动执行此操作,但这确实很不方便。
这就是为什么最好尽量避免使用任意输入作为文件名的原因之一!