本人才疏学浅,如有错误,敬请指正
前言
Java在Windows中文版系统上的默认编码是GBK,而在Linux上默认编码是UTF-8,两种编码都支持中文,但是在两平台通信的过程中如果出现中文很可能就会乱码,当然,可以把默认编码改为UTF-8,但是这是治标不治本的做法,总会遇到GBK的
先简单介绍我编写的转码函数,以后有时间了再补上转码的原理和具体实现过程。
一、Java的编码
Java以Unicode形式存储字符; 用户创建字符串的时候,字符串还没有被编码,直到输入输出时,字符串才会被以系统默认编码写入 或 以特定编码输出。
二、字符串转换类
代码如下: 向类方法传入待转码的字符串,返回值为
import java.io.UnsupportedEncodingException;
public class ArcoEncoding {
public static void getBinary(String str) {
int length = 0;
String bstr;
for(byte b:str.getBytes()){
bstr = Integer.toBinaryString((b & 0xFF) + 0x100).substring(1);
System.out.print(bstr+" ");
length++;
}
System.out.println("|binary|"+length+" bit "+str);
}
public static void getBinary(byte[] barray) {
int i;
String bstr;
for(i = 0; i <barray.length; i++){
bstr = Integer.toBinaryString((barray[i] & 0xFF) + 0x100).substring(1);
System.out.print(bstr+" ");
}
System.out.println("|bit array|length:"+barray.length+" bit");
}
public static byte[] gbkToUtf8(String str) {
int endLength,i;
String workstr = "";
byte[] workarray;
byte[] enterTestArray;
String addedstr = str + "喵";
byte byteMiaoHigh = -95;
byte byteMiaoLow = -119;
System.out.println(addedstr);
enterTestArray = str.getBytes();
if(enterTestArray[enterTestArray.length - 2] == 13 && enterTestArray[enterTestArray.length - 1] == 10) {
enterTestArray[enterTestArray.length - 2] = byteMiaoHigh;
enterTestArray[enterTestArray.length - 1] = byteMiaoLow;
addedstr = new String(enterTestArray);
}
try {
workstr = new String(addedstr.getBytes("UTF-8"),"GBK");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
workarray = workstr.getBytes();
endLength = workarray.length;
byte[] uft8array = new byte[endLength - 3];
for(i = 0; i < endLength - 3; i++) {
uft8array[i] = workarray[i];
}
getBinary(workarray);
for(i = 0; i <uft8array.length; i++){
String bstr = Integer.toBinaryString((uft8array[i] & 0xFF) + 0x100).substring(1);
System.out.print(bstr+" ");
}
System.out.println("|over|sbsy");
return uft8array;
}
}
三、测试
测试代码如下: 运行代码,向控制台输入一段不要太长的字符串(我忘记有没有对长度做限制了,如果当时用的是byte[]的话对长度会有限制) 然后会输出转码结果,以及转换过程中的二进制编码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
public class Test {
public static void main(String args[]) throws Exception{
String str = "";
String codedstr = "";
byte[] barray = new byte[12];
byte[] codedarray;
byte[] t1 = new byte[4];
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
str = br.readLine();
ArcoEncoding.getBinary(str);
codedarray = ArcoEncoding.gbkToUtf8(str);
System.out.println("转码结果(二进制):");
ArcoEncoding.getBinary(codedarray);
codedstr = new String(codedarray,"UTF-8");
System.out.println("转码结果(字符串):"+codedstr);
}
}
总结
这个转码方式仍有不足之处,不知道出于什么原因,偶尔有汉字仍然会乱码,比如如果输入的字符串中有“最阀”,就会乱码。
|