文章出处:http://www.yakergong.net/blog/archives/75
unicode实际上是个很复杂的主题,至少不是两个字节那么简单(实际上utf-8是变长的,utf-16也有代用对的概念).有兴趣可以参考一下《国际化软件开发》这本书,我所了解到的关于unicode的知识多数是从这本书上看来的,最早知道unicode是《Joel说软件》里面有一章提到,说:作为一个程序员,unicode是你必须知道的东西.
附带的xml文件是utf-8编码的,utf-8的编码是互联网上常用的格式,用utf-8还有一个好处就是在我的ubuntu系统上我仍然可以查看.要记住,windows操作系统的基本文本表示格式是utf-16.所以用库(我用的TinyXml)函数将xml读出后得到的实际上是utf-8编码的字符,不能在windows程序中直接使用.首先要转换一次,使用MultiByteToWideChar函数(Windows API).转换前要自己创建一个字符缓冲区,这个缓冲区的管理也是个麻烦问题,谁来释放内存呢?因为转换后的字符串要返回的,这样每个调用者都负责自己清理,实际上是很麻烦的事情.我现在的做法是用STL里的string,确切来说是wstring.这样会损失一些效率(如果是引用计数机制的实现的话就没有什么效率损失了),主要的好处还是在于不同部分的代码职责明确.
将utf-8编码的字符串转换为windows内部的unicode编码的代码如下:
using std::wstring; wstring utf_to_ws(const char *utf8) { int len = MultiByteToWideChar(CP_UTF8,0,utf8,strlen(utf8),NULL,0); if (len == 0) return wstring(TEXT("")); TCHAR *unicode = new TCHAR[len+1]; unicode[len]=L'\0'; MultiByteToWideChar(CP_UTF8,0,utf8,strlen(utf8),unicode,len+1); wstring ws(unicode); delete[] unicode; return ws; }
P.S.
如需将Unicode字符转换为ASCII格式,参见编写国际化软件的一些Tips
Reference
1.unicode科普
http://baike.baidu.com/view/40801.htm
2.我所知道的一些
windows操作系统的基本文本表示格式是utf-16.在windows处理任何基于代码页的数据都首先转换为UTF-16,并用unicode处理,在windowsAPI中例如MessageBox有两个版本,MessageBoxA和MessageBoxW,分别代表ANSI和宽字符版本,处理ANSI字符时首先转换为unicode字符.
3.样例xml文件
查看文件