使用字符串初始化 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 之后,使用&amp;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[]的主要内容,如果未能解决你的问题,请参考以下文章

不推荐从字符串 const 转换。到 wchar_t*

Python 3.3 C 字符串处理(wchar_t 与 char)

如何初始化 wchar_t 变量?

将 wchar_t* 转换为 UTF-16 字符串

将 wchar_t* 转换为字符串 [重复]

使用 ctypes 和 wchar_t 时如何从 C++ 获取字符串到 python?