用wstring存取xml中的unicode字符

文章出处: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文件
查看文件

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值