c++ - 为什么 STL “正式”不支持 std::string 到 std::wstring 的转换?
问题描述
我知道std::string
并且std::wstring
来自相同的基本类型std::basic_string<>
。但是没有一种“官方”的方式可以将std::string
数据转换为std::wstring
使用 C++ STL?我的意思是 Windows 提供MultiByteToWideChar()
转换,但为什么 STL 不能提供转换?
我std::codecvt
以前用来完成它,但现在它说它已被弃用。为什么STL首先删除了这个支持?
提前致谢。
解决方案
的字符编码不是std::string
C++标准定义的,astd::string
可以保存任何可以用1字节char
元素表示的编码,包括UTF-7/8、ISO-8859-x、Windows-125x等。
此外, 的大小wchar_t
是实现定义的,不是由标准定义的,所以即使 的编码也std::wstring
可以变化。在 Windows 上,wchar_t
是 2 个字节,因此std::wstring
使用 UCS-2/UTF-16 编码。而在其他平台上,wchar_t
是 4 个字节,所以std::wstring
使用 UCS-4/UTF-32。
因此,没有一种单一的转换可以满足std::string <-> std::wstring
所有平台和用例中所有可能的转换组合。因此,您需要知道源字符串的编码以及目标字符串的预期编码,才能执行转换。
是的,C++ 标准确实为这项任务提供了std::codecvt
和std::wstring_convert
/ std::wbuffer_convert
,但正如您所指出的,它们已被弃用。没有提供标准替代品(还没有?)。
因此,您最好使用 3rd 方 Unicode API/库来处理字符转换。
推荐阅读
- java - 为什么我找不到对 iText 文档的引用?
- jquery - 用于表单提交的 JQuery 脚本在 Chrome 中运行良好,但在 IE11 中运行良好
- python - SymPy中眼睛和身份的区别
- amazon-web-services - 在 user_data 配置文件中实现“for 循环”
- image - 在qml中拖动矩形的角时如何制作可调整大小的矩形
- c# - Winforms - Webbrowser 将 onClick 事件添加到表格单元格
- javascript - 带有 Konva.js 的上下文菜单
- apache-spark - Spark:在不更改列的可为空属性的情况下转换小数
- php - “大于”和“小于”运算符在查询中不起作用
- hashicorp-vault - Vault:如何获取 kv 机密列表