2015-07-13 96 views
1

我有一個簡單的函數,用於從剪貼板中檢索文本並將其打印到文件。它工作正常,除非外國的信件在剪貼板中。例如字母「ñ」不會被打印出來。下面是一些明顯的部分代碼省略:C++獲取剪貼板 - 特殊字符

HANDLE hData = GetClipboardData(CF_UNICODETEXT); 
if (hData != NULL) 
{ 
    wchar_t * pszText = static_cast<wchar_t*>(GlobalLock(hData)); 
    if (pszText != NULL) 
    { 
     std::wstring text(pszText); 

     // Release the lock 
     GlobalUnlock(hData); 

     // Release the clipboard 
     CloseClipboard(); 

     //myFile is a wofstream. 
     myFile << text; 
    } 
} 

我試了一下:

  1. 我用「wcout」,以及標準「COUT」打印出變量「文本」和「pszText」 。在這兩種情況下,特殊信件都沒有打印出來。
  2. 嘗試將CF_UNICODETEXT更改爲CF_TEXT並得到相同的結果。

TL:DR我有一個獲取剪貼板功能,但它不與人物的工作就像「N」或「C」。


編輯:至於建議,我在調試器中檢查變量。事實證明,變量「wstring text」實際上包含特殊字符,例如「N」。問題似乎是寫入文件。在可以編寫特殊字符之前是否需要打開一些特殊方式的文件?以下是我如何打開文件。

myFile.open(logFullPath, std::ios_base::out | std::ios_base::app); 

EDIT2: 林100%陽性,現在的問題是這樣的線:

//myFile is a wofstream. 
myFile << text; 
+2

你看過調試器中的字符嗎?或者,嘗試轉儲收到的字符的代碼點。窗口控制檯非常好地處理非ASCII字符集,因此很輕鬆。 – rodrigo

+1

與您的問題無關,但您是不是在錯誤的範圍內調用'CloseClipboard'?如果您無法獲取剪貼板數據,那麼當您不關閉剪貼板時,將會發生資源泄漏。 –

+1

@JoachimPileborg我沒有複製整個源代碼。您所描述的問題在我的完整版本中不存在。 – SzloseProgramming

回答

0

下面的代碼是一個示例如何處理寫入Unicode字符到的ofstream的上述問題。使用這個解決了迄今爲止我所有的問題。

#include <fstream> 
#include <codecvt> 

int main() { 
    std::wofstream mystream("test.txt"); 
    mystream.imbue(std::locale(std::locale(), 
        new std::codecvt_utf8_utf16<wchar_t, 0x10ffff, std::codecvt_mode(std::consume_header|std::generate_header)>)); 
    mystream << "Hello, World!\n"; 
}