我有一些 ANSI 格式的带有 shift-jis 文件名的文件。例如
home_03@‚¢ƒgƒ‰ƒ“ƒNŠJ‚¢‚½Aƒtƒ@ƒCƒ‹—L‚è
当他们应该在 shift-jis 中时
home_03@青いトランク開いた、ファイル有り
这是因为我使用的存档提取器不支持 shift-jis。这真的无济于事。但是有没有什么方法可以修复我提取的文件的文件名?
编辑:
另一个例子
Ší‹ï‘ä@ƒXƒpƒi
应该
器具台@スパナ
答案1
由于您使用的是 Windows,因此 PowerShell 可能是最简单的方法。
现在,PowerShell 内部使用 UTF-16 作为其字符串,因此转换涉及四个步骤:
- 将文件系统中的错误文件名读入 PS(内部表示为 UTF-16 字符串)
- 告诉 PS 将字符串转换为原始字节数组,就好像字符串是 <不正确的编码>。我们不能直接使用 PS 字符串(因为它是 UTF-16)。
- 告诉 PS 将字节数组转换回字符串并将其解释为 <正确编码>。这将使用原始字节的 UTF-16 字符串并将其解释为 Shift-JIS。
- 重命名文件
让我们从定义编码开始。就你的情况而言,我猜你的源是 Windows-1252(西方/英语 Windows 的默认非 Unicode 代码页)。
$srcEnc = [System.Text.Encoding]::GetEncoding("Windows-1252")
$destEnc = [System.Text.Encoding]::GetEncoding("Shift-JIS")
您还可以使用它[System.Text.Encoding]::Default
来获取当前系统代码页,但我更喜欢明确地说明。
然后我们应用转换步骤:
$newName = $destEnc.GetString($srcEnc.GetBytes($oldName))
在您的示例中,home_03@‚¢ƒgƒ‰ƒ“ƒNŠJ‚¢‚½Aƒtƒ@ƒCƒ‹—L‚è
变为home_03@ツいトランク開いたAファイル有り
。虽然这与您的示例结果不同(请参阅底部的注释),但它与我从中获得的结果相符http://string-functions.com/encodedecode.aspx的 Windows-1252 => Shift-JIS。如果不正确,您可能需要反复尝试,直到找到正确的源和目标编码。
将其与标准循环放在一起:
$srcEnc = [System.Text.Encoding]::GetEncoding("Windows-1252")
$destEnc = [System.Text.Encoding]::GetEncoding("Shift-JIS")
Get-ChildItem | %{Rename-Item -LiteralPath "$_" "$($destEnc.GetString($srcEnc.GetBytes($_.Name)))"}
或者如果您喜欢递归到子目录:
$srcEnc = [System.Text.Encoding]::GetEncoding("Windows-1252")
$destEnc = [System.Text.Encoding]::GetEncoding("Shift-JIS")
Get-ChildItem -Recurse | %{Rename-Item -LiteralPath "$_" "$($destEnc.GetString($srcEnc.GetBytes($_.Name)))"}
如果您想避免重命名目录,请添加-File
到。Get-ChildItem
看起来您的示例包含两个在 Windows-1252 中无效的字符,并且很可能在您发布问题时被删除(基于使用示例输出逆转该过程)。第一个和之间有一个144
( ) ,和之间有一个( ) 。为了方便其他想要测试的人,这里是原始字节的 base64 编码版本:。0x90
@
Â
129
0x81
½
A
aG9tZV8wM0CQwoKig2eDiYOTg06KSoKigr2BQYN0g0CDQ4OLl0yC6A==
还请注意,如果源文件名或目标文件名中存在 Windows 认为无效的字符,则此方法将不起作用。尤其是源文件名,因为提取工具可能会在提取时不可挽回地破坏名称(通过删除与无效字符对应的字节,如?
或\
错误的编码)。在这些情况下,您唯一能做的就是使用完全避免此问题的替代提取工具。