utf-8编码转成GBK,难道我们真的束手无策了吗??

jinjin_hz 2003-05-25 12:02:09
我在这里搜索了几篇文章,好像都没有提供一个正确的解决方案,欢迎大家一起探讨!!
...全文
618 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinjin_hz 2003-05-27
  • 打赏
  • 举报
回复
感谢各位的帮助,我的问题已经解决了,不过用了其他方法,没有使用编码转换,我发现人有时候是不能钻死胡同的,也许换个思考方法,别有一番洞天,不过在解决问题过程中也确实学到了很多东西,例如有些编码的编码方式,转换方式,都是很有趣的,也谢谢各位的帮助!
有兴趣的朋友可以继续研究这个问题:描述如下:
public String utfToGbk(byte[] utf_b){
// 返回gbk字符(待Ntian
}
测试如下:byte[] utfb=new byte[2];
utfb[0]=-56;utfb[1]=-67; //这是汉字"三"的utf-8编码
String result=utfToGbk(utfb); //得到的结果应该是"三"
kknd97 2003-05-27
  • 打赏
  • 举报
回复
jinjin_hz(咖啡豆) :
注意,我的方法有一个前提就是,你必须得到一个标准的utf-8的字符串
这样,你能不能把你的问题,详细的说明一下。如果不是很麻烦的话

祝你好运!
jinjin_hz 2003-05-26
  • 打赏
  • 举报
回复
to hellking(信息孤岛):不行啊,有异常抛出
hellking 2003-05-26
  • 打赏
  • 举报
回复
怎么搞的这么复杂?
byte[] buf = ×××× //需要转化的东西用byte[]读进来。

String temp= new String(buf, from) //from 是你已知的编码名称。在这里是UTF8

buf = temp.getBytes(to);//to 是你要转成什么编码。 这里是GBK.

需要注意的是在把字符串读进来之前要确定该字符串绝对是utf8,读进来时一定要用inputStream 流的方式,不要用reader. 转化好之后的byte[]数组可以用outputStream写出去,但是不要再转成字符串,也不能用writer写出去。
jinjin_hz 2003-05-26
  • 打赏
  • 举报
回复
还是没有解决,有兴趣的可以帮我添上下面的程序
public String utfToGbk(byte[] utf_b){
// 返回gbk字符
}

测试如下:byte[] utfb=new byte[2];
utfb[0]=-56;utfb[1]=-67; //这是汉字"三"的utf-8编码
String result=utfToGbk(utfb); //得到的结果应该是"三"
seven1996 2003-05-26
  • 打赏
  • 举报
回复
我觉得 DataInputStream.ReadUTF();就可以阿
具体的楼主查一下类库
DataInputStream类
司码君 2003-05-26
  • 打赏
  • 举报
回复
return new String(new String(src,"iso8859-1").getBytes("GBK"));
这样就可以了
不要转来转去
你是一下看看
jinjin_hz 2003-05-26
  • 打赏
  • 举报
回复
上面两位朋友提供的方法我都尝试过了,还是不行,
而且我是需要从utf-8转到gbk,还有什么好的方法吗??
kknd97 2003-05-26
  • 打赏
  • 举报
回复
应当是这样的:
String gbk="你";
String utf=new String(gbk.getBytes("gb2312"),"utf-8");
System.out.println(utf);
这时候utf里面的字符都是java内核编码的字符,但是他们能够转换到标准的utf-8编码
如果这时候,你在一个以utf-8为默认编码的计算机上运行编译后的class文件,那么一定会输出 <你> 但是,如过你在windows系统下,输出一定是乱码
jinjin_hz 2003-05-26
  • 打赏
  • 举报
回复
kknd97(绝地风暴) :
你的方法行不通!!!!
yefc 2003-05-26
  • 打赏
  • 举报
回复
第三句错了,改为
String sanUTF8=new String(san.getbytes("GBK"),"UTF-8");

yefc 2003-05-26
  • 打赏
  • 举报
回复
String san="三";
String sanUnicode=new String(san.getBytes("GBK"));
String sanUTF8=new String(san.getBytes("UTF-8"));
kknd97 2003-05-26
  • 打赏
  • 举报
回复
jinjin_hz(咖啡豆):问题是这样的
String gbk="你";
String utf=new String(gbk.getBytes("gb2312"),"utf-8");//注意这时候,utf字符串
已经是一个标准的utf-8字符对照到java编码了
String tmp=new String(utf.getBytes("utf-8"),"gb2312");//注意这就是把一个utf-8映射
到gbk编码的方法。
System.out.println(tmp);//输出的肯定是 <你>

//所以如果你有一个utf-8编码的字符串,就可使用
String tmp=new String(utf.getBytes("utf-8"),"gb2312");

祝你好运!

jinjin_hz 2003-05-25
  • 打赏
  • 举报
回复
UTF-8 有一下特性:

UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容). 这意味着只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 两种编码方式下是一样的.
所有 >U+007F 的 UCS 字符被编码为一个多个字节的串, 每个字节都有标记位集. 因此, ASCII 字节 (0x00-0x7F) 不可能作为任何其他字符的一部分.
表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里, 并指出这个字符包含多少个字节. 多字节串的其余字节都在 0x80 到 0xBF 范围里. 这使得重新同步非常容易, 并使编码无国界, 且很少受丢失字节的影响.
可以编入所有可能的 231个 UCS 代码
UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP 字符最多只用到 3 字节长.
Bigendian UCS-4 字节串的排列顺序是预定的.
字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到.
下列字节串用来表示一个字符. 用到哪个串取决于该字符在 Unicode 中的序号.

U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

xxx 的位置由字符编码数的二进制表示的位填入. 越靠右的 x 具有越少的特殊意义. 只用最短的那个足够表达一个字符编码数的多字节串. 注意在多字节串中, 第一个字节的开头"1"的数目就是整个串中字节的数目.

例如: Unicode 字符 U+00A9 = 1010 1001 (版权符号) 在 UTF-8 里的编码为:

11000010 10101001 = 0xC2 0xA9

而字符 U+2260 = 0010 0010 0110 0000 (不等于) 编码为:

11100010 10001001 10100000 = 0xE2 0x89 0xA0

这种编码的官方名字拼写为 UTF-8, 其中 UTF 代表 UCS Transformation Format. 请勿在任何文档中用其他名字 (比如 utf8 或 UTF_8) 来表示 UTF-8, 当然除非你指的是一个变量名而不是这种编码本身
jinjin_hz 2003-05-25
  • 打赏
  • 举报
回复
问题还是没有解决
测试例子如下:
对于字符 “三”它的UTF-8编码是11001000,10111101(状态1)
转化成Unicode是00000010,00111101(状态2)
GBK 是11001000,11111101(状态3)
我现在要从状态1转到状态3,怎么实现??
onefox 2003-05-25
  • 打赏
  • 举报
回复
readUTF();
muymuy 2003-05-25
  • 打赏
  • 举报
回复

It very easy!


byte []utf8 ;// 假设这个变量里已经存放了utf8编码的数据

String unicodeStr = new String(utf8, "utf-8");//先转换为UNICODE字符串

byte [] gbk = unicodeStr.getBytes("GBK");//转换为GBK编码数据
Smilings 2003-05-25
  • 打赏
  • 举报
回复

看看这个可以不?

public static final String UTF8ToGBK(byte[] src)
{
try{
return new String(new String(src,"UTF-8").getBytes("GBK"));
}
catch (UnsupportedEncodingException e )
{
System.out.println("UTF8ToDefault:"+e.getMessage());
return null;
}

}

62,614

社区成员

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

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