2013-03-03 20 views
1

我一直在用C++編寫一個新的命令行應用程序。我們支持的一個平臺當然是Windows。在windows C++控制檯應用程序中使用wchar_t/wmain有意義嗎?

默認情況下,Windows控制檯根據語言環境使用OEM代碼頁(例如,在我的計算機上,它是CP437/DOS.Western)。我想,如果它是Windows Cyrillic版本,那應該是CP866,依此類推。這些OEM代碼頁只包含256個字符)

我想這意味着Windows控制檯會根據默認代碼頁將輸入按鍵轉換爲字符。 (並且,根據當前選擇的字體,如果存在相應的字形,則顯示它)。

  1. 在這種情況下,在我的應用程序中使用wmain/wchar_t和寬字符類型是否有意義?
  2. 使用寬類型有什麼優勢嗎?或者,如果只使用char *,是否存在嚴重問題?
  3. 當使用寬字符類型時,命令行參數和環境字符串的編碼是什麼 - (wchar_t * argv []和wchar_t * envp []),我的意思是。他們是由Windows CRT轉換爲UTF-16,還是他們沒有改變?

感謝您的貢獻。

回答

1

您似乎認爲Windows內部工作在指定的代碼頁中。這不是真的。 Windows內部工作在Unicode(UTF-16)。對於使用char而不是wchar_t的傳統軟件,將輸入和輸出轉換爲指定的代碼頁。

我覺得這是什麼意思是Windows控制檯轉換基於默認的代碼頁

這是不正確的輸入擊鍵轉換成字符。鍵盤到(Unicode)字符的映射由鍵盤佈局定義。這完全獨立於代碼頁面。例如,您可以在使用西里爾語代碼頁的系統上使用中文鍵盤佈局。

  1. 不僅使得它完全有必要使用wchar_t,它是推薦方式。
  2. 是的,有一個優點:您的程序可以處理Windows支持的所有字符。如果使用char,則不能處理任何不在當前代碼頁中的字符。
  3. 它們沒有轉換 - 它們保持原樣,即UTF-16字符。

不幸的是,命令提示符本身就是一個'ANSI'應用程序,所以它受到'ANSI'的所有限制,並且如果從命令提示符使用它,會影響您的應用程序。但是,可以以其他方式使用控制檯應用程序,而無需命令提示符窗口,然後它可以完全支持Unicode。

+0

@oofe,感謝您的回覆。然而,至今尚不清楚的東西很少。 1. Windows命令提示符有一個默認代碼頁。當前活動的代碼頁可以通過運行chcp命令來檢索;並且可以使用相同的命令進行更改。根據您的評論,它與當前使用的鍵盤佈局無關。那麼,這有什麼意義呢?不知道交叉場景中的行爲是什麼:中文kb佈局和西里爾代碼頁。 – 2013-03-19 12:16:42

+0

2.對於啓用了Unicode的應用程序,當從帶命令提示符的命令提示符處調用時,Windows CRT將命令行參數轉換爲UTF-16,並以wchar_t * argv []的形式傳遞給wmain()。是對的嗎?這是我在上面的問題3中的意思。 – 2013-03-19 12:25:58

相關問題