如何给包含中文的TXT随机分段落?谢谢

a3622041 2019-04-01 03:49:18
TXT中包含有中文和符号, 设置了随机数范围(例如200-300), 原本是想根据随机数换行的,结果换行后出现了乱码。 如何解决呢?
...全文
643 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
多字节也可以, 但是就的逐字节去判断和配对了
向立天 2019-04-03
  • 打赏
  • 举报
回复
只有换行的位置有乱码还是因为换行整篇文章出了乱码
luj_1768 2019-04-03
  • 打赏
  • 举报
回复
现在的中文输入法大多有智能模块,可能你用的显示模块现在也有这种功能了。如果分段不合逻辑,可能无法正常匹配字模,就会出乱码。
zgl7903 2019-04-02
  • 打赏
  • 举报
回复
strNewData  += strTemp 之前把 strTemp TRACE出来, 并设置断点,F5运行分析
a3622041 2019-04-02
  • 打赏
  • 举报
回复
引用 10 楼 zgl7903 的回复:
按贴出来的程序 逻辑上就有问题, 自己单步调试分析 先把逻辑弄明白了


就是调试了 换了很多种 都是乱码 我先取随机数,然后从随机数位置查找,和。 然后再MID ,然后把这个值赋值给index 然后重复这个操作 不知道错再哪
int nX =strData.Find(_T(","),nIndex+nRand);
int nY = strData.Find(_T("。"),nIndex+nRand);
zgl7903 2019-04-02
  • 打赏
  • 举报
回复
按贴出来的程序 逻辑上就有问题, 自己单步调试分析 先把逻辑弄明白了
a3622041 2019-04-02
  • 打赏
  • 举报
回复
引用 5 楼 轻箬笠 的回复:
[quote=引用 4 楼 zgl7903 的回复:]
或者转成UNICODE 再分段

这个方法靠谱,先读取全部文字,然后用MultiByteToWideChar转成unicode编码,再分段,再写入[/quote]

本来是unicode编码 但是我ReadString是乱码 就改成ANSI了
a3622041 2019-04-02
  • 打赏
  • 举报
回复
引用 7 楼 zgl7903 的回复:
多字节也可以, 但是就的逐字节去判断和配对了


我现在按照你说的 我随机了一个数 然后再去找这个随机数后面的,和。 但是我输入\r\n后 然后再取数据,发现很多字变成乱码了

能帮忙看一下问题再哪吗 谢谢了
CString CFileProcessDlg::Data(CString strData)
{

CString strMax;
CString strMin;
GetDlgItem(IDC_EDIT1)->GetWindowText(strMin);
GetDlgItem(IDC_EDIT2)->GetWindowText(strMax);
CString strNewData;
CString strTemp;
int nMax =_ttoi(strMax);
int nMin =_ttoi(strMin);

int nLen = strData.GetLength();
int nIndex = 0;
int nRand =0;
int nNum = 0;
for(int i=0;nIndex<nLen;i++)
{
nRand =rand()/(double)RAND_MAX *(nMax - nMin) + nMin;

int nX =strData.Find(",",nRand);
int nY = strData.Find("。",nRand);

if(nX<nY)
nNum =nX;
else
nNum =nY;

if(nNum<1)
nNum = nRand;
strTemp =strData.Mid(nIndex,nNum);
nIndex+=nNum+1;
strTemp+="\n";
strNewData += strTemp ;
}
return strNewData ;
}
schlafenhamster 2019-04-02
  • 打赏
  • 举报
回复
“先取随机数” 先取固定数调试
zgl7903 2019-04-02
  • 打赏
  • 举报
回复

CStringA ProcessData(LPCSTR strData, LPCWSTR Split, int nMin, int nMax)
{
  CStringA strNewData;

  int icp = CP_THREAD_ACP;
  int iWchLen = MultiByteToWideChar(icp, 0, strData, -1, NULL, 0);
  WCHAR *pWchData = new WCHAR[iWchLen + 1];
  MultiByteToWideChar(icp, 0, strData, -1, pWchData, iWchLen);
  pWchData[iWchLen] = 0;
  
  int nIndex = 0; 
  while(nIndex<iWchLen-1)
  {
    int nRand = (int)(rand()/(double)RAND_MAX *(nMax - nMin) + nMin);

    WCHAR *pWStrData = pWchData + nIndex;
        
    WCHAR *pSub = wcsstr(pWStrData + nRand, Split);
    int iNewLen;
    if(pSub == NULL)
      iNewLen = wcslen(pWStrData);
    else
      iNewLen = (int)(INT_PTR)((pSub + wcslen(Split)) - pWStrData);
    
    int imbLen = WideCharToMultiByte(icp, 0, pWStrData, iNewLen, NULL, 0, NULL, NULL);    
    CHAR *szTemp = new CHAR[imbLen + 3];
    WideCharToMultiByte(icp, 0, pWStrData, iNewLen, szTemp, imbLen, NULL, NULL);
    szTemp[imbLen + 0] = '\r';
    szTemp[imbLen + 1] = '\n';
    szTemp[imbLen + 2] = '\0';
    
    nIndex += iNewLen;

    strNewData += szTemp;
    OutputDebugStringA(szTemp);
    
    delete [] szTemp;
  }

  delete []pWchData;

  return  strNewData ;
}

void CDlg4Dlg::OnButton1() 
{
  CFileDialog dlg(TRUE);
  if(dlg.DoModal() == IDOK)
  {
    try
    {
      CFile file(dlg.GetPathName(), CFile::modeRead);
      int iLen = (int)file.GetLength();
      CHAR *pSrc = new CHAR[iLen + 1];
      file.Read(pSrc, iLen);
      pSrc[iLen] = 0;
      file.Close();

      CStringA szRet = ProcessData(pSrc, L"。", 50, 100);
      OutputDebugStringA(szRet);
      OutputDebugStringA("\r\n");

      delete [] pSrc;

    }
    catch(CFileException *e)
    {
      e->ReportError();
      e->Delete();
    }
  }
}
a3622041 2019-04-02
  • 打赏
  • 举报
回复
引用 16 楼 向立天 的回复:
引用 15 楼 a3622041 的回复:
引用 14 楼 向立天 的回复:
先把文本检索一次,把每一个汉字都提出来,然后再分段
汉字全部都提取出来了 里面还有很多符号和数字 就是分段出的问题。。。
如果汉字和符号都独立管理了,按你说的分段就是通过字符数来处理,那不会出现把一个汉字分开这种乱码啊
没有独立管理 就是把网页UTG-8的数据 把标签和英文全部去掉了 然后就只剩符号 数字和汉字 混合再一起的 按照我的想法 我通过符号来切换段落 应该是Find的位置不对 但是我又不知道错在哪
向立天 2019-04-02
  • 打赏
  • 举报
回复
引用 15 楼 a3622041 的回复:
引用 14 楼 向立天 的回复:
先把文本检索一次,把每一个汉字都提出来,然后再分段
汉字全部都提取出来了 里面还有很多符号和数字 就是分段出的问题。。。
如果汉字和符号都独立管理了,按你说的分段就是通过字符数来处理,那不会出现把一个汉字分开这种乱码啊
a3622041 2019-04-02
  • 打赏
  • 举报
回复
引用 14 楼 向立天 的回复:
先把文本检索一次,把每一个汉字都提出来,然后再分段
汉字全部都提取出来了 里面还有很多符号和数字 就是分段出的问题。。。
向立天 2019-04-02
  • 打赏
  • 举报
回复
先把文本检索一次,把每一个汉字都提出来,然后再分段
a3622041 2019-04-02
  • 打赏
  • 举报
回复
引用 12 楼 zgl7903 的回复:
strNewData  += strTemp 之前把 strTemp TRACE出来, 并设置断点,F5运行分析
应该就是Find的位置不对 我明明是要截取,和。 但是发现第二次换行的位置是文字中间 还望指点一下
zgl7903 2019-04-01
  • 打赏
  • 举报
回复
多字节也可以, 但是就的逐字节去判断和配对了
a3622041 2019-04-01
  • 打赏
  • 举报
回复
引用 4 楼 zgl7903 的回复:
或者转成UNICODE 再分段
多字节行不行啊? 之前unicode读出来是乱码。。。
轻箬笠 2019-04-01
  • 打赏
  • 举报
回复
引用 4 楼 zgl7903 的回复:
或者转成UNICODE 再分段

这个方法靠谱,先读取全部文字,然后用MultiByteToWideChar转成unicode编码,再分段,再写入
zgl7903 2019-04-01
  • 打赏
  • 举报
回复
或者转成UNICODE 再分段
zgl7903 2019-04-01
  • 打赏
  • 举报
回复
搜索句号 。 . ?
加载更多回复(2)

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧