嗨,我正在开发一个开源短信应用程序,我正在使用 Qt。但现在我对编码有各种问题。我正在使用这个库进行各种 pdu 编码和解码https://sourceforge.net/projects/pdulib/ 在 gsm 中有 3 种主要编码默认 7 位字母、UCS2 和 8 位数据。所以当对于 7bit 编码库期望 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();
因为该库需要 UCS2 的 std::wstring ,所以带有重音的字符打印得很好。但问题是当我解码收到的短信时。我已经修改了这个库的功能以满足我的需要,但是带有重音的字符又出现了问题。这是功能
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;
}
}
我已经为 C++ 测试了各种 pdu lib,这对我来说似乎是最好的。我的想法是我对 std::string 和 std::wstring 做了一些坏事,但我不知道是什么。我也知道 UCS2 是 UTF-16,但我读到有一些小的差异。我的语言环境是 FR(法语) 我正在使用 Qt 5.9 对不起我的英语。