gpt4 book ai didi

c++ - QMediaPlayer 在 Windows 上使用西里尔文错误解析 url

转载 作者:太空宇宙 更新时间:2023-11-04 12:51:37 28 4
gpt4 key购买 nike

我正在尝试播放翻译:

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

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

最佳答案

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

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

还有 QString::fromLocal8Bit 如果您不能以 UTF-8 格式存储文件,它可能会帮助您。


更新:在 Windows 7 上试过,不起作用。考虑以下工作版本的概念证明。 #if 0 block 应该与 #else block 相同,但也不起作用。我会认为这是 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

关于c++ - QMediaPlayer 在 Windows 上使用西里尔文错误解析 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48809774/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com