QFile无法打开包含unicode字符的文件名

时间:2013-02-11 04:03:09

标签: python qt pyside

我遇到PySide问题。我正在使用QtCore.QImage处理一些图像,并注意到路径名中包含unicode字符的图像文件未被打开。
所以我开始调查,发现QFile提出了同样的问题。

我试过给它一个'utf8'编码的字节串和一个解码的unicode字符串,相同的区别。
我也尝试使用那些QFile.encodeNameQFile.decodeName函数,但所有这些都是从文件名中删除非ascii字符。

我制作了这个脚本来演示:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os

from PySide.QtCore import QFile, QIODevice

try:
    os.makedirs(u'/tmp/qttest')
except:
    pass #probably dir just exists
os.chdir(u'/tmp/qttest')

def make_file(fn):
    f = open(fn, 'w')
    f.close()

def check_file(fn):
    f = QFile(fn)
    f.open(QIODevice.ReadOnly)
    return f.isReadable()    

fna = u'somefile.txt'
fnu = u'einhverskrá.txt'

make_file(fna)
make_file(fnu)

print fna+u' was opened successfully: ', check_file(fna)
print fnu+u' was opened successfully: ', check_file(fnu)

print fna+u' exists: ', os.path.exists(fna)
print fnu+u' exists: ', os.path.exists(fnu)

输出

somefile.txt was opened successfully:  True
einhverskrá.txt was opened successfully:  False
somefile.txt exists:  True
einhverskrá.txt exists:  True

有人可以解释一下吗?

更新 浏览完源代码后,我发现QFile.open()总是在unix上通过这个函数传递文件名:

static QString locale_decode(const QByteArray &f)
{
#if defined(Q_OS_DARWIN)
    // Mac always gives us UTF-8 and decomposed, we want that composed...
    return QString::fromUtf8(f).normalized(QString::NormalizationForm_C);
#elif defined(Q_OS_SYMBIAN)
    return QString::fromUtf8(f);
#else
    return QString::fromLocal8Bit(f);
#endif
}

这总是会导致从字符串中删除unicode字符。

1 个答案:

答案 0 :(得分:2)

是的,我相信我找到了解决自己问题的方法。

from PySide.QtCore import QTextCodec
QTextCodec.setCodecForLocale(QTextCodec.codecForName('UTF-8'))

之后,似乎可以正确解析Unicode文件名。

我必须看看这个修补程序是否会对其他平台产生负面影响。