如何防止命令行参数被编码?

用户

(问题已解决,请查看更新)

由于编码问题,我有些文件的文件名不正确。所以我想写一个python脚本来处理它。然而,我遇到了一个奇怪的问题。在

为了更好地说明,我将使用一个示例:文件名显示为¹þÀï·ÑÇ.mp3。 但是,以下结果不同:

# only one mp3 file is in this directory:
$ ls *mp3  | hexdump 
0000000 c2 b9 c3 be 41 cc 80 69 cc 88 41 cc 82 c2 b7 4e
0000010 cc 83 43 cc a7 2e 6d 70 33 0a                  
000001a

$ echo "¹þÀï·??Ç.mp3"  | hexdump 
0000000 c2 b9 c3 be c3 80 c3 af c3 82 c2 b7 c3 91 c3 87
0000010 2e 6d 70 33 0a                                 
0000015

基本上,第二个字符串(或字节)是我想要的,但是在Python脚本中,命令行参数总是给我第一个字符串。我没有办法四处走动。 我注意到这只在macosx中发生,因此,我怀疑参数是由bash/system/python编码或处理的。 以下是我的工具清单:

  • Python:2.7.2
  • 操作系统:Mac OS X 10.6.7
  • 外壳:GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)

更新:以下代码在我的Arch Linux中运行良好,但在我的Mac OS X中存在上述问题:

^{pr2}$

在shell中,运行:

$ ./the_script *mp3 # Let bash pass the file name string

您可以为字符串¹þÀï·ÑÇ.mp3运行上面的代码,它应该正确地标识为哈里路亚.mp3。请注意,要正确显示以下中文或UTF图像,请注意:

Original filename

仅供参考:我的下载程序无法识别GBK编码的文件名,它被解释为unicode字符串,编码为UTF-8。原始文件中的非ascii字节被解释为Unicode的代码点,并使用UTF-8编码,这导致了问题。在

更新2:可在Mac和Linux之间移植的脚本现在已上载here。在


已被浏览了943次
更新日期: 2020-10-28 19:49:23
2 个回答
fefe Tyson

这样的事情怎么样:

J=1
for I in * ; do
    mv -i "$I" "$J"
    J=$((J+1))
done

这将遍历所有文件并将它们重命名为序列号,这样就可以消除有问题的字符。在

评论 - 2020年9月11日 16:33
fefe Tyson

问题是macosx的默认文件系统会将您给它的所有文件名更改为一种不使用预编译字符的异常规范化形式。unicodedata Python模块允许在这些表单之间进行转换,例如:

import unicodedata
print len(unicodedata.normalize("NFD", u"\u00C7"))
print len(unicodedata.normalize("NFC", u"\u00C7"))

它们分别打印2和1。在

评论 - 2020年9月11日 16:33

最新Python问答

推荐Python问答