我有一个来自C代码的exe文件构建。有一种情况是俄语字符串作为参数传递给这个exe。
当我用这个参数调用exe时,任务管理器完全显示俄语字符串作为命令行参数。
但是当我从我的exe中打印出那个参数时,它只会打印???
如何让我的C程序(因此exe)处理俄语字符?
答案 0 :(得分:4)
答案取决于您的计划的目标平台。传统上,C或C ++程序从main(....)
函数开始,它可能有面向字节的字符串作为参数传递(注意char*
在主声明int main(int argc, char* argv[])
中})。面向字节的字符串意味着字符串中的字符以特定的面向字节的编码传递,并且Я
中的一个字符(例如Ñ
或UTF-8
)可能需要超过1 {{1} }}
现在Linux / Unix平台上使用最广泛的编码是UTF-8,但前段时间还有其他编码使用,如ISO8859-1,KOI8-R和其他许多编码。大多数程序仍然是面向字节的,因为UTF-8编码主要向后兼容所有传统的C字符串API。
另一方面,宽字符串使用起来更方便,因为宽字符串中的每个字符都使用预定义的空格。因此,例如,以下表达式传递断言测试:char
(如果使用UTF-8 char字符串,则测试将失败)。因此,如果您的程序对字母执行大量操作,而不是整个字符串,则宽字符串可以作为解决方案。
要将字符串从多字节转换为宽字符编码,如果您的编译器支持它,您可以使用mbtowc函数系列或那个非常棒的codecvt C ++ - 11工具(可能它不支持)截至2014年年中:))
在Windows中,字符串可以作为面向字节的字符串传递,对于俄语,最有可能使用CP1251(取决于操作系统设置,但对于在俄罗斯和CIS中销售的Windows,这是最流行的变种)。此外,MSVC还具有语言扩展,允许应用程序员通过手动将字节串转换为宽字符串来避免所有这些复杂性,并使用std::wstring hello = L"Привет!¡Hola!"; assert(L'в' == hello[3]);
函数的变体instantly receives widestrings
答案 1 :(得分:1)
@ user3159253提供了一个很好的答案,我将完成更多的参考:
您正面临国际化(参见i18n,i10n)问题。 您可能需要iconv等工具进行字符集转换,gettext进行字符串翻译。