Chinaunix首页 | 论坛 | 博客
  • 博客访问: 280164
  • 博文数量: 76
  • 博客积分: 1500
  • 博客等级: 上尉
  • 技术积分: 594
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-05 23:43
文章分类

全部博文(76)

文章存档

2014年(4)

2013年(3)

2012年(20)

2011年(49)

分类: LINUX

2011-09-27 16:47:37

C/C++中的i18n(wcstombs和mbstowcs使用)(转帖)
2008-10-21 19:55

转载至http://aleung.blogbus.com/logs/242357.html

mbs: multi byte string, 用char作为存储类型, 一个字符可能对应1个或者多个char, 不能直接确定字符边界. charset不确定. 过去的程序都是采用mbs的.

wcs: wide character string, 用wchar_t作为存储类型, 一个字符对于一个wchar_t. 使用unicode编码, charset与OS相关, 在windows平台中为UTF16(UCS-2), 在大多数unix平台中为UTF32(UCS-4). 

国际化的程序都应该在内部使用wcs, 在输入输出时做mbs与wcs的转换.

mbs与wcs的转换函数: 
wcstombs/mbstowcs是实现转换的一对函数. wcs的charset是固定不可变的, 但是mbs的charset是可变的, 可能是ASCII, 可能是gb2312, 也可能是big5. wcstombs/mbstowcs是根据locale环境设置来决定mbs采用的charset的, 在程序中可以用setlocale来设定locale, 例如 setlocale(LC_ALL, "chinese")

程序启动时, locale设定为 LC_ALL="C", 用 setlocale(LC_ALL, "") 就可以设置成操作系统的locale设定.

Locale决定了当前程序运行的本地化设置方式, 但是在程序中可能需要作其他charset的转换, 例如程序本身语言设定为简体中文, 需要做big5与unicode的转换, 或者是其他两种charset的mbstombs转换, 这时wcstombs/mbstowcs就不能胜任了. 在unix平台中可以使用iconv来做这个转换(iconv lib也有windows版本), 在windows平台可以用MultiByteToWideChar/WideCharToMultiByte 函数.

参考资料:

----------------------------------------------------------------
wcstombs和mbstowcs使用

#include
setlocale(LC_ALL, ".936");
wcstombs(char * to,wchar_t * from,size_t _maxCount);
mbstowcs(wchar_t * to,char * from,size_t _maxCount);
阅读(795) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~