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

问题描述 投票:1回答:1

我正在尝试翻译:

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上,这段代码运行正常。

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

c++ windows qt cyrillic qmediaplayer
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.