[理解] C/C++ 字符编码
2018-03-27 本文已影响0人
CrazyTiger
直接说说我的理解。
char与wchar_t
- 这两个类型是C++定义的类型。
用char定义的字符串,对应的字符集是扩展的ANSI,在简体中文的操作系统上,就是gb2312字符集。
用wchar_t定义的字符串,对应的字符集是Unicode,UTF16编码方式,这是一个定长的编码方式。
C/C++定义的就这两种,没有再多了。假设要增加一种,比如UTF8的编码方式的,那么就要顶一个新类型,比如kchar_t?
const char* pStr1 = "你好世界A";
// const wchar_t* pStr2 = "你好世界A"; // 编译失败
const wchar_t* pStr2 = L"你好世界A";
printf("%d\n", strlen(pStr1)); // 打印9。9个字节,考虑到"\0",pStr1实际上是10个字节。
printf("%d\n", wcslen(pStr2)); // 打印5。10个字节,考虑到"\0",pStr2实际上是12个字节。
- char与wchar_t的相互转化
可以使用利用Windows API中的函数 WideCharToMultiByte 和 MultiByteToWideChar。
代码网上很多,暂时不贴了。
VS2005的CharacterSet设置
- 有两个可以设置:Multi-Byte Character Set和Unicode Character Set。
- 这个设置,只是通过预编译宏,修改一些宏定义,参数类型。比如MessageBox使用MessageBoxA版本还是MessageBoxW版本。对char还有wchar_t没有什么影响。
WINUSERAPI
int
WINAPI
MessageBoxA(
__in_opt HWND hWnd,
__in_opt LPCSTR lpText,
__in_opt LPCSTR lpCaption,
__in UINT uType);
WINUSERAPI
int
WINAPI
MessageBoxW(
__in_opt HWND hWnd,
__in_opt LPCWSTR lpText,
__in_opt LPCWSTR lpCaption,
__in UINT uType);
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif // !UNICODE
UTF8
基于Unicode字符集的一种变长编码方式,为了节省数据而创造出来的。常用语网络数据传输。
项目中的应用
- Data编辑器
数据结构使用wchar_t,持久化到文件的时候,直接持久化wchar_t,二进制的方式读写文件。 - 网络传输
数据结构,可以使用wchar_t,也可以使用char_t。绝大部分都是wchar_t,只用登录用的是char_t。收发协议,只要一直就可以了。网络发包最外层有没有压缩数据,就不知道了。先不管了。 - Lua配表文件
Lua文件是UTF8的。读写Lua的时候。部分怎么读写的,还要再看看??? - 国际化工具
还没看???
参考
带你玩转Visual Studio——带你理解多字节编码与Unicode码
C++ WINDOWS下 wchar_t *和char * 相互转化总结篇
彻底搞定char/wchar_t!
最后这篇文章要好好看看。
- CString
CString对应的字符串应该是TCHAR,TCHAR的定义是这样的,
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
- 通用性字符串
通用字符型TCHAR
ifdef UNICODE it is wchar_t(WCHAR)for Unicode platforms;
else it is char for ANSI and DBCS platforms.
通用字符串指针LPTSTR
ifdef UNICODE it is LPWSTR(wchar_t) for Unicode platforms;
else it is LPSTR (char) for ANSI and DBCS platforms.
通用通用常数字符串指针LPCTSTR
ifdef UNICODE it is LPCWSTR(const wchar_t) for Unicode platforms;
else it is LPCSTR (const char) for ANSI and DBCS platforms.