python-如何防止命令行参数被编码?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-如何防止命令行参数被编码?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1980字,纯文字阅读大概需要3分钟。
内容图文
![python-如何防止命令行参数被编码?](/upload/InfoBanner/zyjiaocheng/654/ea2153b59b2048ceb65f06149ec47994.jpg)
(问题已解决,请参阅更新)
由于编码问题,我有一些文件名不正确的文件.所以我想编写一个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 "1tà??·???.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脚本中,命令行参数始终为我提供第一个字符串.我无处可去.
我注意到这仅在Mac OS X中发生.因此,我怀疑该参数是由bash / system / python编码或处理的.
这是我的工具清单:
> Python:2.7.2
>作业系统:Mac OS X 10.6.7
> Shell:GNU bash,版本3.2.48(1)-发行版(x86_64-apple-darwin10.0)
更新:以下代码在Arch Linux上运行良好,但在Mac OS X中却遇到上述问题:
#!/usr/bin/env python
import sys
import os
for name in sys.argv[1:]:
try:
# This line does the magic:
new_name = name.decode('utf8').encode('latin-1').decode('gbk')
new_name_utf8 = new_name.encode('utf8')
if name != new_name_utf8:
print "%s -> %s" % (name, new_name_utf8)
os.rename(name, new_name)
except:
print "Ignoring %s" % name
在外壳中,运行:
$./the_script *mp3 # Let bash pass the file name string
您可以对字符串¹þÀï·ÑÑÇ.mp3运行以上代码,并且应正确将其标识为哈里路亚.mp3.请注意,您必须具有UTF-8语言环境和支持Unicode的正确中文字体才能正确显示它,或检查以下图像:
仅供参考:我的下载程序无法识别GBK编码的文件名,它被解释为Unicode字符串,其编码为UTF-8.原始文件中的非ascii字节被解释为Unicode的代码点,并使用UTF-8进行编码,这会引起问题.
Update2:Mac和Linux之间可移植的脚本现在已上传here.
解决方法:
问题是MacOS X的默认文件系统会将您提供给它的所有文件名更改为不使用预组成字符的异常规范化形式. unicodedata Python模块允许在这些形式之间进行转换,例如:
import unicodedata
print len(unicodedata.normalize("NFD", u"\u00C7"))
print len(unicodedata.normalize("NFC", u"\u00C7"))
这些分别打印2和1.
内容总结
以上是互联网集市为您收集整理的python-如何防止命令行参数被编码?全部内容,希望文章能够帮你解决python-如何防止命令行参数被编码?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。