精华内容
下载资源
问答
  • 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;
    }
    
    展开全文
  • char 转wchar_twchar_t转char的实现函数及原理说明
  • unicode 编码下 wchar_t * char2wchar(const char* cchar, int & text_length) { wchar_t *m_wchar; int len = MultiByteToWideChar(CP_ACP, 0, cchar, strlen(cchar...

    unicode 编码下

    wchar_t * char2wchar(const char* cchar, int & text_length)
    	{
    		wchar_t *m_wchar;
    		int len = MultiByteToWideChar(CP_ACP, 0, cchar, strlen(cchar), NULL, 0);
    		m_wchar = new wchar_t[len + 1];
    		MultiByteToWideChar(CP_ACP, 0, cchar, strlen(cchar), m_wchar, len);
    		m_wchar[len] = '\0';
    		text_length = len + 1;
    		return m_wchar;
    	}
    char * wchar2char(const wchar_t* wchar)
    	{
    		char * m_char;
    		int len = WideCharToMultiByte(CP_ACP, 0, wchar, wcslen(wchar), NULL, 0, NULL, NULL);
    		m_char = new char[len + 1];
    		WideCharToMultiByte(CP_ACP, 0, wchar, wcslen(wchar), m_char, len, NULL, NULL);
    		m_char[len] = '\0';
    		return m_char;
    	}

     

    展开全文
  • 开发语言:C++ #include &lt;iostream&gt; #include &...// wchar_t to string void Wchar_tToString(std::string&amp; szDst, wchar_t *wchar) { wchar_t * wText = wchar; DWO...

    开发语言:C++

    #include <iostream>
    #include <windows.h>
    #include <string>

    // wchar_t to string
    void Wchar_tToString(std::string& szDst, wchar_t *wchar)
    {
    wchar_t * wText = wchar;
    DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,wText,-1,NULL,0,NULL,FALSE);// WideCharToMultiByte的运用
    char *psText; // psText为char*的临时数组,作为赋值给std::string的中间变量
    psText = new char[dwNum];
    WideCharToMultiByte (CP_OEMCP,NULL,wText,-1,psText,dwNum,NULL,FALSE);// WideCharToMultiByte的再次运用
    szDst = psText;// std::string赋值
    delete []psText;// psText的清除
    }

    // string to wstring
    void StringToWstring(std::wstring& szDst, std::string str)
    {
    std::string temp = str;
    int len=MultiByteToWideChar(CP_ACP, 0, (LPCSTR)temp.c_str(), -1, NULL,0); 
    wchar_t * wszUtf8 = new wchar_t[len+1]; 
    memset(wszUtf8, 0, len * 2 + 2); 
    MultiByteToWideChar(CP_ACP, 0, (LPCSTR)temp.c_str(), -1, (LPWSTR)wszUtf8, len);
    szDst = wszUtf8;
    std::wstring r = wszUtf8;
    delete[] wszUtf8;
    }


    int main(int argc, char *argv)
    {

    // wchar_t  to string
    std::string szDest;
    wchar_t wText[20] = {L"宽字符转换字符串实例!OK!"};
    Wchar_tToString(szDest, wText);
    std::cout<<"szDest: "<<szDest<<std::endl;


    /**
    * wchar_t 定义的变量为什么不能输出呢?
    * 宽字符类型要本地化,否则输不出想要结果。
    * 本地化有三条语句可以使用,任取其一。最后一句是全局函数,前两个是wcout的一个成员函数的两种表达方式。
    */
    //std::wcout.imbue(std::locale("chs"));
    //std::wcout.imbue(std::locale(""));
    setlocale(LC_ALL,"Chinese-simplified");

    // string to wstring
    std::string szSrc = "字符串转换宽字符实例!OK!";
    std::wstring wszDest;
    StringToWstring(wszDest, szSrc);
    std::wcout << "wszDest: " << wszDest << std::endl;


     

    /**
        string to wchar_t
     */

    string str= "字符串转换宽字符实例!OK!";
    std::wstring widstr = std::wstring(str.begin(), str.end());
    const wchar_t *pwidstr = widstr.c_str();

    // 此方法简单,但是 delete wc;时会出异常
    wchar_t   *   wc   =   new   wchar_t[szSrc.size()]; 
    swprintf(wc,L"%S ",szSrc.c_str());//注意大写S。。 
    std::wcout <<"szSrc: " << wc <<std::endl;
    //delete wc;

    system("PAUSE");
    }
    --------------------- 
    作者:chinahaerbin 
    来源:CSDN 
    原文:https://blog.csdn.net/chinahaerbin/article/details/7764483 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • C/C++语言中的字符类型存在两种表示字符的基本类型:char:一个字节8bit表示,最多表示256个字符,表示和用来处理ASCII字符集,国际通用wchar_t:多字节字符表示,典型2个字节或者4个字节,如GNU libc中为4B,可以...

    C/C++语言中的字符类型

    存在两种表示字符的基本类型:

    char:一个字节8bit表示,最多表示256个字符,表示和用来处理ASCII字符集,国际通用

    wchar_t:多字节字符表示,典型2个字节或者4个字节,如GNU libc中为4B,可以表示更多的字符,满足国际化应用开发的需求,实现标准

    在开发中ASCII编码字符都是用char来表示,可以转换成wchar_t表示;wchar_t类型与Unicode编码是完全独立的概念,不过在实现上Unicode编码一般用wchar_t来表示实现而已,但wchar_t字符并不一定就是Unicode编码字符。

    对应两种字符类型存在两种字符串类型(C++):

    string: char字符列表或者是字节列表(bytes)

    wstring: wchar_t字符列表或者是宽子节列表

    对应两种字符类型的输出函数流对象有:

    sprintf/wsprintf: 分别对应char与wchar_t

    cout/wcout:分别对应string与wstring

    stringstream/wstringstream: 分别对应string与wstring

    字符串常量

    C++11标准中增加了一些表示字符串常量的标识,如下有:

    L"您好!": wstring字符串常量,使用文件保存编码方式字符集

    R"(您 好 \n)": 原始字符串常量(字节数组),保留所有的字符

    u8"您好!": string字符串常量(字节数组),使用UTF8进行编码保存

    字符集及编码

    已知有很多的字符集,比如:ASCII,UTF8,GBK,GB2312,UTF16,UTF32,UNICODE,Latin等等。常用中文字符集编码有:

    UTF8:又分为带签名和不带签名两种,Windows代码页为65001,VS中应该选择【UTF8-带签名】的格式

    GBK/GB2312:Windows代码页为936

    GB18030: Windows代码页为54936

    小技巧:修改Windows系统中cmd命令行窗口的显示字符集,默认字符集为OS字符集,如GBK-936。如果希望显示UTF8字符,则可以修改:chcp 65001.

    在VS项目的调试命令窗口中无法手动修改,可以通过system函数来修改:

    system("C:\\Windows\\system32\\chcp 65001");// 修改终端字符集为UTF8

    源文件的编码保存选项

    可以将源文件保存成不同的编码方式,如果文件中有中文,则必须选择可以对中文进行编码的字符集,如UTF8,GBK,GB2312等,否认可能会出现莫名其妙的编译错误,因为文件中存在无法识别的字符内容。

    在Visual Studio中,选中文件后该设置在:【文件 - 高级保存选项】中。

    C++11中GBK/UTF/wchar_t之间的编码处理转换

    在处理中文时,不同的应用场景下总是无法避免进行GBK和UTF8之间的相互转换,C++11标识提供了和机制和工具来简化处理。

    借助其中的std::wstring_convert和std::codecvt_utf8模板,通过wchar_t类型为中介,可以快速地实现转换,基本代码如下:

    /*

    转换GBK编码的中文到UTF8编码:GBK - WChar - UTF8两次转换

    */

    //GBK在linux下的locale名可能是"zh_CN.GBK"

    const char* GBK_LOCALE_NAME = ".936"; //GBK在windows下的locale name

    std::wstring_convert<:codecvt_byname char mbstate_t>> Conver_GBK(new codecvt_byname(GBK_LOCALE_NAME)); //GBK - wchar_t

    std::wstring _wname = Conver_GBK.from_bytes(data.Name); // 输入为char*的字符串表示或者数组,输出为wstring

    std::wstring _waddr = Conver_GBK.from_bytes(data.Address);// 输入为char*的字符串表示或者数组,输出为wstring

    std::wstring _wdept = Conver_GBK.from_bytes(data.GrantDept);// 输入为char*的字符串表示或者数组,输出为wstring

    wcout << "Name: " << _wname << ",addr:" << _waddr << ",dept:" << _wdept << endl;

    // 将wstring转化为UTF8编码的字节数组string表示

    std::wstring_convert<:codecvt_utf8>> conv;

    string _name = conv.to_bytes(_wname);// 输入为wstring字符串

    string _addr = conv.to_bytes(_waddr);

    string _dept = conv.to_bytes(_wdept);

    // 将UTF8字符串转换为GBK字符编码表示string字节数组

    std::string _name = Conver_GBK.to_bytes(conv.from_bytes(_name)); // 先转换成wstring,然后再转换成GBK的string

    std::string _addr = Conver_GBK.to_bytes(conv.from_bytes(_addr)); // 先转换成wstring,然后再转换成GBK的string

    展开全文
  • wchar_t,StrTraitMFC<wchar_t,ATL::ChTraitsCRT<wchar_t>>>::Format(UINT,…)”: 无法将参数 1 从“const char [36]”转换为“const wchar_t *” 报错原因 还有一点需要读者注意的是,宽字符不等于...
  • wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>】(如下图),特此将解决方案分享一下。 解决方法: 1,在Microsoft Visual Studio Community 2019软件界面的上方导航栏里,选择 ...
  • size_t wchar_t ptrdiff_t

    2021-04-01 10:33:09
    size_t在C语言中就有了。 size_t的全称应该是size type,就是说“一种用来记录大小的数据类型”。 它是一种“整型”类型,里面保存的是一个整数,就像int、long那样。这种整数用来记录一个大小(size...wchar_t就是.
  • wchar_t,StrTraitMFC_DLL<wchar_t,ALT::ChTraits... 和E0415 不存在从const char[1]转化为ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ALT::ChTraitsCRT<wchar_t>>>"的构造函数 其实这是...
  • 它的一部分工作是复制和操作该字符串(查找substr,cat it,ex ..)因为我现在不想使用外部非标准库,我试图使用wchar_t来实现它 .目前,即时通讯使用mbstowcs将其转换为wchar_t以便于操作,对...
  • 一、wchar_t: 百度百科: wchar_t是C/C++的字符类型,是一种扩展的存储方式。wchar_t类型主要用在国际化程序的实现中,但它不等同于unicode编码。unicode编码的字符一般以wchar_t类型存储。 char是8位字符类型,...
  • VC++ data type: wchar_t v.s. unsigned short and compiler option /Zc:wchar_t A variable of __wchar_t designates a wide-character or multibyte character type. By default wchar_t is a typedef for un
  • wchar_t在mac intel下就是UTF-32LE,所以 wchar_t wchar[] = L"汉字"; NSString *str = [[NSString alloc] initWithBytes:wchar length: wcslen(wchar) encoding:NSUTF32LittleEndianStringEncoding];
  • 原博文链接:http://www.aobosir.com/blog/2016/12/16/cpp-convert-string-wstring-char-wchar_t-pointer/char 与 wchar_t 之间的转换#include #include <iomanip>int main(void) { char c = 'a'; std::cout
  • char wchar_t char16_t char32_t 区别 首先这几种字符类型的首要区别就是其占用存储空间的大小不同。char 有一个字节表示,wchar_t 宽体字符,由两个字符表示。char16_t,char32_t C++ 11 新增的字符类型,char16_t...
  • #include 第一种方法 ...wchar_t *s;  char *d;  tp=s;  d=tp.c_str();  第二种方法:自定义函数实现 #include #include void charTowchar(const char *chr, wchar_t *wchar, int size) { M

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,617
精华内容 3,046
热门标签
关键字:

wchar_t