Привет я разрабатываю приложение смс с открытым исходным кодом, и я использую Qt. Но сейчас у меня различные проблемы с кодировками.
Я использую эту библиотеку для различных кодирования и декодирования pdu https://sourceforge.net/projects/pdulib/
В gsm есть 3 основных кодировки По умолчанию 7-битный алфавит, UCS2 и 8-битные данные. Поэтому, когда для 7-битного кодирования библиотека ожидает аргумент std :: string, я передаю его так
QString message = lineEdit->toPlainText();
std::string msg_to_pass = message.toStdString();
Смс отправляется правильно, но при наличии символов с акцентом приходит смс с плохими символами, такими как ‘C?’ признак плохой кодировки / кодировки. Обратите внимание, что это показывает телефон. Так что ошибка декодирования очень низкая.
Но когда я использую кодировку UCS2
QString message = lineEdit->toPlainText();
std::wstring msg_to_pass = message.toStdWString();
поскольку библиотека требует std :: wstring для UCS2, символы с акцентом были напечатаны хорошо. Но проблема в том, когда я декодирую полученные смс. Я изменил функцию этой библиотеки в соответствии со своими потребностями, но опять же у персонажей с акцентом есть проблема. Вот функция
template<class MsgT>
void PrintUserData(const MsgT& msg, QString &message)
{
if (MsgT::DefaultAlphabet == msg.alphabet())
{
message = QString::fromStdString(msg.template userData<typename MsgT::DefaultUserData>().userData());
std::cout << "User Data: " << msg.template userData<typename MsgT::DefaultUserData>().userData() << std::endl;
}
else if(MsgT::UCS2Alphabet == msg.alphabet())
{
QTextStream ts(stdout);
message = QString::fromStdWString( msg.template userData<typename MsgT::UCS2UserData>().userData());
qInfo()<< message;
std::wcout << L"User Data: " << msg.template userData<typename MsgT::UCS2UserData>().userData() << std::endl;
}
else if(MsgT::EightBitDataAlphabet == msg.alphabet())
{
qInfo()<< "3";
const std::vector<unsigned char>& data = msg.template userData<typename MsgT::EightBitUserData>().userData();
std::cout << "User Data: ";
PrintBinary(data.begin(), data.end());
std::cout << std::endl;
}
}
Я тестировал различные библиотеки pdu для C ++, и это, кажется, лучше для меня.
Я думаю, что я делаю что-то плохое с std :: string и std :: wstring, но я не могу понять, что.
Также я знаю, что UCS2 — это UTF-16, но я читал, что есть небольшие различия.
Моя локаль FR (французский)
Я использую Qt 5.9
Извините за мой английский.
Задача ещё не решена.
Других решений пока нет …