MFC多字节字符集环境下字符截取解决方法

MFC多字节字符集环境下字符截取解决方法

  • 多字节字符集
    每个字符的编码宽度都不等,可以是一个或多个字节。 ASCII字符只占用一个字节。 对于中文,日文等象形字,由于其数量庞大,一个字节无法全部容纳。所以用两个字节来表示一个字符。

  • 多字节字符集环境下pdf输出汉字有时会出现乱码,当问题出在一行的最后一个汉字时,如何保证一个汉字截取完整就很重要。下面用两个方法来解决这个问题。


举例

多字节字符集环境下将编辑框的汉字,标点,英文等混合的一个段落,输出到pdf文档里,格式为每行30个(汉字、标点、英文均计一个)

  • 两种方法(详见代码块示例)

代码块

方法一:判断每行非汉字个数

int eachline=60; //每行60 个字符
int num=0; //非汉字个数
CString strline; //每行输出的内容
PDF *p=NULL; 
byte *buff=new [m_edit.GetLength()]; //m_edit为编辑框的成员变量
memcpy(buff,m_edit.GetBuffer(),m_edit.GetLength()); //将编辑框内容复制到byte类型的数组buff
for(int i=0;i<m_edit.GetLength();i+=eachline)
{   
    temp+=eachline;
    for(int j=i;j<temp;j++)
        if(buff[j]<128) //为真即非汉字
            num++;
    strline=m_edit.Mid(i,eachline);
    if(num%2) //一行中非汉字个数为奇数
    {
        strline=m_edit.Mid(i,eachline-1); //保证汉字截取完整,不会乱码
    }
    PDF_continue_text(p,strline); //输出到pdf文档
}

方法二:判断每个字符是否为汉字

CString str=""; 
int num=0;
for(int i=0;i<m_edit.GetLength();i++)
{
    num++;
    if(m_edit[i]&0x80) //相与为真说明是汉字  
    {
        str+=m_edit[i];
        str+=m_edit[i+1];   
        i++;
    }
    else
        str+=m_edit[i];
    if(num==30)
    {
        PDF_continue_text(p,str);
        num=0;
        str="";
    }

}

注:以上方法有可能输出的文字有可能不会严格对齐,具体看使用pdf的何种字体。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值