c++ - 如何将 std::wstring 转换为 char const []
问题描述
我一直在尝试将 wstring 转换为 char[] 到目前为止没有成功。这些类型是完全不兼容的,还是有办法从一种转换为另一种?
到目前为止,我已经尝试了以下两种方法,但都没有成功。
char const testTwo[] = testOne;
char const testTwo[] = testOne.c_str();
解决方案
首先,您必须了解 是如何std::wstring
编码的。您应该查看获取该字符串的 API 文档。
std::wstring
通常以系统本机范围编码进行编码。本机编码是什么,应在您所针对的系统的文档中指定。不同系统的原生编码通常不同,如果您打算针对多个系统,则需要注意这一点。Windows 的原生宽编码是 UTF-16,而 POSIX 通常使用 UTF-32。
接下来,您需要决定您打算对窄字符数组使用什么编码。选择可能取决于您打算如何处理窄字符串。一个典型的常见选择是 UTF-8 或系统本机窄编码。就像宽编码一样,本机窄编码是系统特定的。UTF-8 在 POSIX 系统上相当普遍,而 Windows 使用恒定宽度字符集,这取决于系统的语言。
此时,您应该知道要转换的编码是什么。如果您同时将宽本机编码转换为窄本机编码,那么您很幸运。为此有一个标准功能:std::wcsrtombs
.
如果任一编码不是本机编码,那么您需要查找相应编码的文档,了解每个代码单元、代码点、字形等映射到的内容。Unicode 规范可以在这里找到。如果您要转换为非 unicode,那么您需要决定如何处理在目标编码中没有相应代码点的字符。
与往常一样,使用现有软件节省时间是个好主意。您可以使用现有的库(例如iconv )跳过学习不同的编码及其转换。
PS您可能无法在编译时知道生成的窄字符串的长度,因此您可能需要动态分配数组。这也意味着数组不能是 const。我建议std::string
用于此目的
推荐阅读
- docker - 如果我在主机中更改该文件,Shiny docker 映像中的文件不会更改
- react-native - 无法将道具传递给子组件
- kubernetes - Kubernetes 管理员隔离
- batch-file - 如何正确设置 -backupTarget:\\?\Volume{GUID}?
- javascript - 如何循环和切换具有相同类/VanillaJS 的元素?
- php - PHP 致命错误:未捕获的 Google\ApiCore\ApiException:
- c# - 错误:找不到类型或名称空间“GraphQLRequest”
- docker - 为什么不默认使用root用户
- c# - Azure Pipelines - 在 .NET Core 项目中使用从 NuGet 下载的工具
- python - 使用 OpenCV 在 python 中创建橡皮擦工具