2014-01-08 114 views
0

這是一個問題的後續問題,並回答了here。我想使用文本文件作爲資源,然後將其加載爲stringstream,以便我可以解析它。作爲wstringstream加載Win32資源文件

下面的代碼顯示了我目前有:

std::string filename("resource.txt"); 
HRSRC hrsrc = FindResource(GetModuleHandle(NULL), filename.c_str(), RT_RCDATA); 
HGLOBAL res = LoadResource(GetModuleHandle(NULL), hrsrc); 
LPBYTE data = (LPBYTE)LockResource(res); 
std::stringstream stream((LPSTR)data); 

不過,我不確定如何延長這個使用wstringstream讀取一個Unicode文本文件。天真的方法產生亂碼:

... 
LPBYTE data = (LPBYTE)LockResource(res); 
std::wstringstream wstream((LPWSTR)data); 

由於LPBYTE無非是CHAR*,更是毫不奇怪的是,這並不工作,但資源天真地轉換爲WCHAR*LPWSTR)無法正常工作或:

... 
LPWSTR data = (LPWSTR)LockResource(res); 
std::wstringstream wstream(data); 

我猜這是因爲WCHAR是16位,而不是8位像CHAR,但我不知道如何解決這個問題。

感謝您的幫助!

+1

什麼是您的資源文件的編碼?如果它的ASCII或UTF8,那麼你需要一個明確的轉換(如'MultiByteToWideChar')來讀取它作爲一個unicode字符序列。 – riv

+0

只要'resource.txt'實際上是UTF-16編碼,你提出的兩種解決方案都可以工作。既然你得出的結論是「沒有人工作」*,如果你解釋了什麼不起作用(預期結果和實際結果是什麼?),這將有所幫助。 – IInspectable

+0

我的'resource.txt'文件是用UTF-8編碼的,所以上面的代碼片段給了我一串任意字符。我正在尋找的結果是獲取文件內容的「wstring」,並將其存儲在「wstringstream」中。 – mhjlam

回答

2

您的評論提供了關鍵的遺漏細節。您編譯爲資源的文件編碼爲UTF-8。所以很明顯的選項有:

  1. 使用在你的問題的代碼,獲得一個指向資源,編碼爲UTF-8,並傳遞到MultiByteToWideChar轉換爲UTF-16。然後你可以把它放入一個wstring
  2. 在編譯資源之前,將您編譯的文件轉換爲資源爲UTF-16。然後你的問題中的代碼將工作。