2012-01-09 69 views
1

我使用此函數從豐富的編輯控件中獲取一行文本。從豐富的編輯控件獲取Unicode字符

CString RichEditCtrlEx::getLine(int charIndex) const 
{ 
CString retval; 

int lineIndex = LineFromChar(charIndex); 
ASSERT(lineIndex>=0 && lineIndex<GetLineCount()); 
int sizeOfLine = LineLength(charIndex); 

TCHAR* buffer = new TCHAR[sizeOfLine + 148]; 

ASSERT(buffer); 

if (buffer) { 

    memset(buffer,0,sizeOfLine + 148); 
    *((int *)buffer) = sizeOfLine; 

    GetLine(lineIndex, buffer); 
    retval = buffer; 
    delete[] buffer; 
} 

return retval; 
} 

功能函數getline:

_AFXWIN_INLINE int CEdit::GetLine(_In_ int nIndex, _Out_ LPTSTR lpszBuffer) const 
{ ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer); 

對於它完美的大部分。但是,如果富編輯控件中的文本包含特殊字符(例如「拿듬壴竒」),則返回的字符是錯誤的(使用示例中的字符時,結果爲「ÿÒÒ」)

EM_GETLINE消息允許這些特殊字符?或者我需要不同的方法?

+0

您的項目是否準備使用Unicode? – 2012-01-09 16:39:45

+0

@jimRhodes是的它是 – 2012-01-09 16:43:29

+1

可能的重複[如何將Unicode支持添加到CRichEditCtrl?](http://stackoverflow.com/questions/1474399/how-do-i-add-unicode-support-to-a -cricheditctrl) – ybungalobill 2012-01-09 16:45:48

回答

1

你能舉一個你的代碼工作的文本的例子嗎?您給出的失敗示例文本表示字符的高8位被清零。

拿 (U+62FF) -> ÿ (U+00FF) 
듬 (U+B4EC) -> ì (U+00EC) 
壴 (U+58F4) -> ô (U+00F4) 
竒 (U+7AD2) -> Ò (U+00D2) 

如果你的代碼「作品」的文本是所有範圍內的U + 0000至U + 00FF(覆蓋在美洲和西歐使用的字符),那麼你甚至不會注意到一個問題如果你做錯了什麼。這可能表明,從控件獲取文本可能不是問題,而是您的程序在其他地方對文本執行的操作有問題。

假設您的程序定義了UNICODE宏,那麼TCHARwchar_t,這是Windows上的兩個字節。確保你沒有錯誤地把它當作一個字節的地址,因爲這可以很容易地按照你描述的方式截斷字符值。吉姆羅德斯已經指出了你沒有考慮到這一點的一個領域。

+0

接受毫無疑問的解釋。謝謝 – 2012-01-09 17:05:55

1

ybungalobill可能已經回答了您的問題,但我想我會指出您在處理Unicode時犯的錯誤。該行:

memset(buffer,0,sizeOfLine + 148); 

不會清除您分配的整個緩衝區,它只會清除其中的一半。
如果你真的想清楚了,你應該做的緩衝:

memset(buffer, 0, sizeof(TCHAR) * (sizeOfLine + 148)); 

要獲得關於EM_GETLINE問題。如果您的項目配置爲Unicode,則SendMessage將被轉換爲SendMessageW,它將返回一個Unicode字符串。字符串格式是否正確取決於接收消息的控件。

+0

謝謝你的幫助。現在問題已經解決,ybungalobill提出的問題的確提供了答案。 – 2012-01-09 16:55:22