-
2022-04-21 09:27:13
#include <string.h> #include <stdio.h> #include <iostream> wchar_t w_cn = '中'; char c_cn[2] = { '0' }; char *C2W(wchar_t w_cn, char c_cn[2]) { //following code convert wchar to char c_cn[0] = w_cn >> 8; c_cn[1] = w_cn; c_cn[2] = '\0'; return c_cn; } char *W2C(const wchar_t *pw, char *pc) { //cout<<*pw<<endl; //这样是不能正确显示的,你可以试试看显示的是什么 *pc++ = *pw >> 8; *pc = *pw; return 0; } char *wstr2cstr(const wchar_t *pwstr, char *pcstr, size_t len) { char *ptemp = pcstr; if (pwstr != NULL && pcstr != NULL) { size_t wstr_len = wcslen(pwstr); len = (len > wstr_len) ? wstr_len : len; while (len-- > 0) { *(pcstr++) = *(pwstr) >> 8; *(pcstr++) = *(pwstr++); } *pcstr = '\0'; return ptemp; } return 0; } int main(int arg, char *argv[]) { wchar_t pwstr[] = { '我' , '是' , '多' , '字' , '节', '\0' }; int len = wcslen(pwstr); char *pcstr = new char[2*len + 1]; memset(pcstr, 0, 2 * len); wstr2cstr(pwstr, pcstr, len); std::cout << pcstr <<std::endl; delete[]pcstr; return 0; }
更多相关内容 -
浅谈c++ 字符类型总结区别wchar_t,char,WCHAR
2020-12-31 18:30:071、区别wchar_t,char,WCHAR ANSI:即 char,可用字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数。 UNICODE:wchar_t是Unicode字符的数据类型,它实际定义在里: typedef unsigned short wchar_t;... -
wchar_t,char,string,wstring之间的相互转换
2020-12-31 23:43:26在处理中文时有时需要进行wchar_t,char,string,wstring之间的转换。 其中char和string之间、wchar_t和wstring之间的转换较为简单,代码在vs2010下测试通过。 代码如下:#include <iostream>#include <string>#... -
深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换
2021-01-01 03:38:13代码如下: #ifndef USE_H_ #define USE_H_ #include #include #include using namespace std; class CUser { public: CUser();... char* WcharToChar(const wchar_t* wp); char* StringToChar -
cgo.wchar:cgo.wchar包将与gocgo一起使用,并有助于在C.wchar_t和wchar_t字符串之间进行转换(* C.wchar_t...
2021-05-24 22:36:37cgo.wchar 帮助在cgo中使用wchars。 例子 go.hid库中的示例: func ( dev * Device ... wchar_t )( ws . Pointer ()), 100 ) if res != 0 { return "" , dev . lastError () } // get WcharString as Go string -
char 转wchar_t 及wchar_t转char
2013-07-18 11:07:58char 转wchar_t 及wchar_t转char的实现函数及原理说明 -
string转wchar_t*和QString转wchar_t*
2022-04-28 16:24:21string转wchar_t* 首先介绍下wchar_t类型 一、wchar_t类型的由来 我们知道char类型变量可以存储一个字节的字符,它用来保存英文字符和标点符号是可以的,但是对于汉字、韩文以及日文这样的字符却不可以,因为汉字、...string转wchar_t*
首先介绍下wchar_t类型
一、wchar_t类型的由来
我们知道char类型变量可以存储一个字节的字符,它用来保存英文字符和标点符号是可以的,但是对于汉字、韩文以及日文这样的字符却不可以,因为汉字、韩文以及日文每一个文字都占据两个字节,为了解决这个问题,c++提出了wchar_t类型,称之为双字节类型,又称宽字符类型。
二、下面是一个范例
int main(int argc, wchar_t* argv[]) { //使用setlocale函数将本机的语言设置为中文简体 setlocale(LC_ALL,"chs");//LC_ALL表示设置所有的选项(包括金融货币、小数点,时间日期格式、语言字符串的使用习惯等),chs表示中文简体 wchar_t wt[] = L"中国你好!";//大写字母L告诉编译器为"中"字分配两个字节的空间 wcout<<wt<<endl;//使用wcout来代替cout输出宽字符,wcin类代替cin输入宽字符 cout<<wcslen(wt)<<endl;//wcslen输出宽字符串的长度,输出长度是5 cout<<sizeof(wt)<<endl;//输出长度是12个字节,最后的wchar_t类型的'\0'两个字节 return 0; }
三、 和string类型之间的转换
方法1:string->wstring->wchar_t*
inline std::wstring to_wide_string(const std::string& input) //string to wstring { std::wstring_convert<std::codecvt_utf8<wchar_t>> converter; return converter.from_bytes(input); } string str("你好中国"); wstring ws_str=to_wide_string(str); const wchar_t* wc_str=ws_str.c_str();
方法2:字符串格式化(针对字符串变量)string->char->wchar_t*
string str("你好中国"); wchar_t * wc = new wchar_t[str.size()]; swprintf(wc,100,L"%S",str.c_str()); //注意大写 //wc指向的内存区域存储这wchar_t类型的 ”你好中国“。
方法3:
MultiByteToWideChar();#include <windows.h> #include <string> //不要忘记在使用完wchar_t*后delete[]释放内存 wchar_t *multi_Byte_To_Wide_Char(const string& pKey) { //string 转 char* char* pCStrKey = pKey.c_str(); //第一次调用返回转换后的字符串长度,用于确认为wchar_t*开辟多大的内存空间 int pSize = MultiByteToWideChar(CP_OEMCP, 0, pCStrKey, strlen(pCStrKey) + 1, NULL, 0); wchar_t *pWCStrKey = new wchar_t[pSize]; //第二次调用将单字节字符串转换成双字节字符串 MultiByteToWideChar(CP_OEMCP, 0, pCStrKey, strlen(pCStrKey) + 1, pWCStrKey, pSize); return pWCStrKey; }
QString转wchar_t*
以下filename均为QString格式。
方法1:
file = filename.toStdWString(); const wchar_t* str1 = file.c_str();
Returns a std::wstring object with the data contained in this QString. The std::wstring is encoded in utf16 on platforms where wchar_t is 2 bytes wide (e.g. windows) and in ucs4 on platforms where wchar_t is 4 bytes wide (most Unix systems).
这是最朴素的想法。也是最好使用的办法。很奇怪的是,我前几次测试,却是debug看到了乱码,我也不确定是否是改动了其他宏或者build参数导致的。不过,后来的测试表明,这种方式才是正确的方式,可能存在的问题最小。
方法2:
wchar_t str2[256] = {0}; auto xxx = filename.toWCharArray(str2);
这种方法是查询QString 文档而知的。但是,这种方式要谨慎,若不对数组str2 初始化,debug可以看到字符串最后会多出来一两个字符,完全随机的。还要注意数组长度。
方法3:
const wchar_t * encodedName = reinterpret_cast<const wchar_t *>(filename.utf16());
虽然这种方法也能工作,但是需要注意。这里用到了强转,reinterpret_cast 表达式不会编译成任何 CPU 指令,它纯粹是一个编译时指令,指示编译器将 表达式 视为如同具有 新类型 类型一样处理。亦即,与C写法,(const wchar_t *)ptr 并没有什么不同。
其实,最重要的,我们还是需要知道 OS 使用的编码方式。
C:\Users\kt>chcp
活动代码页: 936
这就是 GB2312 了。每个汉字及符号以两个字节来表示。
Fills the array with the data contained in this QString object. The array is encoded in utf16 on platforms where wchar_t is 2 bytes wide (e.g. windows) and in ucs4 on platforms where wchar_t is 4 bytes wide (most Unix systems).
所以,方法3,只能在windows上使用,在Linux上,还需要注意。
至于从wchar_t* 转换为QString的方式,直接参看QString的接口,上述1、3方法对应的接口有fromStdWString、fromUtf16,应该可以解决问题。
————————————————
原文链接:https://blog.csdn.net/cloudqiu/article/details/103209158 -
wchar_t
2020-03-25 14:35:201. wchar_t是什么 wchar_t,宽字符,是C/C++的字符类型,是一种扩展的存储方式。 wchar_t类型主要用在国际化程序的实现中,但它不等同于unicode编码。unicode编码的字符一般以wchar_t类型存储。 char是8位字符类型,...1. wchar_t是什么
wchar_t,宽字符,是C/C++的字符类型,是一种扩展的存储方式。
wchar_t类型主要用在国际化程序的实现中,但它不等同于unicode编码。unicode编码的字符一般以wchar_t类型存储。char是8位字符类型,最多只能包含256种字符,许多外文字符集所含的字符数目超过256个,char型无法表示。
wchar_t数据类型一般为16位或32位,所能表示的字符数远超char型。比如对于汉字,韩文以及日文这样的字符,它们的每一个文字都占据两个字节,所以C++提出了wchar_t类型,也称为双字节类型,或宽字符类型。
2. wchar_t操作
标准C中的wprintf()函数以及标准C++的iostream类库中的类和对象能提供wchar_t宽字符类型的相关操作。
#include <iostream> #include <locale> //setlocale函数在locale头文件中定义 using namespace std; int main() { //使用setlocale函数将本机的语言设置为中文简体 //LC_ALL表示设置所有的选项(包括金融货币、小数点,时间日期格式、语言字符串的使用习惯等),chs表示中文简体 setlocale(LC_ALL, "chs"); wchar_t wt[] = L"中国伟大复兴梦"; //大写字母L告诉编译器为"中"字分配两个字节的空间 wcout << wt << endl; //使用wcout来代替cout输出宽字符 return 0; }
-
一个【wchar_t】引发的学案
2021-05-21 15:43:12里面讲到了wchar_t--------------------------------------------------------------Win OS 之 wchar_t 与 ANSI/ISO C/CPP 之 wchar_t:ANSI/ISO C/CPP 中 wchar_t 表示长于 8-bit 的数据类型,至于多长,具体依赖...里面讲到了wchar_t
--------------------------------------------------------------
Win OS 之 wchar_t 与 ANSI/ISO C/CPP 之 wchar_t:
ANSI/ISO C/CPP 中 wchar_t 表示长于 8-bit 的数据类型,至于多长,具体依赖实现。《Unicode 标准 4.0》如是说:
“ANSI/ISO C leaves the semantics of the wide character set to the specific implementation but requires that the characters from the portable C execution set correspond to their wide character equivalents by zero extension.”
“The width of wchar_t is compiler-specific and can be as small as 8 bits. Consequently, programs that need to be portable across any C or C++ compiler should not use wchar_t for storing Unicode text. The wchar_t type is intended for storing compiler-defined wide characters, which may be Unicode characters in some compilers.”
标准可没说 wchar_t 表示的一定是 Unicode 编码,GB2312 也应可由 wchar_t 表示。只不过Win32 下 wchar_t 锁定为 UTF-16,而 Unix-like 通常为 UTF-32。对于亚欧主要文明体的文字,UTF-16 已经足够。
在 VC 下,常量字串 "" 对应 const char* 型,L"" 对应 const wchar_t* 型。前者用来处理各种 Multibytes;而后者指定处理 UTF-16。对应的 cout 与 wcout、string 与 wstring、iostream 与 wiostream 等亦如此。
--------------------------------------------------------------
意思就是说Windows的wchar_t和ANSI/C++里的wchar_t不一样,ANSI/C++里的wchar_t指的是长于8bits的数据类型,具体多长依赖于平台实现。
ANSI/CPP中的wchar_t与编译器相关的,并且也可以是8位。 因此,需要跨任何C/C++编译器的可执行程序不应该使用wchar_t来存储Unicode文本。
wchar_t类型是用来存储编译器定义的宽字符的,想一些编译器里,这可能是Unicode。
但在win32下,wchar_t锁定为了UTF-16。
转一下话题
------------------华丽的分割线------------------------------
想起来在VC++的项目属性里见过【将wchar_t视为内置类型】这个选项(默认为是),
然后又在群里问了一下群友,被告知,如果选则【否】,则wchar_t被定义为
typedef short wchar_t
然后自己试了一下,结果如下
结果是选择【否】的时候,其类型为typedef unsigned short wchar_t。
同时,群友小伙(一个很牛叉的小伙)又说:这个wchar_t不同会影响到name mangling,于是我又去查了一下what is name mangling,简单点说就是编译器对函数的命名,不同编译器、不同调用约定、不用语言(C/C++),其结果不尽相同。
自己写了一个简单的DLL,导出了几个函数,使用了不同的调用约定等,请看如下
用dependes看了一下导出函数的名字,如下
再转一下话题
------------------------------------华丽的分割线---------------------------
再再转一下话题
------------------------------------华丽的分割线---------------------------
VC++怎么编译C语言程序
在VC++的项目属性里设置:项目属性—配置属性—C/C++--高级—编译为(编译为C代码TC)
暂且到此,现在时间2014年3月28日 00:24:04
-
windows 下 c++ 各字符(char、wchar_t、string、cstring)的转换
2021-10-14 16:27:59②:std::wstring内部是WCHAR宽字符,即wchar_t 在MFC的工程中我们可以设置工程的编码属性: ①:对于UNICODE的编码属性CString被定义为CStringW,其内部是WCHAR宽字符 即wchar_t ②:对于多字节的编码属性CString. -
宽字符 wchar_t
2020-10-21 15:49:13The wchar_t type is intended for storing compiler-defined wide characters, which may be Unicode characters in some compilers." 翻译:“wchar_t的宽度属于编译器的特性,且可以小到8位。所以程序若需要... -
[C] wchar_t的格式控制字符(VC、BCB、GCC、C99标准)
2021-01-17 12:39:22随着wchar_t类型引入C语言,字符串处理变得越来越复杂。例如字符串输出有printf、wprintf这两个函数,当参数中既有char字符串又有wchar_t字符串时,该怎么填写格式控制字符呢?本文对此进行探讨。一、翻阅文档先翻阅... -
c++ char、wchar_t互换
2021-09-03 10:54:40char *和wchar_t *的相互转换,可使用标准库函数 size_t mbstowcs(wchar_t *wcstr, const char *mbstr, size_t count)和 size_t wcstombs(char *mbstr, const wchar_t *wcstr, size_t count) 把char*转换为wchar_... -
C2664“void ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>::Format...
2021-06-26 21:25:57::Format(const wchar_t *,...)”: 无法将参数 1 从“const char [3]”转换为“const wchar_t *” 问题发生 int c = 3; CString str; str.Format("%d",c); 问题解决 int c = 3; CString str; str.... -
C语言提高篇(wchar_t)字符类型
2021-12-11 17:13:34概述 原来C语言也是可以写,来自于灵感的编程思想。今天写个Demo,记录一下,方便以后赏阅 ,在很多大型项目上见过类似的写法。 IDE:vscode ...#define ARRAY_SIZE(array) ...}LANGUAGE_T; typedef struct { v... -
Linux下 wchar_t 与char 转换
2021-05-13 22:10:04为了支持多语言,需要支持宽字符,Linux下用wchar_t表示,wchar_t最大长度4个字节,已经可以囊括世界上所有的语言编码,中文字符在gb2312编码下用2个字节表示,但用utf-8编码需要3个字节表示。Linux下的系统调用,大... -
char, wchar_t, TCHAR 字符全总结 & c++字符串操作经验集
2021-05-22 10:46:17字符类型、字符指针类型、字符串字面值字符类型:char, wchar_t, CHAR, WCHAR, TCHAR, UCHAR, BYTE, TBYTEchar 是C语言标准数据类型,字符型。通常由编译器决定一个char对象有多少个字节组成,一般是一字节。wchar_t... -
linux 下 wchar_t和char的相互转化
2021-01-11 20:05:58每个字符可以是一到多个字节不等,而某个字节序列的字符值由字符串或流(stream)所在的环境背景决定)自从1994年的增补之后,C语言不只提供char类型,还提供wchar_t类型(宽字符),此类型定义在stddef.h头文件中。... -
烦人的char*,wchar_t*或者WCHAR转换
2020-12-18 21:08:14//将char*转化为whcar_t*,其中lpwchartStr需要释放int charTowchar_t(wchar_t** lpwchartStr,char* lpcharStr,int*len){wchar_t* buffer = nullptr;if(lpcharStr){int nu = strlen(lpcharStr);int n = ... -
记录使用第三方库编译Error LNK2019 无法解析的外部符号问题:wchar_t
2020-12-20 20:59:31而当前开发的程序由于条件限制(依赖的其他库是将wchar_t作为unsigned short处理,并且当前编译环境为某公司在VS上二次开发的编译环境,虽说支持设置编译选项,但开启/Zc:wchar_t后该编译环境却“不认识”),因此要... -
char与wchar_t字符串
2021-10-10 16:18:06C++里的字符串类型是比较二的,因为有太多表示方法:char*、string、字符串数组、wchar_t*、wstring,今天就来缕一缕这些玩意。 char* char* 貌似是C++字符串最基础最核心的。 看以下四个字符串声明及输出结果:... -
wchar_t 转换 string & std::string 转换 wchar_t
2018-12-13 16:23:23开发语言:C++ #include <iostream> #include <windows.h&...// wchar_t to string void Wchar_tToString(std::string&... szDst, wchar_t *wchar) { wchar_t * wText = wchar; DWO... -
【c++】wchar_t的详细教程,关于wchar_t使用wcout编译运行输出结果为空以及为乱码类似O的解决办法....
2020-10-11 01:00:28一、wchar_t: 百度百科: wchar_t是C/C++的字符类型,是一种扩展的存储方式。wchar_t类型主要用在国际化程序的实现中,但它不等同于unicode编码。unicode编码的字符一般以wchar_t类型存储。 char是8位字符类型,... -
IAR EWARM 如何解决 Inconsistent wchar_t size 错误
2022-04-16 15:19:49Linker error Error[Lt009]: Inconsistent wchar_t size - Nordic Q&A - Nordic DevZone - Nordic DevZonehttps://devzone.nordicsemi.... -
【解决】不存在从“char[1000]“转换到“ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::...
2021-04-13 15:10:10wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>】(如下图),特此将解决方案分享一下。 解决方法: 1,在Microsoft Visual Studio Community 2019软件界面的上方导航栏里,选择 ... -
C语言中如何输出wchar_t数组中的指定位置的单个汉字
2020-12-27 21:17:54输出wchar_t数组中第i个汉字, 以下方式已经被验证不能实现【输出第1个汉字】的效果: <code class="language-cpp">#include<stdio.h> int main(){ wchar_t string[10]; printf("输入一...