关于将byte数组转为字符串及中文字符的问题
我从网络上得到了一些文字数据,这些数据包含了中文,英文,符号等等,而且是以UTF-8编码的.而后,我用httpconnection下载本地,用一个很大的byte数组m_buffer存储起来.并用一个int形的变量m_bufferFilled记录了一共下载多少个字节.而后,我想使用String s=new String(m_buffer,0,m_bufferFilled, "UTF-8 ")来生成这个字符串.但是奇怪的是,我只生成了一部分字符串.
比如,原文本是"中央啊;勒克司地方机;按时解放;撒赖可见度法;拉萨扩大飞机;kdsa;kjsd;说得来lkfj;k121@#$$#@%#@$%说得来咖啡碱撒赖棵;"
而我用System.out打印出来,只显示了"?中央啊;勒克司地方机;按时解放;撒赖可见度法;拉萨扩大飞机;kdsa;kjsd;说",请问如何解决下.
------解决方案--------------------先确定数据是不是都传输过来了,可以把网络连接的部分代码贴一下
------解决方案--------------------我确定数据都传过来了,我用winhex看过了.另外,我做了个实验如下,
String a1= "a啊;螺D ";
try
{
byte[] b=a1.getBytes( "UTF-8 ");
String a2=new String(b, "UTF-8 ");
System.out.println(a2);
} catch (Exception e)
{
// TODO: handle exception
}
还是和原来的结果一样,会有一部分文字出不来.请高手看下.
------解决方案--------------------你的服务器端是用writeUTF();方法给客户端传文字的吧.
所以你客户端的显示的问号实际是writeUTF()方法产生的,头两个字节应该是整个文字字节的长度.
你可以用readUTF()方法来读取writeUTF();传来的数据.
或者你抛掉头两个字节,然后在用new String()方法来构建.
saltedfish
------解决方案--------------------测试你的2个字符串
都可以正确的全部显示出来啊
------解决方案--------------------你用System.out.println打印时,显示信息的控制台的编码是什么???
------解决方案--------------------以前开发遇到过类似的情况,HttpConnection 使用get方法进行传输时,url如果超过一定的长度,部分信息会收不到,不清楚你的代码具体实现如何,应该是没有问题的.
------解决方案--------------------首先我在实际应用过程当中出现过例如我要打印“你好欢迎”,但是只是打出来前半部分只有“你好”,有的时候打印两个字 只能打印一个,我也不知道是怎么回事,但是我觉得和控制台的缓冲区有关系吧~~~因为我想要的输出标记都出现了,只是用来看代码流程的,也就没有注意。而且这种情况别人也遇到过。甚至有的时候程序当中输出标记太多,运行不正常,把输出都去掉,也就好了, 估计也是和控制台的缓冲区大小有关吧
------解决方案--------------------byte[] buf=new byte[m_bufferFilled+2];
//m_bufferFilled 填入 buf[0],buf[1]
//m_buffer 填入 buf[2]-buf[m_bufferFilled+1]
String s=new String(buf,0,m_bufferFilled+2, "UTF-8 ");
------解决方案--------------------我当时用C#写的外部工具来把汉字转成数组,不过UTF-8差点要我老命啊,死活就是不行。。。
后来统一成Unicode,不过,C#里面得到的Unicode编码,是LittleEdian的,而J2ME默认的Unicode编码,是BigEdian的,只好在j2me里new String的时候指定UnicodeLittleEdian
你不要认准UTF-8,这个垃圾东西,编码很混乱的!
特别是server不是java的话,更要注意字节顺序问题
另外,我在eclipse运行你第二楼发的代码,没问题的,控制台打印一切正常
查看eclipse文件编码要在 你的工程--> 右键属性--> Resource--> Text files Encoding
我的是默认的GBK。。。
我的eclipse 3.3 M7 + eclipseMe 1.6.8,我的OS是英文版XP PRO SP2
------解决方案--------------------String s=new String( "中中中中中中 ");
System.out.println(s)只会打印 "中中中 ",大家帮忙看看
-----------------------------
这个比较可怕了。。。我这这样写是没问题的