2012-05-25 55 views
2

wcstombs有三個參數。如何使用wcstombs而不是WideCharToMultiByte?

WideCharToMultiByte有八個指定參數時,

如何更換

如何使用wcstombs寫這樣的:?

int kk = WideCharToMultiByte(936, 0, szBn, ccBn+1, 0, 0, 0, 0); 

如何使用wcstombs寫這樣的:

int kk= WideCharToMultiByte(936, 
          0, 
          szBn, 
          ccBn+1, 
          kkburr, 
          (ccBn+1)*sizeof(wchar_t), 
          0, 
          0) 

它是一樣的嗎?

+0

不是一回事,你不能用wcstombs()指定一個語言環境或代碼頁,你只能得到默認的語言環境。你真的*試圖做什麼? –

+2

也許[這個問題](http://stackoverflow.com/questions/6300804/wchars-encodings-standards-and-portability)我的一些興趣爲你。 –

+0

WideCharToMultiByte代碼在Pc上運行。然後我想在Mac上運行代碼,所以我需要刪除WideCharToMultiByte,因爲它不能在Mac上運行。 – cuichang

回答

3

WideCharToMultiByte做了很大的不同wcstombs,所以它至少在某種程度上doubtful¹這個替代將是成功的。

具體來說,WCTMB從UTF-16轉換爲您選擇的另一個字符集(和編碼)。 wcstombs從「寬字符字符串」轉換爲「多字節字符串」,但標準將這些術語的確切定義留給實現者。

換句話說:WCTMB從已知編碼轉換爲另一種已知編碼。 wcstombs將未知編碼轉換爲另一個未知編碼。你不能用後者替換前者,特別是如果你想轉換成中文編碼(不是936是什麼?)。

尋求做這個替換的原因是什麼?無論如何,幾乎可以肯定的是,有更合適的方法來實現這一目標。

更新:如果你想要一個平臺獨立,可靠的解決方案,那麼我建議ICU。不要指望找到WCTMB的單行替換品,因爲它根本不存在。


¹極度掩飾

+0

是的,936是指chs。 – cuichang

0
  • 所得編碼該wcstombs轉換爲依賴於當前區域而WideCharToMultiByte可以明確給出一個代碼頁。
  • wcstombs從「寬字符串」轉換而來,其中編碼依賴於標準庫的實現。 WideCharToMultiByte從UTF-16中的字符串轉換而來。寬字符wcstombs依賴不能用UTF-16編碼,但在Windows寬字符是UTF-16。
  • wcstombs是便攜式,WideCharToMultiByte不是。如果您的目標平臺只有Windows,那麼它並不重要。
  • WideCharToMultiByte允許指定將被使用的「默認字符」,而不是在目標編碼中不能表示的字符。

因此,WideCharToMultiByte功能更強大,可能被用作wcstombs的後端。

如果您當前的代碼頁不是936,那麼您詢問的替換是不可能的。

+0

我目前的代碼頁是936,有可能嗎? – cuichang

+0

@cuichang必須。去嘗試一下! –

+0

你能舉一個例子代碼嗎? – cuichang