2012-01-09 45 views
1

この関数を使用して、リッチエディットコントロールからテキスト行を取得します。リッチエディットコントロールからユニコード文字を取得

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を使用するように設定されていますか? –

+0

@jimRhodesはいそれは –

+1

の可能な複製です[どのように私はCRichEditCtrlにUnicodeサポートを追加しますか?](http://stackoverflow.com/questions/1474399/how-do-i-add-unicode-support-to-a -cricheditctrl) – ybungalobill

答えて

1

あなたのコードが動作するテキストの例を教えてください。あなたが失敗のために与えるテキストの例は、文字の上位8ビットがゼロになっていることを示しています。

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

コードがために「働く」テキストは(アメリカと西ヨーロッパで使用されている文字をカバー)U + 00FFに、すべての範囲でU + 0000であれば、あなたも問題に気づかないだろうあなたが何か間違っているなら。これは、おそらくコントロールからのテキストを取得することで問題になるのではなく、あなたのプログラムがテキスト以外の場所で行うことに問題があることを示しています。

プログラムがUNICODEマクロを定義すると仮定すると、TCHARwchar_tです。これはWindowsでは2バイトです。誤って1バイトのcharと誤って扱われていないことを確認してください。これは、記述したとおりに文字の値を簡単に切り捨てる可能性があるためです。ジムローズは、あなたがこれを考慮していない地域を既に指摘していました。

+0

が承認されました。ありがとうございました –

1

ybungalobillがあなたの質問に答えているかもしれませんが、私はUnicodeを扱うときに多くの人が作った間違いを指摘したいと思いました。

memset(buffer,0,sizeOfLine + 148); 

割り当てたバッファ全体をクリアしないと、その半分しかクリアされません。
あなたは本当にあなたがすべきバッファクリアしたい場合:

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

をEM_GETLINEに関するご質問に答えるためにします。プロジェクトがUnicode用に設定されている場合、SendMessageはSendMessageWに変換され、Unicode文字列が返されます。文字列が適切に書式設定されているかどうかは、メッセージを受信するコントロールによって異なります。

+0

ご協力いただきありがとうございます。問題は修正されました.ybungalobillによって提案された質問は、本当に答えを提供しました。曖昧な説明のために –

関連する問題