[代码] C++编码转化

1. char与wchar_t定义字符串

  1. char与wchar_t定义字符串的编码方式?
    char是扩展ANSI,在简体中文系统下,是GB2312。这是一种变长的编码方式。
    wchar_t
    是UTF16。这是一种定长的编码方式。
  2. GB2312的解码?
    根据数值来判断。具体数字不清楚,估计大于127的都是汉字的编码,[0-127]是ANSI。比如:如果遇到的是1个大于127的字符,那么就继续读1个字符,这两个字符,组成1个编码,找到一个汉子。如果遇到的是1个小于等于127的字符,那么就是1个ANSI字符。
  3. UTF16的解码?
    所有字符都是2个字节编码,编码都是唯一的。
int main()
{
    const char* text = "你好A<>";
    printf("len = %d\n", strlen(text));
    printf("sizeof(text[0]) = %d\n", sizeof(text[0]));
    for (int i = 0; i < strlen(text); i++)
    {
        printf("%d\n", text[i]);
    }

    const wchar_t* wtext = L"你好A<>";
    printf("len = %d\n", wcslen(wtext));
    printf("sizeof(wtext[0]) = %d\n", sizeof(wtext[0]));
    for (int i = 0; i < wcslen(wtext); i++)
    {
        printf("%d\n", wtext[i]);
    }

    getchar();
    return 0;
}
char与wchar_t的长度与编码

2. 根据指针转化编码

多字节编码:UTF8,GB2312等等
固定字节编码:Unicode(实际上就是UTF16)

  1. 多字节编码之间的转化,需要通过固定字节编码。
    比如:UTF8转GB2312:先把UTF8转为Unicode,再把转为Unicdoe->GB2312。
  2. 多字节编码与Unicode的转化,可以直接转。
    比如:UTF8与GB2312可以直接转。
  3. 代码中的len+1
    int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
    上面这行代码,会从gb2312指向的char*开始扫描,知道遇到\0,计算一共扫描了多少个字符(但不包括最后的\0),把这个数,返回到len上面。
    len+1,就是为了,在字符串最后加上一个\0。
//UTF-8到GB2312的转换
char* U2G(const char* utf8)
{
    // UTF-8 -> Unicode
    int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
    wchar_t* wstr = new wchar_t[len+1];
    memset(wstr, 0, len+1);
    MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len); 
    // Unicode -> GB2312
    len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
    char* str = new char[len+1];
    memset(str, 0, len+1);
    WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
    // 删除Unicode的Buffer
    if(wstr) delete[] wstr; 
    // 返回GB2312的Buffer
    return str;
}

//GB2312到UTF-8的转换
char* G2U(const char* gb2312)
{
    // GB2312 -> Unicode
    int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
    wchar_t* wstr = new wchar_t[len+1];
    memset(wstr, 0, len+1);
    MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
    // Unicode -> UTF-8
    len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
    char* str = new char[len+1];
    memset(str, 0, len+1);
    WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
    // 删除Unicode的Buffer
    if(wstr) delete[] wstr;
    // 返回UTF8的Buffer
    return str;
}

3. 在字符串末尾加\0是否必要

很多库函数,比如strlen,printf,都是根据\0判断字符串结束。
比如:下面的例子,memcpy的时候,没有把\0拷贝过来,那么printf,strlen就会打印出其他位置的内容。这是很危险的。

int main()
{
    const char* str = "abcde";
    char * non_zero_str = new char[5];
    memcpy(non_zero_str, str, sizeof(char) * 5);
    printf("non_zero_str = %s\n", non_zero_str);
    printf("strlen(non_zero_str) = %d\n", strlen(non_zero_str));
    getchar();
    return 0;
}
没有\0的后果

4. 硬编码的二进制文件读写

项目中有个策略文件,读写都是二进制的方式。
举例:写入1个int,1个char,10个char。读取1个int,1个char,10个char。这样肯定不会有问题。甚至是混合char与wchar_t都没有问题。因为读取和写入的顺序都是一一对应的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容