2013-02-11 2 views
3

У меня проблема с 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 
} 

Это всегда приводит к Юникода вырезаются из строки.

+0

Вы можете открыть их с помощью 'open()'? –

+0

Да, open() работает нормально. –

+0

Это работает? 'QFile (fn.encode (sys.getfilesystemencoding()))' – Avaris

ответ

2

Да, я считаю, что нашел решение своей проблемы.

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

Имена файлов в Юникоде, по-видимому, правильно решены после этого.

Я должен проверить, не влияет ли это исправление на другие платформы.

+0

Ничего себе! Это так и на C++! 'QTextCodec :: setCodecForLocale (QTextCodec :: codecForName (" UTF-8 "));' и '#include ' конечно. –

Смежные вопросы