2013-01-22 166 views
1

在我的程序中,我用wstring打印出我需要的文本,但它給了我隨機密碼(由於不同的編碼方案)。例如,我有這塊代碼。wstring支持哪些語言環境?

wstring text; 
text.append(L"Some text"); 

然後我用directX在屏幕上渲染它。我曾經使用wchar_t,但我聽說它有可移植性的問題,所以我切換到swtringwchar_t工作正常,但它似乎只從我能告訴的英文字符(打印輸出完全忽略輸入的非英文字符),這很好,直到我切換到wstring:我只有隨機密碼看起來像中文和韓語混在一起。有趣的是,我的非Unicode文本的計算機語言環境是中文。根據我所看到的,我懷疑它會正確渲染漢字,所以我試了一下,它確實正確顯示了字符,但前面有一個正方形(這仍然是一種不正確的顯示)。然後我猜想編碼可能取決於語言區域設置,因此我將語言環境切換爲英語(美國)(我使用win8),然後重新啓動,並在源文件中看到我的中文測試字符變成了一些隨機的東西(我的文件沒有保存因爲所有文本都是英文的)所以我嘗試了英文字符,但沒有運氣,顯示看起來完全一樣,並且與語言環境無關。但我不明白爲什麼它不能正確顯示,看起來像亞洲字符(即使我使用英語區域設置)。

是否有一些轉換應該做或應該保存我的文件在不同的編碼格式?問題是我想正確顯示英文charactore,這是默認的。

+1

絕對最小每個軟件開發人員絕對積極地必須瞭解Unicode和字符集:http://www.joelonsoftware.com/articles/Unicode.html –

+0

@Laurent但它是如何幫助我解決此問題的? – ryf9059

+0

@ ryf9059:它提供了有關這些類型問題的背景信息。 –

回答

0

問題解決了,它變成了CASTING問題(不像前面所說的渲染問題)。 的竊聽文本是使用swtringstream(我忘了提),所述代碼如下

wstringstream wss; 
wstring text; 
textToGenerate.append(L"some text"); 
wss << timer->getTime() 
text.append(wss.str()); 

右鍵調試器在該過程之後顯示的文本作爲一堆隨機的東西期間的一些內部轉換處理的中間產物但後來以某種方式轉換回來,因此它是可讀的。但問題出現在使用DirectX的渲染階段。我以某種方式離開鑄造wchar_t*,這導致不正確的渲染。

老:

LPCWSTR lpcwstrText = (LPCWSTR)textToDraw->getText(); 

新:

LPCWSTR lpcwstrText = (*textToDraw->getText()).c_str(); 

通過改變能解決問題。

所以,這是由糟糕的演員造成的。正如有些人對我的發言提供了更正。

+0

這看起來不像渲染問題。這看起來像一個虛假演員。 –

+1

這不是一個渲染問題。與MFC字符串不同,'std::(w)string **不能**轉換爲char *'/'wchar_t *'。這就是'c_str()'函數的存在。 –

1

如果沒有代碼說明你的問題,我會給你一個相應的一般答案。

您正在嘗試顯示英文字符,但看到中文字符。當您將8位ANSI文本傳遞給接收UTF-16文本的API時,會發生這種情況。在您的程序中尋找從char*wchar_t*之間的任何地方。

+0

問題解決了!原來是渲染,但你的信息仍然有幫助。謝謝! :) – ryf9059

+0

哦...這不是一個渲染問題,但一個鑄造問題...只是想糾正這一點。 – ryf9059

+0

其實我的回答是非常好的猜測。好的,這並不是說你是從ANSI文本中投射出來的,而是你從一個包含物體的內存塊中投射出來的。 –

0

首先什麼是你試圖存儲文本的文件類型?普通的txt文件默認存儲在ANSI中(excel也是如此)。因此,當您嘗試將Unicode字符打印到ANSI文件時,它會打印垃圾。過未來這個問題有兩種方法:

  1. 嘗試在UTF-8或16模式下打開該文件,然後寫
  2. Unicode轉換文件寫入之前,ANSI。如果您使用的是Windows,那麼MSDN會提供特定的API來執行Unicode到ANSI的轉換,並且反之亦然。如果您使用的是Linux,那麼Google會將Unicode轉換爲ANSI。那裏有很多解決方案。

希望這有助於!

0

std::wstring根本沒有任何語言環境/國際化支持。它只是一個用於存儲wchar_t序列的容器。
wchar_t的問題是它的編碼是未指定的。它可能是Unicode UTF-16,或Unicode UTF-32或Shift-JIS,或者完全不同的東西。從程序中無法分辨出來。

如果確保源代碼的編碼與程序運行所在的語言環境使用的編碼相同,那麼您將有最佳的工作機會。
但是,使用第三方庫(如DirectX)可能會產生額外的限制,因爲這些庫所期望和支持的編碼可能存在限制。

相關問題