Android中文转码是变乱

sky123123 2011-02-28 03:38:51
从Sqlite中取出的中文(unicode)在界面上显示正常,通过Toast显示,也正常,


可是 就在我把这个中文转换成十六进制是 却出现了乱码:

举个例子:

界面显示“暂”字 正常,Toast“暂”字也正常,可是转换成十六进制去变成了“e6 9a 82”, 应该是“d4 dd”才对哦

补充说明:

我单独写一个类 测试这个进制转换的方法时,“暂”字是输出d4 dd的,这说明这个方法是对的哦


可我现在就不明白喽 在Android中为什么会乱码呢, 问题到底是出在什么地方呢   恳请大家指点哦  谢谢、
...全文
689 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sodino 2011-03-01
  • 打赏
  • 举报
回复

try {
String str = "暂";
byte[] data = str.getBytes();
System.out.print("getBytes():Default ");
for (int i = 0; i < data.length; i++) {
System.out.print(Integer.toHexString(data[i]) + " ");
}
System.out.println();
data = str.getBytes("utf-8");
System.out.print("getBytes():UTF-8 ");
for (int i = 0; i < data.length; i++) {
System.out.print(Integer.toHexString(data[i]) + " ");
}
System.out.println();
data = str.getBytes("gbk");
System.out.print("getBytes():gbk ");
for (int i = 0; i < data.length; i++) {
System.out.print(Integer.toHexString(data[i]) + " ");
}
System.out.println();
data = str.getBytes("gb2312");
System.out.print("getBytes():gb2312 ");
for (int i = 0; i < data.length; i++) {
System.out.print(Integer.toHexString(data[i]) + " ");
}
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}


Console:

getBytes():Default ffffffe6 ffffff9a ffffff82
getBytes():UTF-8 ffffffe6 ffffff9a ffffff82
getBytes():gbk ffffffd4 ffffffdd
getBytes():gb2312 ffffffd4 ffffffdd

coxfilur_2008 2011-03-01
  • 打赏
  • 举报
回复
"界面显示“暂”字 正常,Toast“暂”字也正常,可是转换成十六进制去变成了“e6 9a 82”, 应该是“d4 dd”才对哦"

是编码问题。
就是说你函数输入的bytes是utf-8编码的,“暂”的utf-8码就是3个字节。如果你输入它的gbk或unicode16码的话,就对了。它的unicode16码是两个字节。
念茜 2011-02-28
  • 打赏
  • 举报
回复
每天都能看见这个问题
dinjay 2011-02-28
  • 打赏
  • 举报
回复
你这转换方法就是GB2UTF8,你为什么要转?不用转吧
dinjay 2011-02-28
  • 打赏
  • 举报
回复
java的显示和android的不一样.....
android只能正常显示GB编码的汉字,比如“暂” gb编码是D4DD,UTF-8编码是E6 9A 82,也就是你转换后的结果,所以你需要将转完后的16进制字符串再从UTF8转换成GB.....
sky123123 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dinjay 的回复:]
?你不是说写测试的时候这样是可以的么?测试程序是怎么写的?用什么控件显示是正确的?
[/Quote]

我是在一个普通的JavaProject中测试这个转码方法是可以的 可是把这个方法拿来用在Android中就不行了, 那个方法我已经贴上去了哦

显示的时候是在ListActivity中的一个Item中显示的 这个Item也就是一个TextVeiw


我在转码之前 还特意Toast一下,显示也是正常的, 转换过之后 就不行了
dinjay 2011-02-28
  • 打赏
  • 举报
回复
?你不是说写测试的时候这样是可以的么?测试程序是怎么写的?用什么控件显示是正确的?
sky123123 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ameyume 的回复:]
界面是用什么显示的?
android编码的问题太挠头了。
把取出来的数据转为utf-8呢?
[/Quote]

界面是ListActivity

ameyume 2011-02-28
  • 打赏
  • 举报
回复
界面是用什么显示的?
android编码的问题太挠头了。
把取出来的数据转为utf-8呢?
sky123123 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dinjay 的回复:]
转换函数怎么写的?
如果按你说的,单独写一个类 测试这个进制转换的方法是没问题的,那怎么会有问题呢?android里你是通过这个方法将传入的汉字编码转换,测试里也是将传入的汉字转换,那是没有任何区别的。
[/Quote]


public String chineseToHexString(String str){
Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG).show();
if(str==null || str.length()<=0){
return "";
}
byte[] a=str.getBytes();
StringBuffer sb = new StringBuffer();
for(int i=0; i<a.length; i++){
sb.append(Integer.toHexString((256+a[i])%256) + " ");
}
return sb.toString();
}


在这个方法中呢, str=“暂”;Toast时显示的(LogCat无法显示中文),

而最后的Log.v("TaskSync", sb.toString());显示的却是“e6 9a 82”,很令人郁闷呐
dinjay 2011-02-28
  • 打赏
  • 举报
回复
转换函数怎么写的?
如果按你说的,单独写一个类 测试这个进制转换的方法是没问题的,那怎么会有问题呢?android里你是通过这个方法将传入的汉字编码转换,测试里也是将传入的汉字转换,那是没有任何区别的。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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