C++11 之字符集

 

  1. 基础概念理解

     1)通常我们将一个标准中能够表示所有字符的一个集合称为字符集,如Unicode字符集。

     2)在字符集中每个字符占用一个唯一的码位。如Unicode就有1114112个字符码使用0x0~0x10FFFF的16进制数唯一表示每一个 字符。

      3)由于计算机中通常时以字节为单位进行存储的,因此就要有一种编码方式对字符码位进行编码存储。如:基于Unicode字集的编码方式有:UTF-8(1-6个字节变长编码方式表示Unicode)、UTF-16、UTF-32。

     4)其它字符集ASCII、GB2312(简体中文及器相关符号,基于区位码编码方式),BIG5(繁体中文及其相关字符。2个字节表示一个汉字)

     5)ASCII以7个二进制为进行表示128个字符,因此其也可以理解为一种编码方式。

     6)不同的编码方式对于相同二进制字符集的解释结果时不同的,这就是网页有时候按不同编码方式显示会出现乱码的原因。

    7)由于众多的字符集带来的麻烦,因此ISO/Unicode两个组织联合发布了Unicode字符集,Unicode字符集仍然再发展中,因此过多种字符集及编码方式共存的情况在相当长的一段时间内仍然会存在。基础概念理解

  2. C++11对于Unicode支持的改进

     1)C++98标准中,定义了wchar_t来支持“Unicode”,由于wchar_t太宽容了,导致成员写的wcht_t的移植性不好。因为C++98 标准中wchar_t的宽度由编译器决定,这就出现了wchar_t通常在windows上被实现为16位宽,而Linux下实现为32位宽的情况发生。

    2)UTF_8 1~6个字节的变长编码,UTF-16 2个字节定长编码, UTF-32  4个子节的定长编码。

    3)系统上能否正常考到Unicode字符受:源文件的保存格式、编译器设置的编码格式、输出设备支持的编码类型。 C++11在语言层面上支持Unicode,由于Linux系统下shell、vi、g++等都依赖locale设定而采用UTF-8编码,因此UTF-16,UTF-32编码的字符不能正常显示。

  3. C++的编码转换 

     1)C++11说是ucchar头文件中有c16rttomb、 mbrttoc16、c32rttomb、mbrttoc32 等四个字符编码转换函数,但是尝试了下,没有这个头文件及函数。

    2)C++对编码转换新方法都源于C++的locale机制支持,locale描述的是一些必需知道的区域特征,如:程序运行的国家/地区的数字符号、日期表示、钱币符号等。通常知道了一个地区的locale,要使用不同的地区特征,则需要访问该locale的一个facet。 facet可以理解为locale的一些接口,比如:num_put/num_get、money_put/money_get、codecvt等。                            

     3) codecvt是一个模板类,实现从当前locale下的多字符编码字符串到多种Unicode编码转换的一个facet。每种facet负责不同类型的编码数据转换,现行编译支持的情况下,一种locale并不能支持所有的codecvt facet。程序员可以通过has_facet查看locale在本机的支持情况。例如:

    #inlude <locale>  
    #include <iostream>    
    using namespace std;

    int mian
    {
        //定义一个locale
        locale loc("en_US.UTF-8");
        
        //判断loc的facet的支持情况
        if (!has_facet<codecvt<wchar_t, char, mbstate_t>>(lc))
        {
            cout << "Do not support muti char to wchar_t facet" << endl;
        } 
        
        if (!has_facet<codecvt<char, char, mbstate_t>>(lc))
        {
            cout << "Do not support muti char to char facet" << endl;
        }
     
        if (!has_facet<codecvt<char16_t, char, mbstate_t>>(lc))
        {
            cout << "Do not support utf-16 to utf-8 facet" << endl;
        }


        if (!has_facet<codecvt<char32_t, char, mbstate_t>>(lc))
        {
            cout << "Do not support utf-32 to utf-8 facet" << endl;
        }
        return 0;
    }

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值