QT常用编码转换

文章介绍了在Qt编程中如何进行GBK和UTF-8编码的转换,以及如何在C++字符串类型(std::string和std::wstring)间通过QString进行桥梁转换的方法。

GBK转utf8

QString GBK2UTF8(QByteArray& inStr)
{
    QTextCodec* gbk = QTextCodec::codecForName("gbk");
    QTextCodec* utf8 = QTextCodec::codecForName("UTF-8");

    char* p = inStr.data();
    QString str = gbk->toUnicode(p);

    QByteArray utf8_bytes = utf8->fromUnicode(str);
    p = utf8_bytes.data();
    str = p;

    return str;

}
//使用示例
//std::string test("中文");
//QByteArray qbyte = QByteArray::fromStdString(test);
//QString result = GBK2UTF8(qbyte);

utf8转GBK

QString UTF82GBK(QByteArray &inStr)
{
    QTextCodec *gbk = QTextCodec::codecForName("gbk");
    QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");

    char *p = inStr.data();
    QString str = utf8->toUnicode(p);

    QByteArray utf8_bytes=gbk->fromUnicode(str);
    p = utf8_bytes.data();
    str = p;

    return str;
}
//使用示例
//std::string test(u8"中文");
//QByteArray qbyte = QByteArray::fromStdString(test);
//QString result = UTF82GBK(qbyte);

是否为UTF8编码

bool IsUTF8(const void* pBuffer, long size)
{
    bool IsUTF8 = true;
    unsigned char* start = (unsigned char*)pBuffer;
    unsigned char* end = (unsigned char*)pBuffer + size;
    int count = 0;
    while (start < end)
    {
        if (*start < 0x80) // (10000000): 值小于0x80的为ASCII字符
        {
            start++;
            count++;
        }
        else if (*start < (0xC0)) // (11000000): 值介于0x80与0xC0之间的为无效UTF-8字符
        {
            IsUTF8 = false;
            break;
        }
        else if (*start < (0xE0)) // (11100000): 此范围内为2字节UTF-8字符
        {
            if (start >= end - 1)
                break;
            if ((start[1] & (0xC0)) != 0x80)
            {
                IsUTF8 = false;
                break;
            }
            start += 2;
            count++;
        }
        else if (*start < (0xF0)) // (11110000): 此范围内为3字节UTF-8字符
        {
            if (start >= end - 2)
                break;
            if ((start[1] & (0xC0)) != 0x80 || (start[2] & (0xC0)) != 0x80)
            {
                IsUTF8 = false;
                break;
            }
            start += 3;
            count++;
        }
        else
        {
            IsUTF8 = false;
            break;
        }
        if(count>2){
            break;
        }
    }
    return IsUTF8;
}

std::string转std::wstring

QString::fromStdString(name).toStdWString()
//通过QString 做为桥梁可以实现

std::string转WCHAR*

const_cast<WCHAR*>(QString::fromStdString(name).toStdWString().c_str())
//通过QString 做为桥梁可以实现

std::wstring转std::string

QString::fromStdWString(name).toStdString()
//通过QString 做为桥梁可以实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烈火138

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值