wchar_t argv in C - Unicode

时间:2011-03-09 03:58:55

标签: c unicode command-line

GCC是否支持Microsoft等效的wmain()?我正在编写C程序,需要在整个过程中使用Unicode。如果没有,可以将char转换为wchar_t?

4 个答案:

答案 0 :(得分:7)

Unicode不需要wchar_t。您可以使用char进行Unicode的utf-8编码。另外,wchar_t可以是不同的大小。在Windows上,它是16位,但在许多Linux / Unix平台上它是32位。

有关GCC的更多信息,请参阅我通过Google搜索找到的这篇文章:

http://article.gmane.org/gmane.comp.gnu.mingw.user/22962

(据此,关于GCC是否支持wmain的问题的答案是“否”。)

答案 1 :(得分:2)

C的许多标准字符串函数都是编码不可知的。您可以使用char*存储UTF-8编码的字符串,并安全地使用它们:

strcpy strncpy strcat strncat strcmp strncmp strdup strchr 
strrchr strcspn strspn strpbrk strstr strtok

其他一些函数无法使用Unicode字符串为您提供正确的结果。例如,strlen始终计算字节数,而不是字符数。可以使用mbstowcs(NULL,s,0)以便携方式在C中计算字符数。它会将s中成功翻译成wchar_t的字符数返回给{{1}}。只要选择了适当的语言环境,这适用于UTF-8,就像任何其他支持的编码一样。

如果你想对Unicode字符串进行高级操作,比如复杂的代码页转换,正则表达式,单词边界上的文本换行等,我建议你使用像ICU这样的好库。

参考:Using Unicode in C/C++

答案 2 :(得分:0)

如果要处理不带wmain的Unicode命令行参数,可以使用无参数标准main函数和Windows API函数GetCommandLineWCommandLineToArgvW,和LocalFreeCommandLineToArgvW使用与Microsoft运行时库相同的same rules for command line parsing

答案 3 :(得分:0)

如果您确实想使用宽字符串,mbstowcs会将多字节字符串转换为wchar_t字符串。它假定多字节字符串的编码取决于当前语言环境的LC_CTYPE类别。有必要用setlocale设置它;否则你将默认获得“C”语言环境。

问题仍然是argv中使用了什么字符编码。这可能是UTF-8,也可能是像Latin-1这样的单字节编码之一。这取决于您的终端设置。尝试使用xterm,当我在命令行中传递“é”时,我得到argv的不同值,具体取决于xterm继承的LANG的值:对于LANG = en_US.UTF-8,它给出了“c3 a9” ;对于LANG = en_US,它给出了“e9”(我认为这是拉丁语-1。)

您可以首先使用setlocale(LC_CTYPE, "")setlocale(LC_ALL, "")从环境中获取区域设置,以使用正确的多字节格式(从环境变量设置)。但是,如果在启动终端仿真器后更改LANG,则会出现问题。

glibc为字符集转换提供了其他一些更合适的功能 - 有关详细信息,请参阅glibc手册的“字符集处理”部分。我的经验是将argv中的字符串转换为给定的编码非常棘手,可能需要分两个阶段完成:一次将其转换为wchar_t格式,其次将其转换为wchar_t到期望的编码(例如UTF-8)。