我正在尝试翻译:
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编码存储。
如果你不能以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