国际化的支持--多编码问题
概述:
在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平台也定义了自己的类型。
转载于:https://www.cnblogs.com/davidyang2415/archive/2012/06/01/2531090.html
国际化的支持--多编码问题相关推荐
- mysql选择utf 8编码_MySQL支持UTF-8编码全攻略
来源:网海拾贝 最近看到良多若干关于MySql支持utf-8编码的成绩,恰好自身也要用,去找了一下,没有写的很片面的. 清算了一下,供各人参考. 在一下效能器设置测试议决 效能器设置: window2 ...
- PostgreSQL数据库之国际化语言支持学习总结
目 录 学习参考书籍.网站或博文: PostgreSQL本国语言支持 官方文档,点击前往 GNU gettext官方文档 GNU gettext简介 PostgreSQL数据库之国际化语言支持学习总结 ...
- 让ubuntu下的eclipse支持GBK编码
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://leaze.blog.51cto.com/83088/195584 今天,把win ...
- mysql gbk支持_mysql如何支持gbk编码
mysql支持gbk编码的方法:首先修改[my.cnf]文件:然后建立库表时指定gbk字符集,代码为[>show cereate table tablename]:最后修改jdbc驱动即可. m ...
- 使用iconv-lite解决node当中不支持GBK编码的问题
1.Node环境当中不支持GBK编码 node.js当中的Buffer对象支持的编码格式的种类有限,大概有ascii.utf8.utf16le.ucs2.base64.binary.hex.不支持GB ...
- 如何让Sublime Text2支持GBK编码
有人说可以通过GBK包解决,但是在我这边尝试了之后没反应,好像没成功. 安装方法和 安装zen coding 一样,安装好Package Control之后,通过快捷键[ctrl+shift+p]调出 ...
- mysql 支持gbk_MySQL不支持GBK编码的解决方法
Linux下用packages安装的MySQL5.1,不支持GBK编码,只支持UTF8编码.具体表现: 在打开一个用GBK编码的数据库时,提示 ERROR 1273 (HY000): Unknown ...
- php 字符串中文截取,PHP 截取中文字符串(支持多种编码)
通过使用多种方法来实现中文字符串的完美截取,在未安装mbstring 和 iconv扩展情况下支持UTF-8.GBK.GB2312.BIG5编码,安装上述扩展后支持的编码更多,详细情况参考函数说明. ...
- 让ffmpeg支持10bit编码
文章版权由作者柯O德尔和博客园共有,请尊重并支持原创,若转载请于明显处标明出处:http://www.cnblogs.com/koder/ 最近因为工作需要,要进行265 10bit编码,于是从ffm ...
最新文章
- lr手工添加关联函数的步骤:
- move语句java_Oracle中的move命令
- rabbitmq常用的五种模型
- selenium 页面经常改变元素_selenium用jquery改变元素属性
- SCOM2007R2上监控TMG之部署Agent
- Centos 7.X 安装 supervisord
- RTL8762DW手环烧录方法
- iOS更新系统服务器出错,iPhone 更新失败怎么办?更新 iOS 常见的错误代码及解决方法...
- MAXIMO语言切换,以及设置多语言
- 镜像网络MW受邀亮相巴比特杭州区块链国际周
- JDBC如何防止SQL注入
- 自动化技术实现目录全览
- 怎么关闭win10虚拟机服务器,如何关闭Win10自带虚拟机?三种关闭Win10专业版系统hyper-v虚拟机的方法...
- 2013最新手机QQ源码源码下载
- 医学统计分析思路方法总结:实例
- HCIP-H12-221单选题库(5)
- 如何观看局域网内视频-利用个人电脑搭建简易NAS(笔记一)电脑端工作
- 韦东山二期驱动视频-热拔插驱动——RK3399自制linux系统不支持HDMI热拔插问题分析
- 水平集图像分割并行加速算法设计与实现(串行、OpenMP、CUDA)——串行实现篇
- 数理方程和连续介质力学 考试复习笔记