CString strResult,strTmp;
for (int i=0;i<pRich->GetLineCount();i++)
{
int dwLen=pRich->LineLength(pRich->LineIndex(i));
if (dwLen > 5)
{
pRich->GetLine(i,strTmp.GetBuffer(dwLen),dwLen);
strTmp.ReleaseBuffer(dwLen);
                        strResult+=strTmp+"\r\n";
}
}提取长度大于5的行,如果是英文是没问题的,如果是汉字,就会出现乱码, 请问如何解决?问题1: dwLen > 5, 这里就会判断出错,如果是3个汉字,长度应该已经超过5了,但LineLength返回是3,会跳过判断;
问题2: 如果超过5个字符,其中有汉字,比如"abcd中国",在strTmp.GetBuffer(dwLen)分配内存空间的时候,只分配了6个字节的内存空间,行内容会被截断,显示乱码.

解决方案 »

  1.   

    应该不会这样才对啊,MSDN上说LineLength是实际字节长度啊。
      

  2.   

    试了半天放上RichEdit就不出来了,没办法,自己试吧。
    不过感觉GetWindowText应该效果一样。
      

  3.   

    GetWindowText吧,很好用!
    CString strEdit1;
    GetDlgItem(IDC_RICHEDIT1)->GetWindowText(strEdit1);
      

  4.   

    Return Value
    When LineLength is called for a multiple-line edit control, the return value is the length (in bytes) of the line specified by nLine. When LineLength is called for a single-line edit control, the return value is the length (in bytes) of the text in the edit control.
    但是调试的时候发现,LineLength 3个汉字的行,确实是返回3啊
      

  5.   

    我试了一下,按LZ的办法确实取不全,有乱码,这个应该是CString使用的不正确,不过怎么正确我也不清楚了,确实没有这么用过。
      

  6.   

    GetWindowText怎么获取一行的文本内容?和CString没关系吧,没调用CString之前,
    int   dwLen=pRich-> LineLength(pRich-> LineIndex(i));
    就没通过啊,LineLength返回不是字节数,才导致后面CString分配内存太小造成文本截断的.
      

  7.   

    根据你的情况我们具体的分析一下:
    首先看函数LineLength()
    LineLength函数的使用的返回值是:
    When LineLength is called for a multiple-line edit control, the return value is the length (in bytes) of the line specified by nLine. (如果控件是多行的,则返回指定行的长度/字节为单位)
    When LineLength is called for a single-line edit control, the return value is the length (in bytes) of the text in the edit control.(如果控件是单行的,则返回控件的文本的长度/字节为单位)问题1:可能是由于你是多行的,而你所指定的行的字节数确实为3(可能有乱码).
    问题2:dwLen为你指定行的长度,非整个控件的字符长度,所以跟踪调试知道,你获得到文本可能就是乱码;
    另外:CString 的GetBuffer()函数的使用你也要去仔细查一下MSDN,
    如果要把所得到的文本内容放入到CString对象中,应该为GetBuffer(0), 这里的0表示是重字符串的开头填充字符;
      

  8.   

    那么为什么"一一一",3个汉字返回为3呢
    如果在GetBuffer中用一个足够大的数字来开辟内存空间,或者用GetBuffer(0), 
    GetLine(i,strTmp.GetBuffer(0),dwLen); //如果这个dwLen是一个比较大的数字,比如是7,就可以完整的获得"一一一"
    的内容,但是因为它返回的是3, GetLine只取了3个字符,被截断了.
    问题就出在LineLength上,似乎. 请指教.
      

  9.   

    不知道LZ的具体状态,我的程序里返回的肯定是6,而不会是3。
    按照MS的用法是这样取的
    GetLine(i, strTmp.GetBufferSetLength(dwLen), dwLen+1);
    但是我试了一下,取到的也是乱码。
    用SendMessage(EM_GETLINE, dwLen, strTmp.GetBufferSetLength(dwLen));能取全,但是会有其它错误。实在要用就定义个数组算了,一行又不可能有太多数据,干嘛非得给自己找这麻烦。