【问题标题】:Convert double-byte numbers and spaces in filenames to ASCII将文件名中的双字节数字和空格转换为 ASCII
【发布时间】:2010-01-02 19:37:36
【问题描述】:

给定一个由双字节/全角数字和空格(以及一些半角数字和下划线)组成的文件名目录,如何将所有数字和空格转换为单字节字符?

例如,此文件名由一个双字节数字、后跟一个双字节空格、后跟一些单字节字符组成:

2 2_3.ext

我想将其更改为所有单字节,如下所示:

2 2_3.ext

我已尝试convmv 将utf8 转换为ascii,但所有文件都会出现以下消息:

“ascii 没有涵盖所有需要的字符:文件名

【问题讨论】:

  • 您应该指定语言。此外,最好指定您为什么要这样做,这没有多大意义,因为您仍然有其他无法转换为 ASCII 的 Unicode 字符。
  • “这没有多大意义,因为您仍然会有其他无法转换的 Unicode 字符” 这就是为什么我说“数字和空格”,而不是所有字符.我找到了一个使用 Perl 的完美解决方案(请参阅下面的答案)。 “您应该指定语言。” 也没有理由指定语言,因为我对几乎任何语言的解决方案都很满意。

标签: unicode ascii double-byte


【解决方案1】:

您需要 (1) Java 1.6 (java.text.Normalizer) 的规范化,或 (2) ICU,或 (3 (不太可能)) 我工作的地方销售的产品。

【讨论】:

    【解决方案2】:

    您有哪些可用的工具?几种脚本语言中都有 Unicode 规范化函数,例如 Python:

    for child in os.listdir(u'.'):
        normal= unicodedata.normalize('NFKC', child)
        if normal!=child:
            os.rename(child, normal)
    

    【讨论】:

      【解决方案3】:

      感谢您的快速回复、bmargulies 和 bobince。我找到了一个 Perl 模块 Unicode::Japanese,它有助于完成工作。这是我制作的一个 bash 脚本(在 this example 的帮助下),用于将当前目录中的文件名从全角字符转换为半角字符:

      #!/bin/bash
      for file in *;do
      newfile=$(echo $file | perl -MUnicode::Japanese -e'print Unicode::Japanese->new(<>)->z2h->get;')
      test "$file" != "$newfile" && mv "$file" "$newfile"
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-16
        • 2012-11-14
        • 2021-02-27
        • 1970-01-01
        • 2011-01-13
        • 1970-01-01
        • 2015-02-20
        • 1970-01-01
        相关资源
        最近更新 更多