std:string怎么转wchar

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了std:string怎么转wchar相关的知识,希望对你有一定的参考价值。

开发语言: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");
参考技术A 开发语言: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");

我想将 std::string 转换为 const wchar_t *

【中文标题】我想将 std::string 转换为 const wchar_t *【英文标题】:I want to convert std::string into a const wchar_t * 【发布时间】:2010-09-19 19:05:18 【问题描述】:

有什么方法吗? 我的电脑是 AMD64。

::std::string str;
BOOL loadU(const wchar_t* lpszPathName, int flag = 0);

我用的时候:

loadU(&str);

VS2005 编译器说:

Error 7 error C2664:: cannot convert parameter 1 from 'std::string *__w64 ' to 'const wchar_t *'

我该怎么做?

【问题讨论】:

【参考方案1】:

先转换成std::wstring:

std::wstring widestr = std::wstring(str.begin(), str.end());

然后得到C字符串:

const wchar_t* widecstr = widestr.c_str();

这仅适用于 ASCII 字符串,但如果底层字符串是 UTF-8 编码的,它将不起作用。使用 MultiByteToWideChar() 之类的转换例程可确保正确处理此场景。

【讨论】:

这对于 ASCII 字符串应该可以正常工作,但如果底层字符串是 UTF-8 编码的,它将无法正常工作。使用 MultiByteToWideChar() 之类的转换例程可确保正确处理此场景。 您应该使用具有正确代码页的 MultiByteToWideChar。准确地说,需要对其进行两次调用:第一次获取目标 wchar_t 字符串所需的长度,第二次将 char 字符串转换为 wchar_t 字符串。 只有当 wchar_t 为 Unicode 且 char 为 Latin-1 或 ASSCI 时才有效。 Unicode 的前 256 个字符值与 Latin-1 完全匹配; Latin-1 的前 128 个字符与 ASCII 完全匹配。 无法将“const char*”转换为“wchar_t*” 这给了我一个错误:cannot convert from 'const wchar_t *' to 'wchar_t *' 我不得不使用:const wchar_t* widecstr = widestr.c_str();【参考方案2】:

如果你有一个 std::wstring 对象,你可以在它上面调用c_str() 来得到一个wchar_t*

std::wstring name( L"Steve Nash" );
const wchar_t* szName = name.c_str();

但是,由于您在一个窄字符串上进行操作,因此您首先需要将其加宽。这里有多种选择;一种是使用Windows 内置的MultiByteToWideChar 例程。这将给你一个LPWSTR,相当于wchar_t*

【讨论】:

@ʎǝʞuoɯɹǝqʎɔ: 你的意思是wstring var = L"text";【参考方案3】:

您可以使用 ATL 文本转换宏将窄 (char) 字符串转换为宽 (wchar_t) 字符串。例如,转换一个 std::string:

#include <atlconv.h>
...
std::string str = "Hello, world!";
CA2W pszWide(str.c_str());
loadU(pszWide);

您还可以指定代码页,因此如果您的 std::string 包含 UTF-8 字符,您可以使用:

CA2W pszWide(str.c_str(), CP_UTF8);

非常有用,但仅限 Windows。

【讨论】:

您可能需要 CA2CW。您可能还想为宏命名约定添加一个基本解释(例如:Const Ascii -> Const Wchar)。 没有CA2CW转换功能。有一个 CA2CT 版本,但这只是简单地称为 CA2W。完整列表请参见 。 非常有用。就我而言,只有#include &lt;atlstr.h&gt; 有效,而#include &lt;atlconv.h&gt; 没有。不知道为什么。 我还推荐CA2WEX,它可以绕过潜在的堆栈溢出。【参考方案4】:

如果您使用的是 Linux/Unix,请查看 GNU C(来自 ISO C 90)中定义的 mbstowcs() 和 wcstombs()。

mbs 代表“多字节字符串”,基本上是通常的以零结尾的 C 字符串。

wcs代表Wide Char String,是一个wchar_t数组。

有关宽字符的更多背景信息,请查看 glibc 文档here。

【讨论】:

我相信那些是 C 标准的;不管怎样,它们也在 Windows 中:msdn.microsoft.com/en-us/library/k1f9b8cy.aspx

以上是关于std:string怎么转wchar的主要内容,如果未能解决你的问题,请参考以下文章

arduino 引用std::string 报错

如何在MFC中将std:string转换为LPCTSTR

std::ostringstream 转std::string

C++ string2进制转16进制要怎么做

char*怎么转换string

Convert enum value to std::string in C++ (C++ enum 转 string)