2014-09-24 50 views
0

簡短版本我正在使用unicode。我試圖使用一個std :: string函數,它需要一個const WCHAR 字符串;的DrawString(常量WCHAR ...將std :: string轉換爲const所需的WCHAR *字符串GDI +參數

我用GCC編譯,一切都是unicode的,我已經指定。

我一直在試圖將字符串轉換成一個wchar_t的*,其目的是爲了讓我可以輸出使用GDI +的功能,它的參數需要這麼

這裏是我已經輸出字符串文字,沒有任何問題,調試精細,做工精細 http://msdn.microsoft.com/en-us/library/ms535991%28v=vs.85%29.aspx參考原因:。

// works fine 
wchar_t* wcBuff; 
wcBuff = (wchar_t*)L"Some text here.\0"; 
AddString(wcBuff, wcslen(wcBuff), &gFontFamilyInfo, FontStyleBold, 20, ptOrg_Controls, &strFormat_Info); 

現在,這是我一直在努力的一整天和一個方面的說明:我的轉換功能正常工作,這不是問題,也不是創建一個問題。

// problems 
string s = "Level " + convert::intToString(6) + "\0"; 

// try 1 - Segfault 
wchar_t* wcBuff = new wchar_t[s.length() + 1]; 
copy(s.begin(), s.end(), wcBuff); 

// random tries, compiles, but access violations (my conversion function here has worked other places, do not know for sure here. 
wchar_t* wcBuff; 
wstring wstr = convert::stringToWideChar(s); 
wstring strvalue = convert::stringToWideChar(s);   
wcBuff = (wchar_t*)strvalue.c_str(); 
wcBuff = (wchar_t*)wstr.c_str(); 

wstring foo; 
foo.assign(s.begin(), s.end()); 
wcBuff = (wchar_t*)foo.c_str(); 

一切都編譯完成,但是後來出現問題。一旦達到該點,就會出現一些運行時錯誤。其他人訪問違規和段錯誤。一些編譯和調試沒有問題,但字符串輸出不斷隨着隨機字符變化。

任何想法?

+1

duplicate http://stackoverflow.com/questions/2573834/c-convert-string-or-char-to-wstring-or-wchar-t?rq=1 – Ulterior 2014-09-24 21:18:14

+1

重複http://stackoverflow.com/questions/246806/i-want-to-convert-stdstring-into-a-const-wchar-t – WhozCraig 2014-09-24 21:23:44

+0

我實際上讀過這個話題,並嘗試過所有的例子,他們都沒有工作。我沒有使用visual studio,所以我沒有包含頭文件。 @Potatoswatter的兩個例子都是隨機的字符串輸出。 – 2014-09-24 21:25:16

回答

1
#include <string> 

int main() { 

    // Can use convenient wstring 
    std::wstring wstr = L"My wide string"; 

    // When you need a whar_t* just do this 
    const wchar_t* s = wstr.c_str(); 

    // unicode form of strcpy 
    wchar_t buf[100] = {0}; 
    wcscpy (buf,s); 

    // And if you want to convert from string to wstring 
    std::string thin = "I only take up one byte per character!"; 
    std::wstring wide(thin.begin(), thin.end()); 

    return 0; 
} 
0

(這是不是一個真正的答案,但它太大了評論)

嘗試1:你沒空終止字符串

嘗試2:不能發表評論沒有看到轉換功能。刪除鑄件。

嘗試3:刪除劇組,應該沒問題。

在所有情況下使用wchar_t const *wcBuff。如果「嘗試3」失敗,那麼這意味着您的代碼中還有其他位置出現錯誤,即顯示在此處。嘗試製作一個MCVE。你應該能夠把它降低到10-20行左右。

即使您設法爲自己想要的內容編寫正確的代碼,但由於它無法正確處理0-127範圍以外的字符,因此這是一個相當天真的轉換。您需要考慮您是否想要這樣做,或者您是否想要進行UTF-8轉換等。

在Windows中,您可以使用MultiByteToWideChar

+0

感謝大家的輸入。然而,我做了更多的搜索,並且在「Path.AddString()」的每一次使用中,GDI +示例都使用字符串文字。我相信這是不可能的。一些有用的版本,表現隨機。 GDI +具有合理參數的DrawString()函數,其代價是對其外觀的控制較少。 – 2014-09-25 03:11:08

+0

@EvanCarslake生成一個MCVE並重新發布(或提交一個錯誤報告) – 2014-09-25 03:28:33

+0

我現在已經完全參與其中。我想不出創建一個MCVE的方法。 HTTP://引擎收錄。com/rQnVPPyA 它的工作原理,我只是需要一種方法來分配變量文本到'n'。我爲了測試它而手工定義了第一個字符。 – 2014-09-25 04:31:06

0

第一件事第一件事。 GDI+是一個C++庫。它使用Microsoft C++ ABI。 Microsoft C++ ABI與gcc非常不兼容,因此您可能會忘記使用它。您可以嘗試使用WinAPI或任何其他使用C調用約定的庫。

現在爲wstring的問題。 wchar_t在gcc中的寬度是32位,但Windows API要求它的寬度是16位。您不能使用任何需要wchar_t的本地Windows呼叫。

可以在gcc使用-fshort-wchar命令行選項,這將使廣wchar_t 16位,你會恢復兼容的Windows API,但失去兼容libc,所以沒有庫函數作用於wchar_t你。 std::wstring可能會工作,因爲它只是標題,但wprintfwscpy或所有其他編譯的東西不會。

在編譯時檢測不到這種情況,因爲gcc只能看到頭文件。它無法分辨相應的庫是否使用16位wchar_t或32位wchar_t進行編譯。

當您需要將wchar_t的數組傳遞給Windows函數時,您可以使用uint16_t。如果你可以使用C++ 11,它也可以使用char16_t。下面是應該與基本多文種平面字符的示例:

std::wstring myLittleNiceWstring; 
... 
std::vector<uint16_t> myUglyCompatibilityString; 
std::copy(myLittleNiceWstring.begin(), 
      myLittleNiceWstring.end(), 
      std::back_inserter(myUglyCompatibilityString)); 
myUglyCompatibilityString.push_back(0); 

UglyWindowsAPI(static_cast<WCHAR*>(myUglyCompatibilityString.data()); 

如果您有非BMP字符,則需要UTF32轉換爲UTF-16,而不是僅僅用複製的std ::複製的字符。您可以使用libiconv作爲自己的編寫轉換程序(這很簡單),或者只是從互聯網上編寫一些代碼。

由於這個問題和其他問題,我認爲以GCC爲中心開發相當困難。只要你堅持使用POSIX-ish API,你就可以使用gcc。

+0

如果這是怎麼回事,那麼對GDI函數的調用應該會導致編譯錯誤。 OP到目前爲止還沒有提到 – 2014-09-24 22:05:32

+0

@MattMcNabb不會有編譯錯誤。 Windows API使用WCHAR並將其typedefed到'wchar_t'。通過查看函數聲明,您無法知道ABI是什麼。將更新答案。 – 2014-09-24 22:21:01

相關問題