У меня проблема с PySide. Я имел дело с некоторыми изображениями, используя QtCore.QImage
, и заметил, что файлы изображений, в которых символы Unicode в именах путей не были открыты.
Итак, я начал расследование и обнаружил, что QFile
представляет ту же проблему.QFile не может открывать имена файлов, содержащие символы Unicode
Я пробовал кормить его «utf8» закодированным байтом, а также расшифрованную строку юникода, такую же разницу.
Я также пробовал использовать те функции 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)
Выходной
somefile.txt was opened successfully: True
einhverskrá.txt was opened successfully: False
somefile.txt exists: True
einhverskrá.txt exists: True
Может кто-нибудь объяснить это?
UPDATE После просмотра исходного кода, я обнаружил, что 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
}
Это всегда приводит к Юникода вырезаются из строки.
Вы можете открыть их с помощью 'open()'? –
Да, open() работает нормально. –
Это работает? 'QFile (fn.encode (sys.getfilesystemencoding()))' – Avaris