【问题标题】:Wrong translation of filepaths to utf-8 by PyQt4 using Python 3.4PyQt4 使用 Python 3.4 错误地将文件路径转换为 ​​utf-8
【发布时间】:2014-11-02 19:01:40
【问题描述】:

我最近将我的 PyQt4 应用程序从 Python 2.7 迁移到了 Python 3.4。但我注意到我的 QDirIterator 返回错误解码的非scii 文件路径。我正在使用 API v2,所以 QString 直接被翻译成 python str 对象。但是翻译后的文件路径是错误的。

Right paths are (from python os module):

D:\Dropbox\MP3\Chinaski\2002 - Originál\01 - Můj svět.mp3 
D:\Dropbox\MP3\Chinaski\2002 - Originál\02 - Veselý turista.mp3 
D:\Dropbox\MP3\Chinaski\2002 - Originál\03 - Láskopad.mp3 
D:\Dropbox\MP3\Chinaski\2002 - Originál\04 - Hurá do Chebu.mp3 
D:\Dropbox\MP3\Chinaski\2002 - Originál\05 - Kytarista.mp3 
D:\Dropbox\MP3\Chinaski\2002 - Originál\06 - Žil byl....mp3 
D:\Dropbox\MP3\Chinaski\2002 - Originál\07 - Lidi choděj do práce.mp3 
D:\Dropbox\MP3\Chinaski\2002 - Originál\08 - Dobrák od Kosti.mp3 
D:\Dropbox\MP3\Chinaski\2002 - Originál\09 - Umělci z Prahy.mp3 
D:\Dropbox\MP3\Chinaski\2002 - Originál\10 - Šangri-la.mp3 
D:\Dropbox\MP3\Chinaski\2002 - Originál\11 - Dál....mp3 
D:\Dropbox\MP3\Chinaski\2002 - Originál\12 - Neříkej,že ne.mp3 
D:\Dropbox\MP3\Chinaski\2002 - Originál\13 - Tahle láska skončila.mp3

But QDirIterator returns (ignore slashes .. / or \ doesn't matter)

D:/Dropbox/MP3/Chinaski/2002 - Originál/01 - Moj svt.mp3 
D:/Dropbox/MP3/Chinaski/2002 - Originál/02 - Veselý turista.mp3 
D:/Dropbox/MP3/Chinaski/2002 - Originál/03 - Láskopad.mp3 
D:/Dropbox/MP3/Chinaski/2002 - Originál/04 - Hurá do Chebu.mp3 
D:/Dropbox/MP3/Chinaski/2002 - Originál/05 - Kytarista.mp3 
D:/Dropbox/MP3/Chinaski/2002 - Originál/06 - }il byl....mp3 
D:/Dropbox/MP3/Chinaski/2002 - Originál/07 - Lidi chodj do práce.mp3 
D:/Dropbox/MP3/Chinaski/2002 - Originál/08 - Dobrák od Kosti.mp3 
D:/Dropbox/MP3/Chinaski/2002 - Originál/09 - Umlci z Prahy.mp3 
D:/Dropbox/MP3/Chinaski/2002 - Originál/10 - `angri-la.mp3 
D:/Dropbox/MP3/Chinaski/2002 - Originál/11 - Dál....mp3 
D:/Dropbox/MP3/Chinaski/2002 - Originál/12 - NeYíkej,~e ne.mp3 
ila.mp3

同样的 QFile 工作返回废话:

ff = QFile("D:\\Dropbox\\MP3\\Chinaski\\2002 - Originál\\06 - Žil byl....mp3")
print(ff.fileName())
print(ff.fileName().encode())

> D:/Dropbox/MP3/Chinaski/2002 - Originál/06 - }il byl....mp3
> b'D:/Dropbox/MP3/Chinaski/2002 - Origin\xc3\xa1l/06 - }il byl....mp3'

# expected this byte path
print(b'D:/Dropbox/MP3/Chinaski/2002 - Origin\xc3\xa1l/06 - \xc5\xbdil byl....mp3'.decode())

> D:/Dropbox/MP3/Chinaski/2002 - Originál/06 - Žil byl....mp3

现在呢?我用 .encode 和 .decode 做了一些恶作剧,但即显然超过 8 位的 char 'Ž' 被转换为 '}',所以正确的信息已经丢失。这里发生了一些不好的事情。

  • Windows 8.1 x64
  • Python 3.4.2 x32
  • PyQt4-4.11.2-gpl-Py3.4-Qt4.8.6-x32.exe

由于 Python 2.7 的 unicode 噩梦,我已将代码移植到 Python 3。有人知道吗?

编辑1:

这是原始代码片段:

@pyqtSlot(str)
def scanFiles(self, targetDir):
    """
    Thread worker! Called asynchronously from main thread.
    The final data are sent to media parser in another thread.
    @type targetDir: str
    """
    # if target dir is already a file
    if targetDir.endswith(self.fileNamesFilter):
        logger.debug("Scanned target dir is a file.")
        self.parseDataSignal.emit([targetDir])
        self.parseDataSignal.emit([])             # end flag for media parser
        return

    flags = QDirIterator.Subdirectories | QDirIterator.FollowSymlinks if self.followSym else QDirIterator.Subdirectories
    dirIter = QDirIterator(targetDir, flags)
    result = []
    n = 0

    logger.debug("Dir iterator initialized, starting recursive search and parsing.")
    while dirIter.hasNext():
        path = dirIter.next()
        if path.endswith(self.fileNamesFilter):    # little bit slower than using regex (few ms), but more readable
            result.append(path)

            n += 1
            if n == self.SEND_LIMIT:
                self.parseDataSignal.emit(result)
                n = 0
                result = []

    if result:
        self.parseDataSignal.emit(result)

    logger.debug("Recursive search finished, sending finish_parser flag.")
    self.parseDataSignal.emit([])

【问题讨论】:

    标签: python-3.x unicode qt4 pyqt4


    【解决方案1】:

    我找到了问题所在。我一直在使用旧版本的 PyQt4-4.10.4,它显然有这个 bug。最新版本的 PyQt4-4.11.2 和 PyQt5 版本一样工作得很好。我忽略了版本号更改,我的错。

    【讨论】:

      猜你喜欢
      • 2014-07-19
      • 1970-01-01
      • 2012-03-09
      • 2015-10-06
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多