QMediaPlayer在Windows上使用西里尔文错误解析网址

时间:2018-02-15 14:37:54

标签: c++ windows qt cyrillic qmediaplayer

我正在尝试翻译:

QString language = "ru";
QString text = "Привет мир";
QUrl preparedUrl = QUrl("http://translate.googleapis.com/translate_tts?ie=UTF-8&client=gtx&tl=" + language + "&q=" + text);
QMediaPlayer *player = new QMediaPlayer;
player->setMedia(preparedUrl);
player->play();

在Windows上,此文本为每个符号播放“Знакопроса”(这意味着英语中的“问号”)。这个问题只存在于西里尔文中。 在Linux上,这段代码工作正常。

我做错了什么?编码有问题吗?

1 个答案:

答案 0 :(得分:0)

正如Evgeny所说,QString::fromUTF8可能会对您有所帮助,但前提是您使用的是Qt4。在Qt5中,QString(const char *)QString::operator=(const char *)都已使用QString::fromUTF8(根据文档)。

我认为您的问题是文件编码。确保您的c ++源文件以UTF-8编码存储。

如果您无法以UTF-8格式存储文件,还有QString::fromLocal8Bit可能对您有所帮助。

<强>更新 试过在Windows 7上,无法正常工作。考虑以下工作版本的概念证明。 #if 0块应与#else块相同,但也不起作用。我认为这是DirectShow后端的一个错误。您可能尝试让WMF支持运行,但我从未尝试过。

    QUrl preparedUrl = QUrl("http://translate.googleapis.com/translate_tts?ie=UTF-8&client=gtx&tl=ru&q=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82 %D0%BC%D0%B8%D1%80");
    QNetworkRequest request(preparedUrl);
#if 0
    QMediaPlayer *player = new QMediaPlayer;
    player->setMedia(request);
    player->play();
#else
    QNetworkAccessManager mgr;
    QNetworkReply * reply = mgr.get(request);
    QObject::connect(reply, &QNetworkReply::finished, [reply, preparedUrl]()
    {
        QByteArray * ba = new QByteArray(reply->readAll());
        QBuffer * buffer = new QBuffer(ba);
        buffer->open(QIODevice::ReadOnly);
        delete reply;

        QMediaPlayer *player = new QMediaPlayer;
        player->setMedia(preparedUrl, buffer);
        player->play();
    });
#endif