2009-09-18 74 views
0

我需要跨平臺的代碼跳過開頭的空格寬字符串。 它看起來是G ++(和Qt明顯)在所有 所以下面的代碼不會初始化寬字符串插槽工作正常,VC++,但幾乎G ++失敗bad_cast異常:的Qt使用的std :: use_facet與wstring的

#include <string> 
#include <locale> 
#include <iostream> 

int main() 
{ 
    typedef std::ctype<std::wstring::value_type> vtct; 
    std::wstring str=L"  1122"; 
    const std::wstring::value_type* unspace = 
     std::use_facet<vtct>(std::locale::classic()). 
      scan_not(std::ctype_base::space|std::ctype_base::punct, 
      str.c_str(), str.c_str() + str.length()); 
    //std::cout << unspace << std::endl; 
    wprintf(L"{%s}\n", unspace); 
    return 0; 
} 

,按照規範:「bad_cast當區域設置對象中的方面存儲庫不包含所請求的語言環境的方面時出現異常:: id「

所以一般問題g ++如何處理寬字符串?更窄的問題 - 如何初始化面至少爲ctype?

更新:經過一些實驗後,我發現linux g ++正確地初始化寬字符串的方面 - 所以代碼工作。明顯描述的問題是功能,如果只有mingw。

回答

0

我儘量不使用STL的本地化支持,因爲:

  • 很複雜
  • ,據我所知,編譯器的支持也不是那麼好。

既然你提到過Qt,你可以嘗試從wstring創建一個QString,並驗證哪些字符是空間與QChar :: isSpace。

有關C++本地化的更多幫助,請參閱this resource。它包含一個鏈接到B.Stroustrup關於本地化的附錄。

+0

我願意把(它很複雜)。第二部分不是真實的,因爲它不是提供本地化支持的編譯器。它可能是默認提供的庫,編譯器對本地化沒有很好的支持, – 2009-09-18 18:32:02

+0

@rpg - 感謝回覆。它不是(-1),但是:對併發症強烈不同意。這在邏輯上是難以理解的。 QChar不能使用,因爲代碼必須是跨平臺的,所以它必須以VC++編譯爲g ++。 – Dewfy 2009-09-19 06:20:47

+0

@馬丁,你是對的,這是圖書館。 – rpg 2009-09-19 12:56:06

1

你在使用MingGW嗎? 他們的穩定版本don't support wchar_t

我在Linux上的g ++中使用C++寬字符支持(facet)也沒有任何問題。

我不得不讓我的代碼支持窄字符編譯模式,以便與MinGW一起工作。

+0

@Basilevs看到我的編輯波紋管後 - linux的g ++工作得很好。 MinGW被Qt環境使用 - 這是我的問題。已定義wchar_t,但多個構面(包括ctype)不是。有誰知道如何做到這一點可能是手動? – Dewfy 2009-09-22 15:28:21

+0

已定義但不支持。使用gcc 4試用MinGW的版本。 – Basilevs 2009-09-23 06:22:53