zoukankan      html  css  js  c++  java
  • 多字节与Unicode

    编码知识

    一、Unicode与多字节(ANSI

    (1)Windows中,Unicode也称为宽字节,多字节也称为窄字节; VS中默认使用Unicode编码,在项目属性>>配置属性>>常规>>字符集中可选择Unicode字符集或者多字节字符集

    (2) Unicode与多字节函数版本、字符、字符串类型的区别

    Win32 API中大部分参数有字符串的函数都有两个版本

    以A结尾,代表多字节版本 以W结尾,代表Unicode版本 根据版本自动选择的
    如:CreateEventA 如:CreateEventW 如:CreateEvent

    C运行库也有很多类似的函数

    多字节版本 Unicode版本 自适应版本
    strcpy wcscpy _tcscpy
    strcat wcscat _tscscat
    strlen wcslen _tcslen

    函数有两种,所以字符也有两种

    多字节字符 Unicode字符 自适应字符
    char wchar_t TCHAR

    (3) 常见Win32字符串类型

    LPSTR、LPWSTR、LPTSTR、LPCTSTR

    LP前缀,代表指针;STR后缀代表字符串

    LPSTR:代表多字节

    LPWSTR:代表Unicode

    LPTSTR:T自适应

    LPCTSTR:C代表const+T代表自适应

    备注:变量类型使用自适应类型后如LPTSTR,相关字符串需要用TEXT()进行包裹

    	const char* str = "hello";
    	const wchar_t*  wstr = L"hello";
    	const TCHAR* tstr = TEXT("hello");
    

    (4)关于_T()

            #ifdef _UNICODE 
            #define _T(X) L ## X   //Unicode版本
            #else
            #define _T(X) X     //多字节版本
            #endif
    

    (5)Unicode与多字节的选择

    1.Unicode程序环境适应能力强,不会出现乱码问题

    2.Unicode程序运行速度比多字节程序快。原因:Windows内部都是使用Unicode编码,多字节函数会将参数转码后交给Unicode函数

    3.控制后台可使用多字节,GUI程序最好使用Unicode

    二、Unicode

    (1)Unicode实现方式:UTF-32

    以4个byte为编码单元进行定长存储,调度器一次性下发4个byte进行存储任务

    主要有两种方式:

    大端法UTF-32BE:地址由小向大增加,而数据从高位往低位放 ,在网络上传输数据普遍采用的都是大端

    小端法UTF-32LE:地址由小向大增加,而数据从低位往高位放,在英特尔处理器,Windows10操作系统,采用小端法。

    (2)UTF-16

    也有大小端模式

    UTF-16 LE是windows上默认的Unicode编码方式,使用wchar_t表示。所有wchar_t *类型的字符串(包括硬编码在.h/.cpp里的字符串字面值)

    char chinese[] = "你";  
    //大小为3个byte,一个char存储结束符,两个char存储汉字字符‘你’   1char:1byte
    wchar_t wchinese[] = L"你";  
    //大小为4个byte, 一个wchar_t存储结束符,一个wchar_t存储汉字字符‘你’  1wchar_t:2byte(window下)
    auto size = sizeof(chinese);  // 3 byte
    auto wsize = sizeof(wchinese);  // 4 byte
    auto len = strlen(chinese); // 2个字符(除去结束符)
    auto wlen = wcslen(wchinese); // 1个字符(除去结束符)
    

    优势:就是大多数情况下一个wchar_t表示一个字符(包括中文字符)

    坑:char *类型的字面值,最终内存使用何种编码方式完全取决于当前文件的编码方式

    备注:在Windows上应该铭记没有char / std::string这种类型的字符/字符串,只有wchar_t / char16_t / std::wstring / std::u16string

    (3)UTF-8

    优势:无字节序的概念,不用考虑大小端问题,适用与字符串的网络数据传输

    劣势:如上代码,一个char并不能表示一个汉字字符,往往需要两个char

    三、ANSI

    (1)概念

    可以认为ANSI / MBCS (多字节字符集) / 本地编码是同一个概念,不同的国家和地区制定了不同的标准,有GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准,ASCII就是美国国家的ANSI标准,一个国家的代码到另一个国家使用,有可能由于编码标准不一致,导致乱码,于是才有了万国码Unicode,各国通用。

    总结

  • 相关阅读:
    Java实现网易163邮箱好友通讯录的解析功能(带源码)
    wordpress优化第四招 修改评论模板,留住客户,让评论在新的页面打开。
    wordpress优化 使用SAE提供的jquery.js替代wordpress原生的
    出售wordpress的淘宝客主题一套
    做了一个可以生成在线mp3 flash播放器的网站
    wordpress优化第三招 开启gzip减少网页流量
    20多个常用的免费WebService接口
    wordpress优化第一招 压缩css和js减少流量提高博客速度(尤其适用SAE)
    Linux学习笔记10常用操作命令(useradd命令、passwd 命令)
    Linux学习笔记08linux文本处理(cat命令、more命令、head命令、tail命令)
  • 原文地址:https://www.cnblogs.com/main404/p/12319230.html
Copyright © 2011-2022 走看看