【问题标题】:How to convert wchar_t** to char**?如何将 wchar_t** 转换为 char**?
【发布时间】:2011-03-14 17:24:45
【问题描述】:

我得到 argv 作为 wchar_t**(见下文),因为我需要使用 unicode,但我需要将其转换为 char **。我该怎么做?

int wmain(int argc, wchar_t** argv) 
{ 

【问题讨论】:

  • 你不会 :-p 我强烈赞成用 Unicode 来完成你的所有工作,因为这是给你的。您只需要分配char** myArgs = new char*[argc];,然后循环遍历argv,一次转换每个字符串,然后用转换后的字符串填写myArgs - 我希望有人会为此提供代码,这就是我不发布答案的原因。但请考虑采用另一种方式 - 修改使用 char** 的代码以改为接受 wchar_t**。
  • 转换,因为我忘了提到它,是用WideCharToMultiBytewcstombs 完成的(更喜欢_s 版本)。但是你需要分配一个缓冲区来接收字符串,如果你弄错了,可能会调整它的大小——我没有写代码,因为我不记得是否有一种简洁/简单的方法可以做到这一点。我猜最容易瞄准高点。
  • 感谢您谈论您确切知道的事情,而不是假装您知道并且可以做任何事情。所以为你的谦虚+2!
  • 如果您需要使用 Unicode,您应该转换为char*,句号。

标签: c++ char wchar-t


【解决方案1】:

这就是诀窍:

#define MAXLEN 512
   char tx[MAXLEN];
   mbstowcs(argv[i], tx, MAXLEN);

【讨论】:

    【解决方案2】:

    有不止一种方法可以做到这一点。根据您的环境和可用的编译器/标准库/其他库,您至少有三种选择:

    1. 使用 std::locale 和 std::codecvt 方面;
    2. 使用 C 语言环境函数,例如 std::mbstowcs();
    3. 使用第 3 方函数,例如 *nix 上的 iconv() 或 Windows 上的 WideCharToMultiByte()。

    您真的需要进行转换吗?

    您应该意识到通常(尤其是在 Windows 上)从 wchar_t 字符串到 char 字符串的转换是有损转换。系统用于 char 字符串的字符集通常不是 UTF-8。例如。如果您将带有国家字符或某些亚洲语言的文件名转换为 char 字符串,您很可能会得到一些无法真正用于访问原始文件的内容。

    【讨论】:

      【解决方案3】:

      为什么需要转换?在大多数情况下,您需要更改项目设置,因此所有内容都接受宽字符。如果第三方库需要非 Unicode 字符串,那么您需要使用适当的 Unicode 选项重新编译它。如果没有合适的 Unicode 选项,我会摆脱这个库并找到(编写)一个更好的。

      【讨论】:

        猜你喜欢
        • 2018-01-07
        • 2021-01-29
        • 2011-07-27
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        • 2012-06-07
        相关资源
        最近更新 更多