精华内容
下载资源
问答
  • char*与wchar_t*互转
    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;
    }
    

    更多相关内容
  • 1、区别wchar_t,char,WCHAR ANSI:即 char,可用字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数。 UNICODE:wchar_t是Unicode字符的数据类型,它实际定义在里: typedef unsigned short wchar_t;...
  • 在处理中文时有时需要进行wchar_t,char,string,wstring之间的转换。 其中char和string之间、wchar_t和wstring之间的转换较为简单,代码在vs2010下测试通过。 代码如下:#include <iostream>#include <string>#...
  • 代码如下: #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中使用wchars。 例子 go.hid库中的示例: func ( dev * Device ... wchar_t )( ws . Pointer ()), 100 ) if res != 0 { return "" , dev . lastError () } // get WcharString as Go string
  • char 转wchar_twchar_t转char的实现函数及原理说明
  • string转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:20
    1. 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--------------------------------------------------------------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视为内置类型】这个选项(默认为是),

    c678a7bfe462a9b09da22c928e3f6485.png

    然后又在群里问了一下群友,被告知,如果选则【否】,则wchar_t被定义为

    typedef short wchar_t

    然后自己试了一下,结果如下

    3b50ba63563b3ee9aa77eadc0a650fde.png

    31d66619981e3db45907e99fd6394b9d.png

    结果是选择【否】的时候,其类型为typedef unsigned short  wchar_t。

    同时,群友小伙(一个很牛叉的小伙)又说:这个wchar_t不同会影响到name mangling,于是我又去查了一下what is name mangling,简单点说就是编译器对函数的命名,不同编译器、不同调用约定、不用语言(C/C++),其结果不尽相同。

    自己写了一个简单的DLL,导出了几个函数,使用了不同的调用约定等,请看如下

    6608177ca07a4cc7176950f8dfd3d209.png

    用dependes看了一下导出函数的名字,如下

    e5c2871e3645179037e685c2c2b741f6.png

    再转一下话题

    ------------------------------------华丽的分割线---------------------------

    再再转一下话题

    ------------------------------------华丽的分割线---------------------------

    VC++怎么编译C语言程序

    在VC++的项目属性里设置:项目属性—配置属性—C/C++--高级—编译为(编译为C代码TC)

    1108227f81487283beb9090373cc59bd.png

    暂且到此,现在时间2014年3月28日 00:24:04

    展开全文
  • ②:std::wstring内部是WCHAR宽字符,即wchar_t 在MFC的工程中我们可以设置工程的编码属性: ①:对于UNICODE的编码属性CString被定义为CStringW,其内部是WCHAR宽字符 即wchar_t ②:对于多字节的编码属性CString.
  • 宽字符 wchar_t

    2020-10-21 15:49:13
    The wchar_t type is intended for storing compiler-defined wide characters, which may be Unicode characters in some compilers." 翻译:“wchar_t的宽度属于编译器的特性,且可以小到8位。所以程序若需要...
  • 随着wchar_t类型引入C语言,字符串处理变得越来越复杂。例如字符串输出有printf、wprintf这两个函数,当参数中既有char字符串又有wchar_t字符串时,该怎么填写格式控制字符呢?本文对此进行探讨。一、翻阅文档先翻阅...
  • c++ char、wchar_t互换

    2021-09-03 10:54:40
    char *和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_...
  • ::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表示,wchar_t最大长度4个字节,已经可以囊括世界上所有的语言编码,中文字符在gb2312编码下用2个字节表示,但用utf-8编码需要3个字节表示。Linux下的系统调用,大...
  • 字符类型、字符指针类型、字符串字面值字符类型:char, wchar_t, CHAR, WCHAR, TCHAR, UCHAR, BYTE, TBYTEchar 是C语言标准数据类型,字符型。通常由编译器决定一个char对象有多少个字节组成,一般是一字节。wchar_t...
  • 每个字符可以是一到多个字节不等,而某个字节序列的字符值由字符串或流(stream)所在的环境背景决定)自从1994年的增补之后,C语言不只提供char类型,还提供wchar_t类型(宽字符),此类型定义在stddef.h头文件中。...
  • //将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 = ...
  • 而当前开发的程序由于条件限制(依赖的其他库是将wchar_t作为unsigned short处理,并且当前编译环境为某公司在VS上二次开发的编译环境,虽说支持设置编译选项,但开启/Zc:wchar_t后该编译环境却“不认识”),因此要...
  • char与wchar_t字符串

    2021-10-10 16:18:06
    C++里的字符串类型是比较二的,因为有太多表示方法:char*、string、字符串数组、wchar_t*、wstring,今天就来缕一缕这些玩意。 char* char* 貌似是C++字符串最基础最核心的。 看以下四个字符串声明及输出结果:...
  • 开发语言:C++ #include &lt;iostream&gt; #include &lt;windows.h&...// wchar_t to string void Wchar_tToString(std::string&... szDst, wchar_t *wchar) { wchar_t * wText = wchar; DWO...
  • 一、wchar_t: 百度百科: wchar_t是C/C++的字符类型,是一种扩展的存储方式。wchar_t类型主要用在国际化程序的实现中,但它不等同于unicode编码。unicode编码的字符一般以wchar_t类型存储。 char是8位字符类型,...
  • Linker error Error[Lt009]: Inconsistent wchar_t size - Nordic Q&A - Nordic DevZone - Nordic DevZonehttps://devzone.nordicsemi....
  • wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>】(如下图),特此将解决方案分享一下。 解决方法: 1,在Microsoft Visual Studio Community 2019软件界面的上方导航栏里,选择 ...
  • 输出wchar_t数组中第i个汉字, 以下方式已经被验证不能实现【输出第1个汉字】的效果: <code class="language-cpp">#include<stdio.h> int main(){ wchar_t string[10]; printf("输入一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,029
精华内容 22,411
关键字:

wchar_t