簡體   English   中英

C中的wchar_t argv — Unicode

[英]wchar_t argv in C — Unicode

GCC是否支持與wmain()等效的Microsoft? 我正在編寫C程序,並且需要始終使用Unicode。 如果不是,可以將char轉換為wchar_t嗎?

對於Unicode,您不需要wchar_t 您可以將char用於utf-8 Unicode編碼。 另外, wchar_t可以是不同的大小。 在Windows上,它是16位,但是在許多Linux / Unix平台上,它是32位。

有關GCC的更多信息,請參閱我通過Google搜索找到的這篇文章:

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

(因此,關於您的GCC是否支持wmain問題的答案為“否”。)

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的字符數。 只要已選擇適當的語言環境,此方法就可以與其他支持的編碼一樣適用於UTF-8。

如果您想對Unicode字符串執行高級操作,例如復雜的代碼頁轉換,正則表達式,單詞邊界上的文字換行等,建議您使用ICU之類的優質庫。

請參閱: 在C / C ++中使用Unicode

如果確實要使用寬字符串,則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”(我認為這是Latin-1。)

您可以首先使用setlocale(LC_CTYPE, "")setlocale(LC_ALL, "")從環境中獲取語言環境,以使用正確的多字節格式(由環境變量設置)。 但是,如果在啟動終端仿真器后更改了LANG,則會遇到問題。

glibc提供了一些其他更適合字符集轉換的功能-有關更多信息,請參見glibc手冊的“字符集處理”部分。 我的經驗是,將argv中的字符串轉換為給定的編碼非常棘手,可能必須分兩個階段完成:一次將其轉換為wchar_t格式,其次將其從wchar_t轉換為所需的編碼(例如UTF- 8)。

如果要在不使用wmain情況下處理Unicode命令行參數,則可以使用無參數的標准main函數和Windows API函數GetCommandLineWCommandLineToArgvWLocalFree CommandLineToArgvW使用與Microsoft運行時庫相同的命令行解析規則

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM