Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用日文字符时,在OS X上将文件名编码为base64不正确_Python_Encoding_Python 2.7_Base64_Osx Mountain Lion - Fatal编程技术网

Python 使用日文字符时,在OS X上将文件名编码为base64不正确

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数据库中获取人名,将其

我有一大堆以人名命名的文件(如“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的帮助下,我修改了一个脚本,效果非常好!谢谢你,马克

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')