字符* 到常量 wchar_t * 转换
char* to const wchar_t * conversion
我需要将字符指针转换为w_char *才能使用ParseNetworkString()。我尝试自己寻找解决方案,虽然我找到了一个解决方案,但有一个问题阻止我使用它:
b1naryatr0phy在另一篇文章中说:
std::wstring name( L"Steve Nash" );
const wchar_t* szName = name.c_str();
这几乎对我有用,除了我不能只传递字符串 explicity,因为它的值并不总是相同的,这意味着我不能只把它放在引号中。如果我用函数调用替换参数,那么第一行会给我一个错误(例如:std::wstring name(LgetIpAddress());我尝试过 std::wstring name(L" " + getIpAddress() + " "); ,认为它只需要在 L 后面加上引号,但这也不起作用。有什么建议吗?
谢谢! :)
对能回答这个问题的人加倍赞!
链接到其他帖子: 我想将 std::string 转换为常量 wchar_t *
P.S. 抱歉,只是为了澄清,getIpAddress 返回一个字符指针
getIpAddress()
的类型是什么?
下面是一个片段,展示了如何将string
转换为wstring
(使用标准 C++11,无错误检查):
wstring to_wstring(string const& str)
{
size_t len = mbstowcs(nullptr, &str[0], 0);
if (len == -1) // invalid source str, throw
wstring wstr(len, 0);
mbstowcs(&wstr[0], &str[0], wstr.size());
return wstr;
}
你只看了另一个答案的一部分。它继续解释您需要执行MultiByteToWideChar
才能从 8 位字符串转换为 16 位字符串。
这假设wchar_t在你的平台上使用 UTF-16(我假设是 Windows,从你提到的 ParseNetworkString())。它还假定 char* 使用 UTF-8 而不是传统编码,因为您确实不应该使用传统编码,即使在 Windows 上也是如此。
#include <codecvt>
int main() {
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t> convert;
std::wstring name = convert.from_bytes("Steve Nash");
const wchar_t* szName = name.c_str();
}
如果您使用的是旧编码,那么您应该通过完全迁移到wchar_t API(假设您不关心可移植代码)或使用 UTF-8 作为内部 char* 编码来解决此问题。如果您坚持使用旧编码,则需要使用处理转换它们的函数之一,例如mbstowcs()
(它是区域设置敏感的,这会带来一大堆新问题),或者使用MultiByteToWideChar()
有一些类似的问题,但与 Windows 区域设置的网格更好。
- 是否应避免从非常量迭代器转换为常量迭代器?
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 为什么我收到"从常量指针到指针的转换无效?
- 从'size_t'转换为"常量双倍",可能会丢失数据
- 在编译时将常量字符* 转换为常量 char_type*
- 为什么下面带有非常量转换函数的代码没有歧义?
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 字符串强制转换为常量字符*
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 将错误作为从字符串常量到"char*"的已弃用转换 [-Wwrite-strings]
- 将编译时常量向量转换为堆分配版本
- 在<uint8_t> <char> c++ 中将常量向量转换为常量向量
- 在不同类型之间转换常量指针
- 转换(常量字符*)变量出错
- C++大小写中的类型转换常量字符串
- 转换常量无符号字符无效
- 转换常量表达式定义的说明
- c++ 11强制转换常量迭代器,指向shared_ptr对象的容器
- 条件运算符+上转换+常量引用
- c++限定转换-常量和模板