我和PySide有点问题。我使用QtCore.QImage处理一些图像,注意到路径名中包含unicode字符的图像文件没有被打开。
所以我开始调查,发现QFile也出现了同样的问题。在
我试着给它输入一个由testring编码的'utf8'和一个解码的unicode字符串,两者的区别是一样的。
我也尝试过使用那些QFile.encodeName和QFile.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)
输出
^{pr2}$
有人能解释一下吗?在
更新
在看过源代码之后,我发现在unix上,QFile.open()总是通过这个函数传递文件名: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字符。在