2010-07-12 76 views
4

我得到argv作爲wchar_t **(見下文),因爲我需要使用unicode,但我需要將其轉換爲char **。我怎樣才能做到這一點?如何將wchar_t **轉換爲char **?

int wmain(int argc, wchar_t** argv) 
{ 
+2

你不會:-p我強烈支持所有你在Unicode中的工作,而這正是你得到的。你只需要分配'char ** myArgs = new char * [argc];'然後通過argv循環轉換每個字符串,然後用轉換的字符串填充'myArgs' - 我希望有人會給你這個代碼這就是爲什麼我沒有發佈答案。但請考慮以另一種方式 - 修改使用char **的代碼來接受wchar_t **。 – Rup 2010-07-12 09:36:06

+2

轉換,因爲我忘了提及它,是用'WideCharToMultiByte'或'wcstombs'(喜歡'_s'版本)完成的。但是你需要分配一個緩衝區來接收字符串,並且如果你弄錯了,可能會調整它的大小 - 我沒有編寫代碼,因爲我不記得是否有一種簡潔/簡單的方法來做到這一點。最簡單的就是高估我猜。 – Rup 2010-07-12 09:43:58

+0

謝謝你,你談論的東西,你正是知道,而不是假裝你知道,可以做任何事情。所以+2爲你的謙虛! – Narek 2010-07-12 09:52:35

回答

4

還有就是要做到這一點的方法不止一種。根據您的環境和現有的編譯器/標準庫/其他庫,你至少有三種選擇:

  1. 使用std ::語言環境和std ::的codecvt <>小;
  2. 使用C語言環境函數,如std :: mbstowcs();
  3. 在Windows上使用第三方函數如iconv()on * nix或WideCharToMultiByte()。

您是否確實需要進行轉換?

您應該認識到,經常(特別是在Windows上)從wchar_t字符串到char字符串的轉換是有損轉換。系統用於char字符串的字符集通常不是UTF-8。例如。如果將文件名用國家字符或某些亞洲語言轉換爲字符串,那麼最有可能獲得的東西不可用於訪問原始文件。

1

該做的伎倆:

#define MAXLEN 512 
    char tx[MAXLEN]; 
    mbstowcs(argv[i], tx, MAXLEN); 
0

爲什麼你需要轉換?在大多數情況下,你需要改變你的項目設置,所以一切都接受寬字符。如果第三方庫需要非Unicode字符串,則需要使用適當的Unicode選項重新編譯它。如果沒有適當的Unicode選項,我會擺脫這個庫,並找到(寫)一個更好的。

相關問題