C++11之后,对源代码增加了UTF8和UCS4的支持(Windows内部使用Unicode,因为nt内核用的是ucs2,那是89年,utf8到了92年才发明出来)
2016-08-22 01:14
309 查看
在C++编程中, 我们常打交道的无非是编辑器和编译器, 对编辑器起来说,我们常遇到就是乱码问题, 比如中文注释显示或是保存不了等, 解决办法就是把你的文件保存成Unicode(UTF8)。
对于编译器来说, 编码方式取决于它对C++标准的支持程度, 比如C++ 11以前,字符串我们只能指定成2种:一种是MBCS,如char* p="abc哈哈"; 还有一种是UCS2, 比如wchar_t*p = L"abc哈哈", 这样编译器就知道你要表示的字符串类型。C++11之后,标准增加了UTF8和UCS4的支持, 比如char* p=u8"abc哈哈"表示UTF8,wchar_t* p=u"abc哈哈"表示UCS2(实际上和L"xxxx"一样), char32_t* p=U"abc哈哈"表示UCS4。这里要区分编译期和运行期, 尽管C++11之前在编译期我们没法告诉编译器我们这个常量串是UTF8格式的,但是程序运行期我们还是可以使用所有的编码式(MBCS/UTF8/UCS2/UCS4), 因为这些最终在内存里都是二进制流。
另外C++11还增加了UTF8, UCS2, UCS4相互转码的支持:
对于C++跨平台开发, 我们经常遇到的就是默认用那种编码方式的问题,我们会发现Windows 的UCS2解决方案对其他平台来说是个异类, 一般来说有2种解决方法:
一种是统一用UTF8 , 但是这样对Windows来说有点麻烦, 因为Windows的API都是UCS2的,所以这种方式意味着任何字符串在传给Windows API 之前都要从UTF8转成UCS2; 还有一种就是用#define宏了, Windows上将字符串相关宏全都定义成UCS2, 其他平台则全都定义成UTF8, 该方式要求就你在写代码时头脑要比较清醒,因为同样的代码在不同平台上的编码格式是不一样的。
一直很好奇,谁知道Windows为什么不用UTF8,非要搞得和其他平台不一样?
因为nt内核用的是ucs2,那是89年,utf8到了92年才发明出来。
http://www.cppblog.com/weiym/archive/2015/07/25/211370.html
对于编译器来说, 编码方式取决于它对C++标准的支持程度, 比如C++ 11以前,字符串我们只能指定成2种:一种是MBCS,如char* p="abc哈哈"; 还有一种是UCS2, 比如wchar_t*p = L"abc哈哈", 这样编译器就知道你要表示的字符串类型。C++11之后,标准增加了UTF8和UCS4的支持, 比如char* p=u8"abc哈哈"表示UTF8,wchar_t* p=u"abc哈哈"表示UCS2(实际上和L"xxxx"一样), char32_t* p=U"abc哈哈"表示UCS4。这里要区分编译期和运行期, 尽管C++11之前在编译期我们没法告诉编译器我们这个常量串是UTF8格式的,但是程序运行期我们还是可以使用所有的编码式(MBCS/UTF8/UCS2/UCS4), 因为这些最终在内存里都是二进制流。
另外C++11还增加了UTF8, UCS2, UCS4相互转码的支持:
std::codecvt_utf8 | 封装了UTF8相关的编码转换 |
std::codecvt_utf16 | 封装了UCS2相关的编码转换 |
std::codecvt_utf8_utf16 | 封装了UTF8与UCS2的编码转换 |
一种是统一用UTF8 , 但是这样对Windows来说有点麻烦, 因为Windows的API都是UCS2的,所以这种方式意味着任何字符串在传给Windows API 之前都要从UTF8转成UCS2; 还有一种就是用#define宏了, Windows上将字符串相关宏全都定义成UCS2, 其他平台则全都定义成UTF8, 该方式要求就你在写代码时头脑要比较清醒,因为同样的代码在不同平台上的编码格式是不一样的。
一直很好奇,谁知道Windows为什么不用UTF8,非要搞得和其他平台不一样?
因为nt内核用的是ucs2,那是89年,utf8到了92年才发明出来。
http://www.cppblog.com/weiym/archive/2015/07/25/211370.html
相关文章推荐
- 转 C++11与Unicode及使用标准库进行UTF-8、UTF-16、UCS2、UCS4/UTF-32编码转换 utf8转utf16 utf16转utf8
- C++11与Unicode及使用标准库进行UTF-8、UTF-16、UCS2、UCS4/UTF-32编码转换
- C++11与Unicode及使用标准库进行UTF-8、UTF-16、UCS2、UCS4/UTF-32编码转换
- C++11与Unicode及使用标准库进行UTF-8、UTF-16、UCS2、UCS4/UTF-32编码转换
- Windows下Unicode(UCS2),UTF8,GBK(GB2312)互转
- Windows下Unicode(UCS2),UTF8,GBK(GB2312)互转
- C#把内存里的utf8字符串转成C#内部使用的Unicode
- 内网增加F5为SFB前端池配置HLB之后,内部用户无法使用网页加入Skype for business会议
- 把程序源代码的文件编码统一为UTF8,行结束符使用\n,不要再用Windows下的记事本工具。
- DELPHI语法基础学习笔记-Windows 句柄、回调函数、函数重载等(Delphi中很少需要直接使用句柄,因为句柄藏在窗体、 位图及其他Delphi 对象的内部)
- windows 2003 server 在装了sp1之后对asp.net的支持产生安全错误
- Windows使用GCC调用DLL内部的类
- 在Windows下编译GDAL源代码并使支持C#开发
- 一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码)
- 字符集之:如何(在程序中)加入并使用 Unicode 以实现外语支持
- MPICH NT 1.2.5 安装使用简要说明(windows)
- 如何使用 Windows NT boot loader 来启动 Linux
- 微软认证操作系统技术支持工程师(MCDST) MCDST(Microsoft Certified Desktop Support Technician)认证能够证明学员拥有足够的技能用来成功地支持那些使用Microsoft Windows操作系统
- Acro Multi-Language多语言元件增加Unicode支持
- NT主要内核结构 windows 2000