如何将wstring转换为字符串?

2024-01-10

问题是如何将wstring转换为string?

我有下一个例子:

#include <string>
#include <iostream>

int main()
{
    std::wstring ws = L"Hello";
    std::string s( ws.begin(), ws.end() );

  //std::cout <<"std::string =     "<<s<<std::endl;
    std::wcout<<"std::wstring =    "<<ws<<std::endl;
    std::cout <<"std::string =     "<<s<<std::endl;
}

注释掉行的输出是:

std::string =     Hello
std::wstring =    Hello
std::string =     Hello

但没有只是:

std::wstring =    Hello

例子中有什么问题吗?我可以像上面那样进行转换吗?

EDIT

新的例子(考虑到一些答案)是

#include <string>
#include <iostream>
#include <sstream>
#include <locale>

int main()
{
    setlocale(LC_CTYPE, "");

    const std::wstring ws = L"Hello";
    const std::string s( ws.begin(), ws.end() );

    std::cout<<"std::string =     "<<s<<std::endl;
    std::wcout<<"std::wstring =    "<<ws<<std::endl;

    std::stringstream ss;
    ss << ws.c_str();
    std::cout<<"std::stringstream =     "<<ss.str()<<std::endl;
}

输出是:

std::string =     Hello
std::wstring =    Hello
std::stringstream =     0x860283c

因此 stringstream 不能用于将 wstring 转换为 string。


正如 Cubbi 在其中一条评论中指出的那样,std::wstring_convert(C++11) 提供了一个简洁的解决方案(您需要#include <locale> and <codecvt>):

std::wstring string_to_convert;

//setup converter
using convert_type = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_type, wchar_t> converter;

//use converter (.to_bytes: wstr->str, .from_bytes: str->wstr)
std::string converted_str = converter.to_bytes( string_to_convert );

我使用的是wcstombs在我遇到这个之前,还有繁琐的内存分配/释放。

http://en.cppreference.com/w/cpp/locale/wstring_convert http://en.cppreference.com/w/cpp/locale/wstring_convert

更新(2013.11.28)

一个衬垫可以这样表述(谢谢格斯的评论):

std::wstring str = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes("some string");

包装函数可以这样表述:(感谢 ArmanSchwarz 的评论)

std::wstring s2ws(const std::string& str)
{
    using convert_typeX = std::codecvt_utf8<wchar_t>;
    std::wstring_convert<convert_typeX, wchar_t> converterX;

    return converterX.from_bytes(str);
}

std::string ws2s(const std::wstring& wstr)
{
    using convert_typeX = std::codecvt_utf8<wchar_t>;
    std::wstring_convert<convert_typeX, wchar_t> converterX;

    return converterX.to_bytes(wstr);
}

注:关于是否string/wstring应作为引用或文字传递给函数(由于 C++11 和编译器更新)。我会将决定权留给实施人员,但这是值得了解的。

注意:我正在使用std::codecvt_utf8在上面的代码中,但如果您不使用 UTF-8,则需要将其更改为您正在使用的适当编码:

http://en.cppreference.com/w/cpp/header/codecvt http://en.cppreference.com/w/cpp/header/codecvt

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将wstring转换为字符串? 的相关文章

随机推荐

  • 如何在javascript中禁用输入文本框上的键盘事件

    我有一个图像 我使用键盘对其进行一些操作 翻译 缩放 在图像上方 我有一个输入文本框 显示数据集中图像的编号 当光标位于文本框上时如何禁用图像操作 即禁用我分配给每个键盘的行为 我还希望仍然能够编辑文本框 例如移动到图像编号 xx 从我在这
  • 如何在WPF中正确刷新自定义形状?

    我创建了一条自定义行 旁边有一些文本 形状是一个子类System Windows Shapes Shape 由于某种原因 当我更改线的坐标时 文本不会刷新 我知道关于InvalidateVisual 方法 但每次我移动元素时 我都必须调用它
  • Xcode 调试:查看 NSNumber 的值?

    是否可以在变量监视窗口中的调试器数据提示中看到 NSNumber 的数值 我在 NSNumber 中存储一个整数值 并希望在调试期间看到该值 我已经在调试器中尝试了一些数据格式化程序 但没有太大帮助 打开调试器视图并在摘要列中输入 int
  • 尝试在 python 中创建 virtualenv 并激活它

    我很难在 Python 中创建 virtualenv 并激活它 我正在研究Windows操作系统 在命令提示符下 我通过输入以下命令安装了 virtualenv pip install virtualenv 然后 为了在其中创建虚拟环境 我
  • 从 Javascript 中的对象列表中提取对象属性

    我从 API 接收到以下对象 2012 12 12 id 1234 type A id 1235 type A id 1236 type B 2012 12 13 id 1237 type A id 1238 type C id 1239
  • 需要一个策略将 Intellij IDEA 项目文件放入 Git 中

    需要一个将 Intellij IDEA 项目文件放入 Git 的策略 主要问题是如果idea项目文件在git中 如何避免分支之间的合并冲突 另一个问题是把它们保存在git中方便吗 如何避免合并 您可以保护某些文件不被合并合并管理器 http
  • SQL Server中的SQL group_concat函数[重复]

    这个问题在这里已经有答案了 如果有一张名为employee的表 EmpID EmpName 1 Mary 1 John 1 Sam 2 Alaina 2 Edward 我需要这种格式的结果 EmpID EmpName 1 Mary John
  • 如何使用 Alpaca 创建必需的条件字段?

    有谁知道如何定义依赖于另一个字段的必填字段 例如如果field1被标记true then field2必须为必填项 否则不应填写字段 2 这是我目前的尝试 field1 title Field1 type string enum true
  • Google Play 商店中的 Android 版本:选择加入 URL 在哪里?

    我正在努力在 Google Play 商店中发布我们的应用程序的私人内部版本 我收到一条消息 显示 当您发布应用程序时 此处将提供选择加入链接 但我不知道还需要做什么来发布我的 alpha 测试 apk 发布状态显示 全面推出 这向我表明一
  • 如何在 Windows 上为 python 3.7 正确设置 pyarrow

    我一直在尝试通过 pip 安装 pyarrow pip install pyarrow 并且 正如 Yagav 所建议的 py 3 7 m pip install user pyarrow 和康达 conda install c conda
  • UIControl 未接收触摸

    我有一个 UIControl 它实现了 Touchs Begin 方法 如下所示 void touchesBegan NSSet touches withEvent UIEvent event super touchesBegan touc
  • ASP.NET MVC 3 对嵌套对象的验证未按预期工作 - 验证子对象两次而不是父对象

    我正在尝试让 ASP NET MVC 3 从复杂的嵌套对象生成表单 我发现了一种意外的验证行为 我不确定这是否是 DefaultModelBinder 中的错误 如果我有两个对象 我们将 父对象 称为 OuterObject 并且它具有 I
  • 具有现有样式表的应用程序的 CSS 框架

    我正在构建一个 chrome 扩展 它将一个小部件之类的东西附加到 Gmail 消息 当用户访问 gmail com 网站时 它会出现在每封电子邮件的下方 类似于 gmail 上下文小工具 我研究了一些在我的应用程序中使用的 css 框架
  • ReferenceError:模块未定义 - Karma/Jasmine 配置与 Angular/Laravel 应用程序

    我有一个现有的 Angular Laravel 应用程序 其中 Laravel 充当仅提供 JSON 数据的 Angular 前端的 API 加载角度应用程序的页面 index php 目前由 Laravel 提供服务 从那时起 Angul
  • 哪种 TypeScript 配置会产生最接近 Node.js 14 功能的输出?

    随着 Node js 更新对 ES2020 的支持并添加对 ES 模块的支持 如何配置 TypeScript 来输出利用所有这些新功能的 JavaScript 代码 从 Node js 开始14 0 0 100 支持ES2020 对ES M
  • Angular 2、@ngtools/webpack、AOT

    我正在尝试使用 webpack 和 ngtools webpack 在 Angular 2 中使用 AOT 我的编译没有任何错误 但是当我在浏览器上打开该网站时 出现控制台错误 No NgModule metadata found for
  • 高频包 (R) 股票报价数据清理中的时区问题

    对我来说 这看起来非常可疑 我已经通过它进行了调试 但我仍然不确定它是否是一个错误 我准备了样本数据来复制这个问题 文件不小 25MB 典型交易日的真实报价数据 下载link https transfer pcloud com downlo
  • CSS 中的层次结构显示

    我在使用 CSS 进行分层显示 如文件和文件夹树 时遇到困难 我使用嵌套无序列表 ul li animals ul li dogs li li cats li ul li ul 它们通过适当的 CSS 减去连接线可以很好地显示 我需要连接线
  • 如何替换 ruby​​ 字符串中的文本

    我正在尝试用 Ruby 编写一个非常简单的方法 它接受一个字符串和一个单词数组 并检查该字符串是否包含任何单词 如果包含 则用大写字母替换它们 我尝试过 但由于我的 Ruby 技能水平 效果并不好 def my words my sente
  • 如何将wstring转换为字符串?

    问题是如何将wstring转换为string 我有下一个例子 include