c++如何实现将\u开头的16进制unicode码转成对应字符

围城1994 2018-01-19 04:32:07
类似于这种\u002e\u0037\u002e\u0031\u0031\u005f\u0032\u0030\u0031\u0037\u0031\u0032\u0032\u0037\u002e\u0072\u0061\u0072\u0022\u007d\u005d\u007d 的unicode码转成对应字符
...全文
2081 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-01-20
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
围城1994 2018-01-19
  • 打赏
  • 举报
回复
有点用,但是我那个unicode码特别多,一个一个拆开转换会影响速度么
赵4老师 2018-01-19
  • 打赏
  • 举报
回复
仅供参考:
//将文件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]);
}

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧