我该如何修复损坏的 shift-JIS 文件名?

我该如何修复损坏的 shift-JIS 文件名?

我有一些 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 作为其字符串,因此转换涉及四个步骤:

  1. 将文件系统中的错误文件名读入 PS(内部表示为 UTF-16 字符串)
  2. 告诉 PS 将字符串转换为原始字节数组,就好像字符串是 <不正确的编码>。我们不能直接使用 PS 字符串(因为它是 UTF-16)。
  3. 告诉 PS 将字节数组转换回字符串并将其解释为 <正确编码>。这将使用原始字节的 UTF-16 字符串并将其解释为 Shift-JIS。
  4. 重命名文件

让我们从定义编码开始。就你的情况而言,我猜你的源是 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@Â1290x81½AaG9tZV8wM0CQwoKig2eDiYOTg06KSoKigr2BQYN0g0CDQ4OLl0yC6A==


还请注意,如果源文件名或目标文件名中存在 Windows 认为无效的字符,则此方法将不起作用。尤其是源文件名,因为提取工具可能会在提取时不可挽回地破坏名称(通过删除与无效字符对应的字节,如?\错误的编码)。在这些情况下,您唯一能做的就是使用完全避免此问题的替代提取工具。

相关内容