使用Python unicode的特殊字符/汉字问题

使用Python unicode的特殊字符/汉字问题,python,unicode,special-characters,moviepy,Python,Unicode,Special Characters,Moviepy,我想使用videofileclip(),但出现UnicodeDecodeError。 视频文件包括日文汉字或特殊字符 我的示例代码: #-*- coding: utf-8 -*- import sys from moviepy.editor import VideoFileClip reload(sys) sys.setdefaultencoding('utf-8') a='H:\\kittens.mkv' clip1=VideoFileClip(a) b='H:\\“ēī①”.m

我想使用videofileclip(),但出现UnicodeDecodeError。 视频文件包括日文汉字或特殊字符

我的示例代码:

#-*- coding: utf-8 -*-
import sys  
from moviepy.editor import VideoFileClip

reload(sys)  
sys.setdefaultencoding('utf-8')

a='H:\\kittens.mkv'
clip1=VideoFileClip(a)

b='H:\\“ēī①”.mp4'
clip2=VideoFileClip(b)

if clip1.fps >= clip2.fps:
    os.remove(b)
else:
    os.remove(a)        
“a”很好:

>>> a='H:\\kittens.mkv'
>>> clip=VideoFileClip(a)
>>> 
但“b”不起作用:

>>> b='H:\\“ēī①”.mp4'
>>> clip=VideoFileClip(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\moviepy\video\io\VideoFileClip.py", line 5
5, in __init__
    reader = FFMPEG_VideoReader(filename, pix_fmt=pix_fmt)
  File "C:\Python27\lib\site-packages\moviepy\video\io\ffmpeg_reader.py", line 3
2, in __init__
    infos = ffmpeg_parse_infos(filename, print_infos, check_duration)
  File "C:\Python27\lib\site-packages\moviepy\video\io\ffmpeg_reader.py", line 2
70, in ffmpeg_parse_infos
    filename, infos))
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa1 in position 54: invalid
start byte
>>> b
'H:\\\xa1\xb0??\xa8\xe7\xa1\xb1.mp4'
>>> print b
H:\“??①”.mp4
>>> print b.decode('cp949')
H:\“??①”.mp4
>>>

我认为Windows7支持Unicode文件名(日语汉字或特殊字符),但Python(2.x)(cp949)的字符集不支持特殊字符。我能为这个问题做些什么?

这里有一个使用扩展的解决方法。 基本上,您可以使用该函数从unicode路径生成遗留文件

# -*- coding: utf-8 -*-

import os
import win32api
from moviepy.editor import VideoFileClip


def short_path(unicode_path):
    return win32api.GetShortPathName(unicode_path)


v1 = '“ēī①”.mp4'
print os.path.isfile(v1)  # False

v2 = u'“ēī①”.mp4'
print os.path.isfile(v2)  # True

# clip = VideoFileClip(v1)  # IOError
# clip = VideoFileClip(v2)  # UnicodeEncodeError
clip = VideoFileClip(short_path(v2))  # OK
print clip.duration

这里有一个使用扩展的变通方法。 基本上,您可以使用该函数从unicode路径生成遗留文件

# -*- coding: utf-8 -*-

import os
import win32api
from moviepy.editor import VideoFileClip


def short_path(unicode_path):
    return win32api.GetShortPathName(unicode_path)


v1 = '“ēī①”.mp4'
print os.path.isfile(v1)  # False

v2 = u'“ēī①”.mp4'
print os.path.isfile(v2)  # True

# clip = VideoFileClip(v1)  # IOError
# clip = VideoFileClip(v2)  # UnicodeEncodeError
clip = VideoFileClip(short_path(v2))  # OK
print clip.duration

我怀疑不是您的代码不支持unicode,而是模块
moviepy
。我记得有一个技巧可以避免这种情况,我会努力找到它。谢谢。我在等待你的帮助。可能不是这个具体的问题,但是。它从来都不需要,没有
reload(sys)
技巧就不能调用它是有原因的。移除它。还可以尝试使用Unicode字符串而不是字节字符串作为文件名,例如,
u'H:\\\\“ē299;①”.mp4'
。确保用声明的UTF-8源代码保存源文件。
b
当前是一个用UTF-8编码的字节字符串,这在Windows中不太可能是文件名。+1 Mark说了什么。要在Windows中访问非ASCII文件名,需要使用Unicode字符串。这会告诉Python使用Windows特定的代码调用Win32 file API,而不是使用标准的基于C字节的API,在Microsoft的实现下,这些API仅限于特定于语言环境的(“ANSI”)代码页(可能是1252;肯定不是949)。设置默认编码不会影响文件访问,这是一个糟糕的主意(为什么不会消亡?)我怀疑不是您的代码不支持unicode,而是模块
moviepy
。我记得有一个技巧可以避免这种情况,我会尝试找到它。谢谢。我正在等待您的帮助。这可能不是这个特定的问题,但是。它从来都不需要,并且有一个原因,在没有
重新加载(sys)的情况下无法调用它
trick。删除它。也可以尝试使用Unicode字符串而不是字节字符串作为文件名,例如
u'H:\\\“ē299”①”.mp4'
。确保用声明的UTF-8源代码保存源文件。
b
当前是一个用UTF-8编码的字节字符串,这在Windows中不太可能是文件名。+1 Mark说了什么。要在Windows中访问非ASCII文件名,需要使用Unicode字符串。这会告诉Python使用Windows特定的代码调用Win32 file API,而不是使用标准的基于C字节的API,在Microsoft的实现下,这些API仅限于特定于语言环境的(“ANSI”)代码页(可能是1252;肯定不是949)。设置默认编码不会影响文件访问,这是一个糟糕的主意(为什么不会消亡?)