在一个项目中遇到用读取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();
}
最终问题得到了解决。。