字符串编码问题.

行云边 2010-08-06 11:30:13
一个字符串,本来就是utf-8编码(utf-8是正确编码),我想转成gbk编码. 然后反之转换回去.
java里有没有函数库提供转换?


另外 new String(xxx.getBytes("utf-8"),"gbk") 这个方法是字符串是gbk编码但是转换错了(转换成utf-8),然后用这个方法转换回来.所以跟我的问题不一样.
...全文
312 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wcwtitxu 2012-05-27
  • 打赏
  • 举报
回复
byte[] returnBytes = Encoding.Convert( Encoding.UTF8, Encoding.GetEncoding("gb2312"), bytes);

那你这个是 byte[] 从 utf-8 转 gb2312
你为什么说是 字符串 (string) 从 utf-8 转 gb2312

字符串没有分什么 utf-8, gb2312, 运行时,都统一 unicode 表示

// java
byte[] returnBytes = new String(bytes, "UTF-8").getBytes("GBK");
yktd26 2010-08-20
  • 打赏
  • 举报
回复
反过来是
		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();
yktd26 2010-08-20
  • 打赏
  • 举报
回复
试了一下应该没问题
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)+" ");
yktd26 2010-08-20
  • 打赏
  • 举报
回复
byte[] utfBytes = new byte[100];
....
try {
byte[] gbkBytes = new String(utfBytes).getBytes("GBK");
} catch (UnsupportedEncodingException e) {
}
行云边 2010-08-20
  • 打赏
  • 举报
回复
贴一个别人写的 utf2gbk. 但是我想问java框架是否存在这样的功能.存在的话那互相转换会方便很多

public static byte[] utfToGBK(byte[] srcByte,String encoding) throws UTFDataFormatException{
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;
}
}

行云边 2010-08-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wcwtitxu 的回复:]
这类情况 A, B 约定好传输编码就可以.
比如 A中 str.getBytes("UTF-8") 得到 byte[], 把这字节序列 bytes 传给 B 后, B 用 new String(bytes, "UTF-8") 就能还原字符串内容的

不知道你们的系统是怎么设计的. 最好给出 A,B 具体的 收发接口

----------------------------------……
[/Quote]
唉~貌似很多人没明白我的意思.其实很简单就是用java实现.net里这个功能:
byte[] returnBytes = Encoding.Convert( Encoding.UTF8, Encoding.GetEncoding("gb2312"), bytes); 
chuchuzinnia 2010-08-13
  • 打赏
  • 举报
回复
友情帮顶!!
wcwtitxu 2010-08-13
  • 打赏
  • 举报
回复

这类情况 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 编码存在内存里的
ntcome 2010-08-13
  • 打赏
  • 举报
回复
java的字符串都是unicode的。

应该是utf-8 ----> unicode(可以在这里修改) -----> gbk
行云边 2010-08-13
  • 打赏
  • 举报
回复
我的意思可能没说明白,举个例子, 如果有2个模块,一个模块A内部处理统一为gbk编码, 另一个模块B是统一为utf-8编码,2者通过XML数据通信. 那么一个字符串是gbk编码在A系统是可以正确显示并处理的.但是如果要生成utf-8编码的XML数据传给B系统那就有问题了.
过往记忆 2010-08-08
  • 打赏
  • 举报
回复
你所说的这种现象是可以通过代码来实现的,我以前在处理这样的事情时把GBK转换成UTF-8都是用代码来处理的。。
dr_lou 2010-08-07
  • 打赏
  • 举报
回复
另外 new String(xxx.getBytes("utf-8"),"gbk") 这个方法是字符串是gbk编码但是转换错了(转换成utf-8),然后用这个方法转换回来.所以跟我的问题不一样.

jdk还会为了处理转码错误而特意设置函数?你试试再说!

你想实现什么? java都是unicode的
wcwtitxu 2010-08-07
  • 打赏
  • 举报
回复
字符串就是字符串,就是一串 Char 的序列,无所谓什么编码

运行时内存中存储,Java 都是按 Unicode

===============================================

只有当字符串转换成 byte 序列,或者是 byte 序列转化成字符串时,才有涉及到编码

说到底 charset 是一个转换规则, 是转换过程才涉及的

===============================================

“一个字符串,本来就是utf-8编码(utf-8是正确编码)”

把 utf-8 编码规则当成字符串的一种状态了, 注意 charset 是一种规则而不是一种状态

所以这样的表述 很难让人猜中你具体是什么样的实际情况

===============================================

Java 的 String 有 getBytes(charset) 方法, charset 是指定的编码规则
是将字符串转换成 byte[],一般字符串需要通过流传递,都会有这样一个过程。
(这个过程,可能是需要你手动完成,又可能是由底层程序自动完成)

发送方把 String 按一定的规则编码,变成二进制数据(byte[]), charset 就是所使用的规则
接收方 收到了 byte[] 后,使用相同的规则 (charset) 进行逆操作,也就是解码。从而得到正确还原后的 String
如果编码使用的规则(charset) 与解码使用的规则不一致 则导致接收方无法还原字符串,从而得到所谓的 乱码。


str.getBytes(charset) 就是一个编码过程,把字符串转换成 byte 数组, 也就是 byte 序列
new String(bytes, charset) 就是一个解码过程,解码 byte序列, 还原为 String

正确的运用好这两个功能。
再详细分析一下实际情况,应该可以自己搞惦

如果,还有遇到问题。。 再提出来让大家讨论分析
  • 打赏
  • 举报
回复
这需要 UTF-8 与 GBK 的字符映射表,否则转不了!

不过在 JAVA 中都是采用 Unicode 来表示的。
yifine1987 2010-08-07
  • 打赏
  • 举报
回复
楼上几位都说得很对,这里我补充一点,我们常用的工具,例如Tomcat\ecplise等等都是国外的写的,这些工具中的编码,在默认情况下都是ISO8859-1的
行云边 2010-08-06
  • 打赏
  • 举报
回复
我网上找了一下 貌似有朋友 写了 utfTogbk的函数 不过没找到 gbkToUtf的. 不知道java库里有没有提供类似的功能
prince_java 2010-08-06
  • 打赏
  • 举报
回复
io流里面倒是有几个类可以指定字符集进行转换,例如这个:

PrintWriter(File file, String csn)
创建具有指定文件和字符集且不带自动刷行新的新 PrintWriter。

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧