为什么一定要调用 setlocale 呢? 因为在 C/C++ 语言标准中定义了其运行时的字符集环境为 "C" ,也就是 ASCII 字符集的一个子集。使用setlocal改变整个应用程序的字符集编码方式(wcstombs使用前要设置 setlocale (LC_ALL, "chs"); )
setlocale
配置地域化信息。
语法: string setlocale(string category, string locale);
返回值: 字符串
函数种类: 操作系统与环境
|
|
|
| 内容说明 |
本函数用来配置地域的信息。参数 category 有下列的选择:
- LC_ALL 包括下面的全项选项都要。
- LC_COLLATE 配置字符串比较,PHP 目前尚未实作出来本项。
- LC_CTYPE 配置字符类别及转换。例如全变大写 strtoupper()。
- LC_MONETARY 配置金融货币,PHP 目前尚未实作。
- LC_NUMERIC 配置小数点后的位数。
- LC_TIME 配置时间日期格式,与 strftime() 合用。
而参数 locate 若是空字符串 "",则会使用系统环境变量的 locate 或是 LANG 的值。若 locate 为零,则不会改变地域化配置。返回新的地域,若系统尚未实作则返回 false。
单字符宽字符互相转换
size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n); //转换单字符串为宽字符串
char sss[20];
wcstombs(sss,str.GetBuffer(),20); //转换宽字符为单字符
std::string s(len*2,0);
size_t total = wcstombs(&s[0],str.c_str(),len*2);
s[total] = ''''/0''
return s;
mbtowc 和 wctomb 是单个字符相互转换
int len;
wchar_t wc = L''''中''
wprintf(L"1个宽中文字符:%c /n",wc);
char* p = "中";
len = mbtowc (&wc, p, MB_LEN_MAX);
wprintf(L"单字符串转换为1个宽字符:%c 长度: %d/n",wc,len);
char pcmb[MB_LEN_MAX];
len = wctomb (pcmb, wc);
pcmb[len] = 0;
printf("宽字符转换为单字符串:%s 长度:%d/n",pcmb,len);
char mstr[1024];
MultiByteToWideChar( CP_UTF8, 0, utf8,1024, wstr, sizeof(wstr)/sizeof(wstr[0]) );
WideCharToMultiByte( CP_ACP,0,wstr,-1,mstr,1024,NULL,NULL );
因为在 C/C++ 语言标准中定义了其运行时的字符集环境为 "C" ,也就是 ASCII 字符集的一个子集,那么 mbstowcs 在工作时会将 cstr 中所包含的字符串看作是ASCII 编码的字符,而不认为是一个包含有 chs 编码的字符串,所以他会将每一个中文拆成 2 个 ASCII 编码进行转换,这样得到的结果就是会形成 4 个 wchar_t 的字符组成的串,那么如何才能够让 mbstowcs 正常工作呢?在调用 mbstowcs 进行转换之间必须明确的告诉 mbstowcs 目前 cstr 串中包含的是 chs 编码的字符串,通过 setlocale( LC_ALL, "chs" ) 函数调用来完成,需要注意的是这个函数会改变整个应用程序的字符集编码方式,必须要通过重新调用 setlocale( LC_ALL, "C" ) 函数来还原,这样就可以保证 mbstowcs 在转换时将 cstr 中的串看作是中文串,并且转换成为 2 个 wchar_t 字符,而不是 4 个。
为什么一定要调用 setlocale 呢? 因为在 C/C++ 语言标准中定义了其运行时的字符集环境为 "C" ,也就是 ASCII 字符集的一个子集。使用setlocal改变整个应用程序的字符集编码方式(wcstombs使用前要设置 setlocale (LC_ALL, "chs"); )的更多相关文章
- 从Qt5开始只剩下setCodecForLocale这一个了,只是影响Qt对toLocal8Bit相关函数的编码方式(在源码里写非英文,官方推荐“\xE4\xBD...”这种)good
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecFo ...
- 泛型方法或泛型类中的方法是内部调用、PInvoke 或是在 COM 导入类中定义的。
泛型基类中引用Api函数定义时static extern,在子类中会提示: 未处理TypeLoadException 泛型方法或泛型类中的方法是内部调用.PInvoke 或是在 COM 导入类中定义的 ...
- 刨根究底字符编码之十——Unicode字符集的字符编码方式CEF
Unicode字符集的字符编码方式CEF 一.字符编码方式CEF的选择 1. 由于Unicode字符集非常大,有些字符的编号(码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须使用 ...
- 刨根究底字符编码之十——Unicode字符集的编码方式以及码点、码元
Unicode字符集的编码方式以及码点.码元 一.字符编码方式CEF的选择 1. 由于Unicode字符集非常大,有些字符的编号(码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须 ...
- vim 编码方式的设置
和所有的流行文本编辑器一样,Vim 可以很好的编辑各种字符编码的文件,这当然包括UCS-2.UTF-8 等流行的 Unicode 编码方式.然而不幸的是,和很多来自 Linux 世界的软件一样,这需要 ...
- 非接触IC卡中typeA卡和typeB卡的区别--总结,二者的调制方式和编码方式不同
非接触IC卡中typeA卡和typeB卡的区别--总结,二者的调制方式和编码方式不同 1.非接触式IC卡的国际规范ISO/IEC14443的由来? 在非接触式IC卡的发展过程中,这些问题逐渐被解决并形 ...
- Mysql 更改编码方式
Mysql 更改编码方式 --查看编码方式 show variables like 'char%'; --设置编码方式 set character_set_server=utf8;
- 单个页面Request编码方式的改变,无需改动Web.config~
搞一个东西,从别人的接口接一段中文,URL传输,怎么都有乱码~~ 得到对方的编码方式是gb2312,于是用HttpUtility.UrlDecode(_smssend_content, System. ...
- Unicode 字符集与它的编码方式
正式内容開始之前,我们先来了解一个基本概念,编码字符集. 编码字符集:编码字符集是一个字符集,它为每个字符分配一个唯一数字.Unicode 标准的核心是一个编码字符集,字母"A"的 ...
随机推荐
- 基于Jekyll的博客模板
代码地址如下:http://www.demodashi.com/demo/13147.html 效果 环境配置 环境 Windows 10 Git Bash 安装ruby 下载rubyinstalle ...
- ST股福音:涨停潮开始! 最全ST摘帽股汇总!
本周ST股摘帽行情提前预演,ST股上演涨停潮,部分ST股甚至出现连续涨停.云财经在三季报披露之前曾经做过一期ST股摘帽分析,在三季报正式披 露完毕后,以及部分ST公司公布了2015年年报预告,ST股能 ...
- 一个关于git push失败的解决方案
问题背景:在GitHub上创建了一个repositorie, 本地初始化并添加了远程仓库后,在GitHub上创建了一个README.md文件(注意不是从本地git push上去的),随后本地修改工程源 ...
- sshd服务安装和配置管理
1.SSHD简介(介绍) SSH协议:安全外壳协议,为Secure Shell的缩写,SSH为建立在应用层和传输层基础上的安全协议. sshd服务使用SSH协议可以用来进行远程控制,或在计算机之间传送 ...
- js Json操作
JSON字符串: var jsonStr='{"fname":"json","fage":1}' JSON对象: var jsonOb ...
- c语言编写51单片机中断程序,执行过程是怎样的?
Q:c语言编写51单片机中断程序,执行过程是怎样的? 例如程序:#include<reg52.h> void main(void) { EA=1; //开放总中断 E ...
- JS DOM -- 关于回车键盘事件执行事件
一.需求制作一个模拟对话框, 二. 1.需要发送后,输入框清空 2.按enter键可发送 三.代码部分 <!DOCTYPE HTML> <html> <head> ...
- 本地调试远程api tag
当你在本地开发js且需要跨域调用远程接口的时候.可按照下列步骤设置你的chrome. 1.创建chrome快捷方式. 2.右键属性新的快捷方式,在目标一栏后面追加 "--args ...
- 怎么用ChemDraw Pro绘制不定域共轭环
ChemDraw Pro 14作为一款非常受欢迎的化学绘图软件,不论是化学分子结构.轨道,还是符号.箭头等图形都可以用它轻松的绘制出来,而且在其工具栏中,集成了10种环工具,可以对不同种类.不同尺寸的 ...
- Android Studio Error -- Could not create the Java Virtual Machine
:app:dexDebug Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurre ...