【问题标题】:C string to wide C stringC 字符串到宽 C 字符串
【发布时间】:2012-10-09 08:13:24
【问题描述】:

我确信这个问题被问了很多,但我只是想确保没有更好的方法来做到这一点。

基本上,我有一个 const char* 指向一个以 null 结尾的 C 字符串。我有另一个函数,它期望 const wchar_t* 指向具有相同字符的字符串。

目前,我一直在尝试这样做:

    size_t newsize = strlen(myCString) + 1;
    wchar_t * wcstring = new wchar_t[newsize];
    size_t convertedChars = 0;

    mbstowcs_s(&convertedChars, wcstring, newsize, myCString, _TRUNCATE);

    delete[] wcstring;

我需要在很多地方进行这些转换,因为我正在处理需要一个或另一个的第三方库。这是推荐的解决方法吗?

【问题讨论】:

  • 这在很大程度上取决于const char* 字符串的假定编码(可能是 UTF-8、ISO-Latin-1、KOI-8 等)。你必须知道那个编码。 gnu.org/software/libiconv library 你可能会感兴趣。
  • 您基本上是在正确的轨道上。您可以通过首先使用空指针运行mbstowcs 来获得正确的目标大小。不要忘记在程序开始时运行std::setlocale("");

标签: c++ unicode wchar-t c-strings


【解决方案1】:

假设您的数据都是 ASCII,那么您所做的几乎就是推荐的方法。如果那里有非 ASCII 数据,您需要知道它的编码是什么:UTF-8、Windows-1252、任何 ISO 8859 变体、SHIFT-JIS 等。每个都需要以不同的方式进行转换.

我唯一要改变的是使用mbstowcs 而不是mbstowcs_smbstowcs_s 仅在 Windows 上可用,而 mbstowcs 是可移植的标准 C99 函数。当然,如果您想避免使用 Microsoft 编译器的 CRT 弃用警告而不完全关闭它们,那么使用 #if 的宏测试在非 Windows 系统上使用 mbstowcsmbstowcs_s 是完全可以的在 Windows 系统上。

您还可以使用mbstowcs 来获取转换后的字符串的长度,方法是首先为目标传入NULL。这样,无论输入字符串有多长,您都可以避免截断;但是,它确实涉及将字符串转换两次。

对于非 ASCII 转换,我推荐使用libiconv

【讨论】:

  • 实际上它不会从 ASCII 转换——它会从您当前语言环境中 LC_CTYPE 隐含的任何格式转换,可能是 ASCII 或 UTF-8 或其他格式。
  • 您可能还想查看 mbsrtowcs(3),如果您将状态变量传递给它,它是线程安全的。它有一个“更安全”的界面,可在 Windows 和 Linux 上使用。
【解决方案2】:

您还没有说涉及到哪些编码。如果你有非多字节字符串,你可以使用这个:

std::string a("hello");
std::wstring b(s.begin(), s.end());

const wchar_t *wcString= b.c_str();

【讨论】:

    猜你喜欢
    • 2012-11-04
    • 2020-08-23
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    相关资源
    最近更新 更多