zoukankan      html  css  js  c++  java
  • 国际化的支持多编码问题

    概述:

        在windows平台遇到了unicode编码的问题,上网搜索了下感觉有必要记录下来。

    要点:

    对编码的个人理解:

        说道编码的话我就想到三个角色:计算机--编码--用户。

    计算机角度:

        在计算机中存储的是二进制串,而计算机只需要完成保存好二进制串并提供访问接口就可以了。

    编码角度:

        二进制的一位只能表示0和1两个概念,所以将8位作为一个字节来管理二进制串更有意义,然后延伸出更多的计量单位(K/M/G/T)。

        二进制本身也表示数字的概念,两个相邻字节的二进制串分开表示两个数字而放在一起则表示的是另一个数字。这样的话就需要记好存储的时候是作为一个字节存储的还是两个字节存储的,这个问题想想就感觉很麻烦,这个时候就需要想办法--类型系统就出现了。每个类型占用固定的字节,先把数据归类到不同的类型再将数据写入到计算机中,在读取的时候子要按照存储的类型顺序读取就没问题了。

        有了类型系统后数字可以字节转换为二进制串,在根据二进制串占用的字节数分为不同的数字类型。

        到目前位置解决了数字存储到计算机的问题了,但是人们最常使用的还是字符。对于英文,语句和单词由字母组成,而字母总共有26个--如果算上大小写的话也就52个字母,一个字节的二进制串能表示的范围足够了,同时还可以表示很多常用的其他字符,这就是ASCII码表。这个时候只要声明要存储一个字母,计算机会根据ASCII表查找到对应的二进制串并存储到计算机中。在读取的时候也需要提供类型信息,计算机就会比照ASCII码表正确显示字母了。

        到这里就应该明白了编码就是将二进制串和字符的一一映射关系了。

    用户:

        对于不同语言,构成的基础是不同的--英文只需要表示好52个大小写字母就可以了,而汉语光常用汉字就几千个。如果从全球考虑的话ASCII码表就不合适了。这样就产生了UNICODE、UTF8等编码。

    遇到的问题:

        考虑到国际化的问题,C++有宽字符。同时windows也存在unicode编码,同时windowXP/NT/2000/VISTA/7提供的API都提供了相应的UNICODE接口。

    宽字符:

    ANSI:char,相关的函数都是学习的时候提到的;

    宽字符:wchar_t/wchar,表示unicode宽字符占用两个字节;

    操作:

        宽字符在声明字符串的时候需要添加前缀L来表示宽字符,同时相关的宽字符的操作函数也不同,比如说长度计算函数wcslen(),输出函数wprintf()等。

    windows平台:

       在windows平台可以在编译的的时候选择是否编程成UNICODE编码的,这个时候windows提供了TCHAR,_tprintf(),_tcslen(),_TEXT(),_T()等方法可以定义自动根据编译选项操作的宏。比如:

    #ifdef _UNICODE
     typedef wchar_t _TCHAR;
     typedef wchar_t TCHAR;
     #define __T(x) L ## x
     #define _tprintf wprintf
     #define _tcslen wcslen
     ......
    #else
     typedef char _TCHAR;
     typedef char TCHAR;
     #define __T(x) x
     #define _tprintf printf
     #define _tcslen strlen
     ......
    #endif
    #define _T(x) __T(x)
    #define _TEXT(x) __T(x)

     

    同时:

    typedef char CHAR ;
    typedef wchar_t WCHAR ; // wc
    typedef CHAR * PCHAR, * LPCH, * PCH, * NPSTR, * LPSTR, * PSTR ;
    typedef CONST CHAR * LPCCH, * PCCH, * LPCSTR, * PCSTR ;
    typedef WCHAR * PWCHAR, * LPWCH, * PWCH, * NWPSTR, * LPWSTR, * PWSTR ;
    typedef CONST WCHAR * LPCWCH, * PCWCH, * LPCWSTR, * PCWSTR ;

     

    也有:

    #ifdef UNICODE
     typedef WCHAR TCHAR, * PTCHAR ;
     typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ;
     typedef LPCWSTR LPCTSTR ;
     #define __TEXT(quote) L##quote
    #else
     typedef char TCHAR, * PTCHAR ;
     typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ;
     typedef LPCSTR LPCTSTR ;
     #define __TEXT(quote) quote
    #endif

    小结:

        真心感觉到英语国家的便利啊。

        同时可以看到在windows平台也定义了自己的类型。

  • 相关阅读:
    new Date(str)返回 Invalid date问题
    时间倒计时
    js返回上一页并刷新 代码整理
    赋值变量值在标签里
    jQuery获取select选择的文本与值
    判断div里面的子集是否含有特定的类
    卷boot仅剩余XX空间
    ubuntu16.04 anaconda3安装
    ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
    毕业设计
  • 原文地址:https://www.cnblogs.com/davidyang2415/p/2531090.html
Copyright © 2011-2022 走看看