从丰富的编辑控件中获取unicode字符

时间:2012-01-09 16:25:58

标签: c++

我使用此函数从富编辑控件中获取一行文本。

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消息是否允许这些特殊字符?或者我需要一种不同的方法吗?

2 个答案:

答案 0 :(得分:1)

ybungalobill可能已经回答了你的问题,但我想我会指出你在处理Unicode时犯了许多人犯的错误。这一行:

memset(buffer,0,sizeOfLine + 148);

不会清除您已分配的整个缓冲区,它只会清除其中的一半 如果你真的想清除缓冲区,你应该这样做:

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

回答有关EM_GETLINE的问题。如果您的项目配置为Unicode,则SendMessage将转换为SendMessageW,它将返回Unicode字符串。字符串是否格式正确取决于接收消息的控件。

答案 1 :(得分: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上的两个字节。确保你没有错误地将它视为任何地方的{1}},因为这可能很容易按照你描述的方式截断字符值。 Jim Rhodes已经指出了一个你没有考虑到这一点的领域。

相关问题