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();
}
最终问题得到了解决。。
- rtf 中处理中文乱码以及utf-8 gbk 所占字节的问题
- HttpURLConnection以及GBK转UTF-8中文部分乱码问题
- PHP中不同编码的汉字占的字节数不同gbk,GBK,UTF-8,utf-8
- PHP中不同编码的汉字占的字节数不同gbk,GBK,UTF-8,utf-8
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
- Java中字符编码问题和中文占几个字节的问题(ASCII Unicode UTF-8 )
- Java中utf-8编码方式时所占字节数的计算方法封装
- varchar2 nvarchar2 存储中文及所占字节的问题
- utf-8的中文:一个汉字占三个字节长度
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)——ubuntu环境设置默认是utf-8,文件编码可使用Encodersoft批量转换
- prototypes JSON 中文乱码问题 (UTF-8 GB2312 GBK)
- 解决utf-8和GBK中文乱码问题
- tomcat设置为UTF-8,解析GBK编码的UTL请求,中文乱码处理
- http程序中:UTF-8转GBK解决中文乱码问题
- uva348 - Optimal Array Multiplication Sequence(简单动规)
- 鱼和水的故事
- apache 同一个IP:端口,绑定多个域名的注意事项
- 一段分析数据的总结
- 算法的时间复杂度和空间复杂度
- rtf 中处理中文乱码以及utf-8 gbk 所占字节的问题
- orcale 下创建 表空间和用户
- 用JSP EL表达式语言显示session的内容
- linux下的动态库(转)
- AbsoluteLayout布局
- License Error:"Failed to Open the TCP Port Number in the License "终极解决方案
- ps显示线程名称
- 怎样实现在一个页面中,给两张表添加信息,求大神赐教!
- 杭电1197