2009-12-17 128 views
2

我有一種情況,我需要將char*WideString進行比較。
如何將WideString轉換爲C++中的char *?如何將System :: WideString轉換爲char *,反之亦然?

+1

你有沒有想過呢? (將char *轉換爲WideString) – 2009-12-17 23:57:30

+0

好吧,兩種方法都很好理解。不過,我寧願不使用WideString。 – Seth 2009-12-18 00:01:39

+0

也許你可以延伸'char'類型,直到它足夠寬? ;-) 由於'char'類型小於* WideString *所使用的類型,因此更好的方法是將較小的值轉換爲較大的值然後進行比較。 – 2009-12-18 00:33:42

回答

3
+0

該解決方案僅限於Windows。 – 2009-12-18 00:15:09

+0

是的,C99 wcstombs()/ mbstowcs()在其他答案中已有介紹。 – Gonzalo 2009-12-18 00:18:22

+0

比利,這是System :: WideString類型,這是這個問題的主題。 – 2009-12-18 02:48:15

1

不可能。其實,你混合了兩個不同的概念:

  • Widestring意味着UTF-16編碼的緩衝區。
  • char *可能包含任何內容,從UTF-8到純ASCII文本(在這種情況下,只有在您的寬字符串不包含非ASCII字符時纔可以轉換)。

請參閱我有關如何正確處理文本的https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful的回答。

+0

wchar_t被定義爲僅在Windows上包含UTF-16編碼數據。對於其他操作系統可能會有所不同。一般來說,它是依賴於區域的。 – mch 2009-12-18 01:49:58

+0

我有一個提供WideString的第三方組件。但是,我需要將它與std :: string進行比較,如果不可能有什麼選項? – Seth 2009-12-18 01:49:59

+0

轉換其他方式,然後比較。 – 2009-12-18 03:39:34

1

比較一個System::WideString對象與char*(因爲這個問題說你想做的事),你可以創建從指針新WideString對象,然後使用普通==操作。該課程有幾個構造函數,其中一個用於const char*

char* foo = ...; 
WideString bar = ...; 
if (WideString(foo) == bar) 
    std::cout << "They're equal!\n"; 

其實,只要WideString對象是在左邊,你甚至不需要構造函數調用,因爲指針會自動轉換。

if (bar == foo) { ... } 

轉換一個WideStringchar*(因爲這個問題標題說你想做的事),你可能會考慮使用AnsiString類型。它們可以相互轉換。要獲得普通指針,請撥打c_str方法,就像使用std::string一樣。

WideString bar = ...; 
AnsiString foo = bar; 
std::cout << foo.c_str(); 
+0

A *空格*?這是不對的。空字符會導致截斷;如果有一個不在字符串的實際末尾,那麼使用構造函數的雙參數版本,以便可以指定實際長度。如果你在'std :: istringstream'中有某個東西,並且正在用'stream >> stringvar'從它讀取一個字符串,那麼空格可能會導致截斷。 – 2009-12-18 03:54:09

相關問題