GCC是否支持Microsoft等效的wmain()?我正在编写C程序,需要在整个过程中使用Unicode。如果没有,可以将char转换为wchar_t?
答案 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这样的好库。
答案 2 :(得分:0)
如果要处理不带wmain
的Unicode命令行参数,可以使用无参数标准main
函数和Windows API函数GetCommandLineW
,CommandLineToArgvW
,和LocalFree
。 CommandLineToArgvW
使用与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)。