一个字符串,本来就是utf-8编码(utf-8是正确编码),我想转成gbk编码. 然后反之转换回去.
java里有没有函数库提供转换?
另外 new String(xxx.getBytes("utf-8"),"gbk") 这个方法是字符串是gbk编码但是转换错了(转换成utf-8),然后用这个方法转换回来.所以跟我的问题不一样.
java里有没有函数库提供转换?
另外 new String(xxx.getBytes("utf-8"),"gbk") 这个方法是字符串是gbk编码但是转换错了(转换成utf-8),然后用这个方法转换回来.所以跟我的问题不一样.
创建具有指定文件和字符集且不带自动刷行新的新 PrintWriter。
是将字符串转换成 byte[],一般字符串需要通过流传递,都会有这样一个过程。
(这个过程,可能是需要你手动完成,又可能是由底层程序自动完成)发送方把 String 按一定的规则编码,变成二进制数据(byte[]), charset 就是所使用的规则
接收方 收到了 byte[] 后,使用相同的规则 (charset) 进行逆操作,也就是解码。从而得到正确还原后的 String
如果编码使用的规则(charset) 与解码使用的规则不一致 则导致接收方无法还原字符串,从而得到所谓的 乱码。
str.getBytes(charset) 就是一个编码过程,把字符串转换成 byte 数组, 也就是 byte 序列
new String(bytes, charset) 就是一个解码过程,解码 byte序列, 还原为 String 正确的运用好这两个功能。
再详细分析一下实际情况,应该可以自己搞惦如果,还有遇到问题。。 再提出来让大家讨论分析
这类情况 A, B 约定好传输编码就可以.
比如 A中 str.getBytes("UTF-8") 得到 byte[], 把这字节序列 bytes 传给 B 后, B 用 new String(bytes, "UTF-8") 就能还原字符串内容的不知道你们的系统是怎么设计的. 最好给出 A,B 具体的 收发接口------------------------------------------------
楼主仍然错误的认为 Java 中的 String 有 GBK,UTF-8 之分.需要明确, java 中的 String 没那么复杂, 不管是 A系统里的 String,还是 B系统中的 String, 运行时它们都是以 Unicode 编码存在内存里的
byte[] returnBytes = Encoding.Convert( Encoding.UTF8, Encoding.GetEncoding("gb2312"), bytes);
StringBuffer str = new StringBuffer();
int len = srcByte.length;
int char1, char2, char3;
int count = 0;
while (count < len) {
char1 = (int) srcByte[count] & 0xff;
switch (char1 >> 4) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
count++;
str.append( (char) char1);
break;
case 12:
case 13:
count += 2;
if (count > len) {
throw new UTFDataFormatException();
}
char2 = (int) srcByte[count - 1];
if ( (char2 & 0xC0) != 0x80) {
throw new UTFDataFormatException();
}
str.append( (char) ( ( (char1 & 0x1F) << 6) | (char2 & 0x3F)));
break;
case 14:
/* 1110 xxxx 10xx xxxx 10xx xxxx */
count += 3;
if (count > len) {
throw new UTFDataFormatException();
}
char2 = (int) srcByte[count - 2];
char3 = (int) srcByte[count - 1];
if ( ( (char2 & 0xC0) != 0x80) || ( (char3 & 0xC0) != 0x80)) {
throw new UTFDataFormatException();
}
str.append( (char) ( ( (char1 & 0x0F) << 12) |
( (char2 & 0x3F) << 6) |
( (char3 & 0x3F) << 0)));
break;
default:
throw new UTFDataFormatException();
}
}
String temp = new String(str);
try{
if(encoding==null) encoding = "GBK";
return temp.getBytes(encoding);
}catch(Exception e){
return null;
}
}
....
try {
byte[] gbkBytes = new String(utfBytes).getBytes("GBK");
} catch (UnsupportedEncodingException e) {
}
byte[] utfBytes = new String("我").getBytes("UTF-8");
for (byte b:utfBytes) System.out.print(Integer.toHexString(b&0x000000ff)+" ");
System.out.println();
byte[] gbkBytes = new String(utfBytes).getBytes("GBK");
for (byte b:gbkBytes) System.out.print(Integer.toHexString(b&0x000000ff)+" ");
byte[] gbkBytes = new String("我").getBytes("GBK");
for (byte b:gbkBytes) System.out.print(Integer.toHexString(b&0x000000ff)+" ");
System.out.println();
byte[] utfBytes = new String(gbkBytes,"GBK").getBytes("UTF-8");
for (byte b:utfBytes) System.out.print(Integer.toHexString(b&0x000000ff)+" ");
System.out.println();
你为什么说是 字符串 (string) 从 utf-8 转 gb2312字符串没有分什么 utf-8, gb2312, 运行时,都统一 unicode 表示// java
byte[] returnBytes = new String(bytes, "UTF-8").getBytes("GBK");