将unix / linux文件名字符集转换为windows

时间:2013-04-08 17:05:17

标签: linux windows unix unicode filenames

我使用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

但我希望上面的代码也能纠正所有子文件夹名称......

1 个答案:

答案 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来手动执行此操作,但这确实很不方便。

这就是为什么最好尽量避免使用任意输入作为文件名的原因之一!