使用字符串初始化 wchar_t[]
Posted
技术标签:
【中文标题】使用字符串初始化 wchar_t[]【英文标题】:Initialize a wchar_t[] using a string 【发布时间】:2018-07-25 04:55:42 【问题描述】:目前,我正在处理 WMI 从远程机器收集日志文件。 我已经初始化了远程机器的用户名,如下所示。
wchar_t pszName[]=L"My username";
pszName[]
是一个 wchar_t
数组。我面临的问题是,当我将用户名作为字符串数据类型的参数传递时,我需要使用字符串初始化wchar_t
数组。
我不能使用wchar_t*
指针,因为它在程序的后面部分给我一个错误。我需要初始化类似的东西
string username = "My username";
wchar_t pszName[] = .....?.....;
【问题讨论】:
***.com/questions/10546514/initialize-wide-char-array ***.com/questions/2573834/… 您的string
是否仅包含 ASCII 字符或某些 Unicode 字符编码?
是的,先生,我的字符串只包含 ASCII 字符
@xskxzr 谢谢你的回复。我参考了您提供的链接但是我找不到 wchat_t[] 数组的任何初始化。我发现找到数组的长度并不困难。但是让我想到的是 数组。就像我在问题中提到的那样,指针不符合我的要求。
【参考方案1】:
#include <string>
#include <vector>
#include <windows.h>
std::wstring str_to_wstr(std::string const & str)
int length = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), 0, 0);
if (!length)
return L"utf-8 to utf-16 conversion error!";
std::vector<wchar_t> buffer(length + 1);
if (!MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), buffer.data(), length))
return L"utf-8 to utf-16 conversion error!";
return std::wstring(buffer.data(), length);
// ...
std::string username "My username" ;
std::wstring utf_16_username str_to_wstr(username) ;
// ... use:
utf_16_username.data(); // wherever you would have used pszName
【讨论】:
我会选择抛出异常而不是在失败时返回错误字符串。在最终返回时,我会选择使用将长度作为输入的wstring
构造函数,而不是依赖buffer
被空终止。您使用MultiByteToWideChar
的方式不会输出空终止符,您依赖于vector
构造函数提供的终止符。但MultiByteToWideChar
返回写入buffer
的字符数,因此wstring
无需再次计数。
@Remy Lebeau "MultiByteToWideChar
返回写入缓冲区的字符数,因此不需要 wstring 再次计算它们。"你是对的,不用数两次。
您应该使用硬编码的 CP_UTF8,因为您的错误确实表明它需要 UTF8 输入...
现在我再看一遍,你可以直接写入分配的wstring。你现在正在制作一个多余的副本。 Pre-C++17(但严格只在 C++110 之后,使用&buffer[0]
,否则只通过buffer.data()
。
@RemyLebeau 这看起来像复制粘贴,例如2nd post【参考方案2】:
您可以使用std::mbstowcs
function 将您的字符串转换为wchar_t*
:
std::string username = "My username"; //set your username
wchar_t pszName[] = L"My username"; //initialize pszName with a certain length wide string
std::mbstowcs(pszName, name.c_str(), std::wcslen(pszName)); //copy and convert name from username to pszName
你需要包括:
#include <string>
#include <cstdlib>
请注意,您必须为pszName
指定一个最大长度,并且这个值实际上必须在内存中至少分配这个长度!否则会导致运行时崩溃!
使用当前实现,您只需将正确长度的虚拟名称插入pszName
并使用std::wcslen
function 获得正确的长度。
【讨论】:
以上是关于使用字符串初始化 wchar_t[]的主要内容,如果未能解决你的问题,请参考以下文章