QString 中unicode转汉字

时间:2023-01-04 20:25:05
 一个txt文件,内容是  \u5f6d\u65af\u9676.....

我使用qstring 读进来的,qstring中的内容就是"\u5f6d\u65af\u9676"。想要把他们转换成汉字。请指点一下~
请给出具体的转换方法,谢谢

8 个解决方案

#1


//将文件1中所有'\uAABB'替换为'\xBB'+'\xAA','C'替换为'C\x00',且文件头加'\xFF\xFE',结果保存到文件2中。
#include <stdio.h>
FILE *f1,*f2;
int c,s,n,i;
char fuAABB[7];
int AA,BB;
void main(int argc,char **argv) {
    if (argc<3) {
        printf("%s 文件1 文件2\n将文件1中所有\"\\uAABB\"替换为\"\\xBB\\xAA\",\'C\'替换为\"C\\x00\",且文件头加\"\\xFF\\xFE\",结果保存到文件2中。\n",argv[0]);
        return;
    }
    f1=fopen(argv[1],"rb");
    if (NULL==f1) {
        printf("找不到文件[%s]!\n",argv[1]);
        return;
    }
    f2=fopen(argv[2],"wb");
    if (NULL==f2) {
        fclose(f1);
        printf("创建文件[%s]出错!\n",argv[2]);
        return;
    }
    fuAABB[6]=0;
    fputc(0xFF,f2);fputc(0xFE,f2);
    s=0;
    while (1) {
        c=fgetc(f1);
        if (EOF==c) {
            for (i=0;i<s;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
            break;//
        }
        switch (s) {
        case 0:
            if ('\\'==c) {
                n=0;
                fuAABB[n++]=c;
                s=1;
            } else {
                fputc(c,f2);fputc(0,f2);
            }
        break;
        case 1:
            if ('u'==c) {
                fuAABB[n++]=c;
                s=2;
            } else {
                for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
                fputc(c,f2);fputc(0,f2);
                s=0;
            }
        break;
        case 2:
            if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {
                fuAABB[n++]=c;
                s=3;
            } else {
                for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
                fputc(c,f2);fputc(0,f2);
                s=0;
            }
        break;
        case 3:
            if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {
                fuAABB[n++]=c;
                s=4;
            } else {
                for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
                fputc(c,f2);fputc(0,f2);
                s=0;
            }
        break;
        case 4:
            if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {
                fuAABB[n++]=c;
                s=5;
            } else {
                for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
                fputc(c,f2);fputc(0,f2);
                s=0;
            }
        break;
        case 5:
            if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {
                fuAABB[n++]=c;
                sscanf(fuAABB+2,"%02x%02x",&AA,&BB);
                fputc(BB,f2);fputc(AA,f2);
                s=0;
            } else {
                for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
                fputc(c,f2);fputc(0,f2);
                s=0;
            }
        break;
        }
    }
    fclose(f2);
    fclose(f1);
    printf("%s %s %s OK.\n",argv[0],argv[1],argv[2]);
}

#2


整个应用程序配置是unicode编码的话,就不需要转了,因为qstring中的内容就是unicode字符串。
否则的话,可以参考http://hi.baidu.com/dbzhang800/item/431f800fcb653e6dd55a1142

#3


追问:
如果直接定义 qstring temp= “\u53EB\u4EC0\u4E48\u540D”,能正常输出中文;问题是现在qstring的值是通过读取文件赋值的,试过多种方法军输出“\u53EB\u4EC0\u4E48\u540D”;求答案 QString 中unicode转汉字

#4


说明你读取文本的时候有问题,琢磨一下http://blog.csdn.net/liulihuo_gyh/article/details/8164262

引用 3 楼 xiazai1a2s3d 的回复:
追问:
如果直接定义 qstring temp= “\u53EB\u4EC0\u4E48\u540D”,能正常输出中文;问题是现在qstring的值是通过读取文件赋值的,试过多种方法军输出“\u53EB\u4EC0\u4E48\u540D”;求答案 QString 中unicode转汉字

#5


文件内容是一行:53EB4EC04E48540D;读到这些内容后我按每4位给加上一个‘\u’的,最终qstring的值变为“\u53EB\u4EC0\u4E48\u540D”,如何把这个内容转成中文,谢谢,麻烦说的明白些,

#6


这样当然是错误的,你可以这样做:
1、开辟一个char* str1;
2、使得str1[0]=0xeb,str1[1]=0x53,str1[2]=0xc0,str1[3]=0xb4,等等按照这样的规律下去;
3、把str1转为QString类型。

引用 5 楼 xiazai1a2s3d 的回复:
文件内容是一行:53EB4EC04E48540D;读到这些内容后我按每4位给加上一个‘\u’的,最终qstring的值变为“\u53EB\u4EC0\u4E48\u540D”,如何把这个内容转成中文,谢谢,麻烦说的明白些,

#7


推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose  //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

#8


void HexDump(char *buf,int len) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%04x -",i);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

#1


//将文件1中所有'\uAABB'替换为'\xBB'+'\xAA','C'替换为'C\x00',且文件头加'\xFF\xFE',结果保存到文件2中。
#include <stdio.h>
FILE *f1,*f2;
int c,s,n,i;
char fuAABB[7];
int AA,BB;
void main(int argc,char **argv) {
    if (argc<3) {
        printf("%s 文件1 文件2\n将文件1中所有\"\\uAABB\"替换为\"\\xBB\\xAA\",\'C\'替换为\"C\\x00\",且文件头加\"\\xFF\\xFE\",结果保存到文件2中。\n",argv[0]);
        return;
    }
    f1=fopen(argv[1],"rb");
    if (NULL==f1) {
        printf("找不到文件[%s]!\n",argv[1]);
        return;
    }
    f2=fopen(argv[2],"wb");
    if (NULL==f2) {
        fclose(f1);
        printf("创建文件[%s]出错!\n",argv[2]);
        return;
    }
    fuAABB[6]=0;
    fputc(0xFF,f2);fputc(0xFE,f2);
    s=0;
    while (1) {
        c=fgetc(f1);
        if (EOF==c) {
            for (i=0;i<s;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
            break;//
        }
        switch (s) {
        case 0:
            if ('\\'==c) {
                n=0;
                fuAABB[n++]=c;
                s=1;
            } else {
                fputc(c,f2);fputc(0,f2);
            }
        break;
        case 1:
            if ('u'==c) {
                fuAABB[n++]=c;
                s=2;
            } else {
                for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
                fputc(c,f2);fputc(0,f2);
                s=0;
            }
        break;
        case 2:
            if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {
                fuAABB[n++]=c;
                s=3;
            } else {
                for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
                fputc(c,f2);fputc(0,f2);
                s=0;
            }
        break;
        case 3:
            if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {
                fuAABB[n++]=c;
                s=4;
            } else {
                for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
                fputc(c,f2);fputc(0,f2);
                s=0;
            }
        break;
        case 4:
            if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {
                fuAABB[n++]=c;
                s=5;
            } else {
                for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
                fputc(c,f2);fputc(0,f2);
                s=0;
            }
        break;
        case 5:
            if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {
                fuAABB[n++]=c;
                sscanf(fuAABB+2,"%02x%02x",&AA,&BB);
                fputc(BB,f2);fputc(AA,f2);
                s=0;
            } else {
                for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
                fputc(c,f2);fputc(0,f2);
                s=0;
            }
        break;
        }
    }
    fclose(f2);
    fclose(f1);
    printf("%s %s %s OK.\n",argv[0],argv[1],argv[2]);
}

#2


整个应用程序配置是unicode编码的话,就不需要转了,因为qstring中的内容就是unicode字符串。
否则的话,可以参考http://hi.baidu.com/dbzhang800/item/431f800fcb653e6dd55a1142

#3


追问:
如果直接定义 qstring temp= “\u53EB\u4EC0\u4E48\u540D”,能正常输出中文;问题是现在qstring的值是通过读取文件赋值的,试过多种方法军输出“\u53EB\u4EC0\u4E48\u540D”;求答案 QString 中unicode转汉字

#4


说明你读取文本的时候有问题,琢磨一下http://blog.csdn.net/liulihuo_gyh/article/details/8164262

引用 3 楼 xiazai1a2s3d 的回复:
追问:
如果直接定义 qstring temp= “\u53EB\u4EC0\u4E48\u540D”,能正常输出中文;问题是现在qstring的值是通过读取文件赋值的,试过多种方法军输出“\u53EB\u4EC0\u4E48\u540D”;求答案 QString 中unicode转汉字

#5


文件内容是一行:53EB4EC04E48540D;读到这些内容后我按每4位给加上一个‘\u’的,最终qstring的值变为“\u53EB\u4EC0\u4E48\u540D”,如何把这个内容转成中文,谢谢,麻烦说的明白些,

#6


这样当然是错误的,你可以这样做:
1、开辟一个char* str1;
2、使得str1[0]=0xeb,str1[1]=0x53,str1[2]=0xc0,str1[3]=0xb4,等等按照这样的规律下去;
3、把str1转为QString类型。

引用 5 楼 xiazai1a2s3d 的回复:
文件内容是一行:53EB4EC04E48540D;读到这些内容后我按每4位给加上一个‘\u’的,最终qstring的值变为“\u53EB\u4EC0\u4E48\u540D”,如何把这个内容转成中文,谢谢,麻烦说的明白些,

#7


推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose  //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

#8


void HexDump(char *buf,int len) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%04x -",i);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……