首页 > 解决方案 > 如何将 std::wstring 转换为 char const []

问题描述

我一直在尝试将 wstring 转换为 char[] 到目前为止没有成功。这些类型是完全不兼容的,还是有办法从一种转换为另一种?

到目前为止,我已经尝试了以下两种方法,但都没有成功。

char const testTwo[] = testOne;
char const testTwo[] = testOne.c_str();

标签: c++

解决方案


首先,您必须了解 是如何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用于此目的


推荐阅读