C++:乱码之字符串编码

简介

经常在处理字符串的时候出现乱码,主要是字符串编码未正确处理。在这种情况下我们首先要分析清楚输入字符串的编码,经过处理的编码和最终输出的编码是否是正确处理的。

本章以内存分析方法跟踪字符集变化的过程,以了解字符存储与转换的编码问题。

宽字符和多字节

  • 宽字符和多字节是存储一个字符的字节不一样,和字符编码无关。多字节就是用一个字节表示一个字符,宽字符就是用≥2个字节表示一个字符。

    #include <string>
    #include <iostream>
    
    void printMem(char* pMem, size_t size)
    {
        for (std::size_t index = 0; index < size; index++)
        {
            if (index != 0)
            {
                std::cout << " ";
            }
    
            std::cout << std::hex << (int)pMem[index];
        }
    
        std::cout << std::endl;
    }
    
    int main()
    {
        std::string str1("AB");
    
        printMem(str1.data(), str1.length() + 1);
    
        std::wstring str2(L"AB");
        printMem((char*)str2.data(), (str2.length() + 1) * 2);
    
        return 0;
    }
    
    // 结果输出:
    // 41 42 0
    // 41 0  42 0 0 0
    

查看系统编码

  • 查看字符集编码

    windows在cmd命令下输入chcp命令可查看。如下:

    在这里插入图片描述

    代码页是字符集编码的别名,也有人称"内码表。下表列出了所有支持的代码页及其国家(地区)或者语言:

    代码页       国家(地区)或语言 
    437          美国 
    708          阿拉伯文(ASMO 708)
    720          阿拉伯文(DOS)
    850          多语言(拉丁文 I) 
    852          中欧(DOS) - 斯拉夫语(拉丁文 II) 
    855          西里尔文(俄语) 
    857          土耳其语 
    860          葡萄牙语 
    861          冰岛语 
    862          希伯来文(DOS)
    863          加拿大 - 法语 
    865          日耳曼语 
    866          俄语 - 西里尔文(DOS) 
    869          现代希腊语
    874          泰文(Windows)
    932          日文(Shift-JIS)
    936          中国 - 简体中文(GB2312)现在是GBK了,GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准。
    949          韩文
    950          繁体中文(Big5)
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xiaobaiPlayGame

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

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

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

打赏作者

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

抵扣说明:

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

余额充值