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的何种字体。