在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相互转码的支持:
std::codecvt_utf8 封装了UTF8相关的编码转换
std::codecvt_utf16 封装了UCS2相关的编码转换
std::codecvt_utf8_utf16 封装了UTF8与UCS2的编码转换
 
 
对于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++11之后,对源代码增加了UTF8和UCS4的支持(Windows内部使用Unicode,因为nt内核用的是ucs2,那是89年,utf8到了92年才发明出来)的更多相关文章

  1. Qt 5.11的QChar、QString、QTextBoundaryFinder和双向文本算法现在完全兼容Unicode 10

    本文翻译自:Qt 5.11 released 原文作者: Qt公司CTO兼Qt开源项目维护官Lars Knoll翻译校审:Richard.Hongfei.Haipeng 5月22日,我们提发布了Qt ...

  2. UTF-8、GB2312都支持的汉字截取函数

    <?php/*Utf-8.gb2312都支持的汉字截取函数cut_str(字符串, 截取长度, 开始长度, 编码);编码默认为 utf-8开始长度默认为 0*/ function cut_str ...

  3. Linux 平台和 Windows平台下 Unicode与UTF-8互转

    Windows: unsigned char * make_utf8_string(const wchar_t *unicode) { , index = , out_index = ; unsign ...

  4. Windows Phone App Studio发布重要更新-支持Windows 8.1 源代码生成

    自2013年8月Apps Team发布Windows Phone App Studio以来,由于其低入门门槛和较好的易用性,用户和项目数量增长迅速,从Windows Phone Developer B ...

  5. LINUX 上源代码安装与配置samba服务,支持从windows上读写LINUX文件。

    ###动机###在windows编写代码文件比较方便,因为有source insight.但是需要在LINUX上编译.一种办法就是使用samba文件共享. [1] 下载samba代码.按照config ...

  6. svn服务支持网页显示并增加在线预览功能,支持视频在线播放

    1.svn服务器支持网页显示 VisualSVN Server是一个非常不错的SVN Server程序,方便,直观,用户管理也异常方便.不过,它本身并没有提供在线修改密码的功能.由于在实际使用过程中, ...

  7. python中文utf8编码后是占3个字符,unicode汉字为2字节

    一个中文utf8编码后是占3个字符,所以求长度的函数可以这样写 def str_len(str): try: row_l=len(str) utf8_l=len(str.encode('utf-8') ...

  8. C语言编码转换gb2312 to utf8,utf8 to gb2312 代码,GCC编译,支持Windows、Linux

    编译:gcc -o f.exe f.c -liconv #include <stdio.h> #include <stdlib.h> #include <stddef.h ...

  9. windows sever2003安装Wamp 2.5不成功——VC 11不支持Windows Server 2003和win XP?

    Windows Server 2003 安装Wamp 2.5不成功Wampserver 2.5 will not run on Windows XP 报错信息:C:\wamp\bin\apache\a ...

随机推荐

  1. Linux查看代码量

    利用find  xargs  wc可方便的计算出某个目录下源文件的代码量find sourcecode_dir_path -type f -name "*.c" -print0 | ...

  2. Android 连接Wifi和创建Wifi热点 demo

    android的热点功能不可见,用了反射的技术搞定之外. Eclipse设置语言为utf-8才能查看中文注释 上代码: MainActivity.java package com.widget.hot ...

  3. Array.asList:数组转list时你一定要知道的“陷阱”!

    最近开发中,业务上处理,经常用到asList方法,这让我不经想起了它的很多容易让人犯错的地方或者误解的地方,所以就想抽出时间来,整理一下,和大家分享出来,深夜了,话不多说,主要以代码为主,简易的代码, ...

  4. MFC 中的 “printf” 函数

    怀念C语言的我,MFC没法使用的C语言printf函数,于是: int MFCprintf(const char* m_data, ...){ CString str; char printf_buf ...

  5. 开发部署一个简单的Servlet

    Servlet是一个执行在服务器端的Java Class文件,载入前必须先将Servlet程序代码编译成.class文件,然后将此class文件放在servlet Engline路径下.Servlet ...

  6. activiti总结

    1.activiti如何修改登录用户名?在哪个数据库里面添加. 2.activiti的启动和部署在http://activiti.org/userguide/index.html#demo.setup ...

  7. java 自定义注解以及获得注解的值

    1.自定义注解 import java.lang.annotation.*; @Documented @Target(ElementType.FIELD) @Inherited @Retention( ...

  8. myeclipse 8.5打开文件Could not open the editor: Invalid thread access 异常

    最近打开了一个好久没用的myeclipse 8.5下的工作区间,导入一个项目,想打开文件编辑提示Could not open the editor: Invalid thread access

  9. oracle 分布式数据库

    分布式数据库的数据库链路是单向的

  10. PULL生成XML文件

    package xmlpulldemo; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...