QMediaPlayer 错误解析 url 与 Windows 上的西里尔文
QMediaPlayer wrong parse url with cyrillic on Windows
我正在尝试播放翻译:
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 此文本为每个符号播放“Знак опроса”(这意味着 "question mark" 在英语中)。这个问题只存在于西里尔字母中。
在 Linux 上,这段代码工作正常。
我做错了什么?编码有问题吗?
正如 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
我正在尝试播放翻译:
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 此文本为每个符号播放“Знак опроса”(这意味着 "question mark" 在英语中)。这个问题只存在于西里尔字母中。 在 Linux 上,这段代码工作正常。
我做错了什么?编码有问题吗?
正如 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