3

PySide に問題があります。パス名にユニコード文字をQtCore.QImage含む画像ファイルが開かれていないことに気付きました。
そのため、調査を開始したところQFile、同じ問題が発生していることがわかりました。

「utf8」でエンコードされたバイト文字列とデコードされたユニコード文字列を供給しようとしましたが、同じ違いです。
私もそれら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 文字が削除されます。

4

1 に答える 1

2

はい、自分の問題の解決策を見つけたと思います。

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

その後、Unicode ファイル名は適切に解決されるようです。

ただし、この修正が他のプラットフォームに悪影響を与えるかどうかを確認する必要があります.

于 2013-02-11T16:53:37.850 に答える