Python 使用日文字符时,在OS X上将文件名编码为base64不正确
我有一大堆以人名命名的文件(如“john.txt”、“mary.txt”),但其中也有日本名字(如“fūka.txt”、“tetsurō.txt”) 我试图做的是将“.txt”之前的名称转换为Base64 唯一的问题是,当我使用一个文件名(没有扩展名)并使用一个基于web的转换器时,我得到的结果与使用Python脚本进行编码的结果不同 所以。。。例如,当我复制没有扩展名的文件名部分并在中编码“fūka”时,我得到“zsra2e=”。当我从UTF-8编码的PostgreSQL数据库中获取人名,将其小写,并对其进行base64编码时,得到了相同的结果 但是当我使用下面的Python脚本时,我得到了“ZnXMhGth” 我在OSX10.8和Linux(从Mac上传到Linux服务器的文件)中得到了相同的结果。Python是2.7。我还尝试了PHP脚本(结果与Python脚本相同) 当我将名字与其他字符(例如“tetsurō”)一起使用时,也会出现类似的差异 还有一件奇怪的事。。。当我在OSX的终端应用程序中用Python脚本输出文件名部分,然后将此文本复制为文件名时。。。然后将文件名编码为base64,我得到的结果与上面提到的网页上的结果相同。终端采用UTF-8编码 有人能解释一下我做错了什么(或想错了什么)吗?在一些小角色替换之间有什么地方吗?如何使Python脚本获得与上述网页相同的结果?如有任何提示,将不胜感激 解决方案: 在Marks的帮助下,我修改了一个脚本,效果非常好!谢谢你,马克Python 使用日文字符时,在OS X上将文件名编码为base64不正确,python,encoding,python-2.7,base64,osx-mountain-lion,Python,Encoding,Python 2.7,Base64,Osx Mountain Lion,我有一大堆以人名命名的文件(如“john.txt”、“mary.txt”),但其中也有日本名字(如“fūka.txt”、“tetsurō.txt”) 我试图做的是将“.txt”之前的名称转换为Base64 唯一的问题是,当我使用一个文件名(没有扩展名)并使用一个基于web的转换器时,我得到的结果与使用Python脚本进行编码的结果不同 所以。。。例如,当我复制没有扩展名的文件名部分并在中编码“fūka”时,我得到“zsra2e=”。当我从UTF-8编码的PostgreSQL数据库中获取人名,将其
import glob, os
import base64
from unicodedata import normalize
def rename(dir, pattern):
for pathAndFilename in glob.iglob(os.path.join(dir, pattern)):
title, ext = os.path.splitext(os.path.basename(pathAndFilename))
t = normalize('NFC', title.lower()).encode("utf-8") # <-- NORMALIZE !!!
encoded_string = base64.b64encode(t) + ext
p = os.path.join(dir, encoded_string)
os.rename(pathAndFilename, p)
rename(u'./test', u'*.txt')
导入全局操作系统
导入base64
从Unicode数据导入规范化
def重命名(目录,模式):
对于glob.iglob(os.path.join(dir,pattern))中的pathAndFilename:
title,ext=os.path.splitext(os.path.basename(path和filename))
t=normalize('NFC',title.lower()).encode(“utf-8”)#Python脚本似乎使用了一种规范化的Unicode格式,其中ū
被拆分为两个字符,u
和a。另一种形式使用单个字符。就Unicode而言,它们是相同的字符串,即使它们没有相同的二进制表示形式
您可能会从Unicode常见问题解答中获得更多信息:谢谢,Mark!规范化是一个关键。它实际上似乎是一个比日语字符编码更普遍的问题。我有一个脚本,在Linux和Mac上运行时编码方式不同,因为它使用encoded\u string=bytes(text\u to\u encode)。encode('base64')
而不是您和@Mark建议的方式base64
库是比.encode()
更好的解决方案,所以竖起大拇指!
import glob, os
import base64
from unicodedata import normalize
def rename(dir, pattern):
for pathAndFilename in glob.iglob(os.path.join(dir, pattern)):
title, ext = os.path.splitext(os.path.basename(pathAndFilename))
t = normalize('NFC', title.lower()).encode("utf-8") # <-- NORMALIZE !!!
encoded_string = base64.b64encode(t) + ext
p = os.path.join(dir, encoded_string)
os.rename(pathAndFilename, p)
rename(u'./test', u'*.txt')