【问题标题】:how to handle russian string as a command line argument in C program如何在 C 程序中将俄语字符串作为命令行参数处理
【发布时间】:2026-02-21 15:35:01
【问题描述】:

我有一个从 C 代码构建的 exe 文件。有一种情况是俄语字符串作为参数传递给这个 exe。

当我用这个参数调用 exe 时,任务管理器将俄罗斯字符串完美地显示为命令行参数。

但是当我从我的 exe 打印该参数时,它只会打印 ???

如何让我的 C 程序(因此是 exe)处理俄语字符?

【问题讨论】:

  • 您需要在您的控制台和程序中提供unicode 支持。在程序中尝试使用wchar_t 数据类型(如果有)。
  • 使用 unicode / 多字节字符编译。
  • 你们能给我举例说明如何使用 unicode/multibyte 进行组合吗?我试过使用 wchar_t 但没有帮助
  • 看看C programming, unicode and the linux terminal它似乎解决了你的问题(来自终端的日文字符)
  • 它是特定于操作系统的。

标签: c


【解决方案1】:

答案取决于您的程序的目标平台。传统上,C 或 C++ 程序从 main(....) 函数开始其生命周期,该函数可能将 面向字节的 字符串作为参数传递(请注意主声明 int main(int argc, char* argv[]) 中的 char*)。面向字节的字符串意味着字符串中的字符以特定的面向字节的编码传递,一个字符,例如UTF-8 中的ЯÑ 可能需要超过1 个char

如今,Linux/Unix 平台上使用最广泛的编码是UTF-8,但前段时间还使用了其他编码,例如 ISO8859-1、KOI8-R 和许多其他编码。大多数程序仍然是面向字节的,因为 UTF-8 编码大部分向后兼容所有传统的 C 字符串 API。

另一方面,宽字符串使用起来更方便,因为宽字符串中的每个字符都使用预定义的空格。因此,例如,以下表达式通过断言测试:std::wstring hello = L"Привет!¡Hola!"; assert(L'в' == hello[3]);(如果使用 UTF-8 字符字符串,则测试将失败)。因此,如果您的程序对 letters 执行大量操作,而不是对整个字符串执行操作,那么可以使用宽字符串来解决。

要将字符串从多字节转换为宽字符编码,您可以使用mbtowc 函数系列或很棒的codecvt C++-11 工具,如果您的编译器支持它(可能在中期不支持) 2014 :))

在 Windows 中,字符串也可以作为面向字节的字符串传递,并且对于俄语最有可能使用 CP1251(取决于操作系统设置,但对于在俄罗斯和独联体国家销售的 Windows,这是最流行的变体)。此外,MSVC 有一个语言扩展,允许应用程序程序员通过手动将字节串转换为宽字符串来避免所有这些复杂性,并使用 main() 函数的变体 instantly receives widestrings

【讨论】:

    【解决方案2】:

    @user3159253 提供了一个很好的答案,我将补充一些参考资料:

    • Windows:通常使用宽字符
    • Linux:通常它使用 UTF-8 编码:在这种情况下请do NOT use wide chars

    您正面临国际化(参见 )问题。 您可能需要像 iconv 这样的工具来进行字符集转换,以及 gettext 来进行字符串翻译。

    【讨论】:

    • 好吧,我认为现在很多 Linux/Unix 程序都使用各种工具包,其中许多是围绕/使用宽字符串构建的。例如,QtwxWidgets (wxString) 等等。 Python 和 Java 在内部也使用宽字符串。所以我认为目前可以在输入和输出上转换字节串,并使用宽字符串执行所有内部计算
    • 它确实有效!但是,如果您有可移植性限制,宽字符可能真的很烦人,因为它们的表示可以vary。但我是作为 Linux 用户和 C 程序员说的:p 最重要的是选择一种内部格式并坚持下去:输入的所有字符串都应转换为这种格式,并在需要时转换回输出。跨度>