rtf 中处理中文乱码以及utf-8 gbk 所占字节的问题

来源:互联网 发布:佰迪欧百信渔具淘宝店 编辑:程序博客网 时间:2024/06/01 07:38

      在一个项目中遇到用读取rtf 模板,然后替换内容。rtf的读取和替换请参考上一篇文章。在使用过程中遇到了中文乱码的问题。在例子程序中没有出现乱码,当把代码移植到项目中居然出现了乱码问题,原来是例子程序是在GBK编码的项目下,而我们自己的项目采用的是UTF-8的编码。修改程序在写文件的时候采用UTF-8的编码。可是乱码问题没有得到解决,感觉没道理啊。一般情况下中文占两个字节,在GBK中确实是这样的,但是中文在UTF-8中是以三个字节表示的,根本和 ASCII的占位都不一样,所以一直都得不到正确的结果,而项目中的编码又不能随便改,只有采取硬编码的方式,转成GBK。

下面是原来字符串转换为rtf编码的方法。

private int inext = 0;

 /**
  * 字符串转换为rtf编码
  *
  * @param content
  * @return
  */
 public String strToRtf(String content) {
  char[] digital = "0123456789ABCDEF".toCharArray();
  StringBuffer sb = new StringBuffer("");
  byte[] bs = content.getBytes();
  int bit;
  for (int i = 0; i < bs.length; i++) {
   bit = (bs[i] & 0x0f0) >> 4;
   /*
    * 增加中文支持思路:通过getBytes获取的中文的assii小于0,根据rtf中文的的编码 所以只需要在中文的2个编码
    * 第一个编码前加 第二个编码后加 加了一个变量inext 用来判断中文的assii 前一个和后一个。
    * 这样在rtf中文的乱码就可以解决了。
    */
   if (bs[i] > 0) {
    sb.append("\\'");
   } else {
    if (inext == 0) {
     sb.append("\\loch\\af2\\hich\\af2\\dbch\\f31505");
     sb.append("\\'");
     inext = 1;
    } else {
     sb.append("\\'");
    }
   }
   sb.append(digital[bit]);
   bit = bs[i] & 0x0f;
   sb.append(digital[bit]);
   if (bs[i] < 0 && inext == 1) {
    sb.append("\\hich\\af2\\dbch\\af31505\\loch\\f2");
    inext = 0;
   }
  }
  return sb.toString();
 }

 

修改后的代码:

public String strToRtf(String content) {
  char[] digital = "0123456789ABCDEF".toCharArray();
  StringBuffer sb = new StringBuffer("");
  byte[] bs = null;
  try {
   bs = content.getBytes("GBK");
  } catch (UnsupportedEncodingException e) {
  }
  int bit;
  for (int i = 0; i < bs.length; i++) {
   bit = (bs[i] & 0x0f0) >> 4;
   /*
    * 增加中文支持思路:通过getBytes获取的中文的assii小于0,根据rtf中文的的编码 所以只需要在中文的2个编码
    * 第一个编码前加 第二个编码后加 加了一个变量inext 用来判断中文的assii 前一个和后一个。
    * 这样在rtf中文的乱码就可以解决了。
    */
   if (bs[i] > 0) {
    sb.append("\\'");
   } else {
    if (inext == 0) {
     sb.append("\\loch\\af2\\hich\\af2\\dbch\\f31505");
     sb.append("\\'");
     inext = 1;
    } else {
     sb.append("\\'");
    }
   }
   sb.append(digital[bit]);
   bit = bs[i] & 0x0f;
   sb.append(digital[bit]);
   if (bs[i] < 0 && inext == 1) {
    sb.append("\\hich\\af2\\dbch\\af31505\\loch\\f2");
    inext = 0;
   }
  }
  return sb.toString();
 }

在写文件的时候

 FileOutputStream fos = new FileOutputStream("path" + "\\" + targetname,
     true);
   BufferedOutputStream bs = new BufferedOutputStream(fos);
   if (targetcontent.equals("") || targetcontent == "") {
    bs.write(sourcecontent.getBytes("GBK"));
   } else {
    bs.write(targetcontent.getBytes("GBK"));
   }
   bs.close();
   fos.close();
  } catch (IOException e) {
   e.printStackTrace();
  }

最终问题得到了解决。。

原创粉丝点击