java字符与字节的问题(算分给热心的朋友)

sunxing007 2009-06-27 10:52:25
这段代码很简单,就是从一个文本文件读字节,然后转成String打印出来,

public class TestStream {
public static void main(String[] args) throws Exception{
//q.txt带有中文和中文特有的标点符号。保存为ANSI编码格式
InputStream in = new FileInputStream("c:\\q.txt");
byte[] b = new byte[32];
int size = in.read(b);
while(size!=-1){
//下面这样会有很多乱码。
System.out.print(new String(b, 0, size));
//如果我把q.txt保存为UTF-8,然后象下面这样构造String, 乱码没了。
//但是有少量问号
//System.out.print(new String(b, 0, size, "UTF-8"));
size = in.read(b);
}
in.close();
}
}

q.txt是一个简单的中文文本文件。比如:

进行被过滤黑名单的更新
。同时会另外启用两个xnet2.ex
e线程,与211.161.1.134 和 203.171.
236.231进行通讯,后者ip为 河南郑州景安计算机网络 ,前者
是北京 长宽的一个ip,具体来源不明。
坝完美得全部符合。它的存在真的是为了保护未成人收到色情网站
的毒害吗?未必,监视大量应用程序,定时对系统进行截图,对代理软
件进行封锁,然后将用户电脑中的各种资料秘密传往某处。

问题我已经描述在程序中了, 怎么可以消除这样的问题,
还有就是在像这样的InputStream中,我不知道那个文件保存为什么样的编码, 我要把它用流读出来,然后显示出来,怎么做才没有乱码。
不要告诉我用BufferedReader.
如果愿意就byte, char,字节流,字符流做一些讨论和指导更好。
谢谢热心的朋友们。
...全文
355 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
harold2007 2009-07-01
  • 打赏
  • 举报
回复
我先留名 !
luckygino 2009-07-01
  • 打赏
  • 举报
回复
共同学习了 加油
晴天v1 2009-07-01
  • 打赏
  • 举报
回复
留名。
xcasp2008 2009-06-30
  • 打赏
  • 举报
回复
System.out.print(new String(b.getBytes("GBK), 0, size));

这样行不行?
fyofmee 2009-06-30
  • 打赏
  • 举报
回复
太强大了,学习下`~~
  • 打赏
  • 举报
回复
学习下,这方面做得少,不懂
virginkj 2009-06-30
  • 打赏
  • 举报
回复
学习来了
晴天v1 2009-06-30
  • 打赏
  • 举报
回复
顶起,不能沉下去了啊。
现在的问题是不是读文件时缓冲数据大小的设置问题啊?

我有个想法,就是每次读一行数据,读到文件中有回车,换行时即13、10时,动态设置缓存数组的大小。
但不知道怎么实现。
sunxing007 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 scarlet365 的回复:]
文本文件中,前N个字节(每种编码不一样)标识了本文件的字符编码

ansi = 无(即第一个字节就是文件的内容)

UTF-8 = 0xEF,0xBB,0xBF(UTF-8占用前3个字节)

Unicode = 0xFF 0xFE(unicode占用前2个字节)

附测试代码:


Java code

/**
* Title: CatchFileEncoding.java<br>
* Description:获取文件字符集<br>
* Copyright @ 2006 .All rights reserved.<br>
* @author LiN
* @version 2009-2-4 1.0

[/Quote]
其实这楼的兄弟的例子很好,只是运行时候有错, 还没来得及参透。
sunxing007 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 preferme 的回复:]
看楼主的代码。
貌似像是接触字符编码处理时间比较短暂。

一般情况下,我们就用固定编码形式来处理字节流。
如果发现乱码,就更改配置文件,换一个编码试一试。

如果,程序非要完成编码的自动识别。这个问题就非常有难度了。
通常的办法,就是逐个的将已知的编码逐个去试,能解码成功的就OK。
这方面做的比较好的,mozilla基金会有一个Firefox用来自动探测编码的库
LZ可以参看一下它的使用方式。
其他方面的…
[/Quote]
以前是没有研究过编码,通常的做法就是凡是涉及到编码的地方都utf-8.
因为写一段代码引起了我对编码和字符集的兴趣。
http://blog.csdn.net/sunxing007/archive/2009/06/29/4305956.aspx
这篇文章中, 解析http头需要用字节流,但是http头是有含义的,所以要把读到的http头的一行转换为字符串。
于是我想顺便探讨一下子节流转字符流的问题。
sunxing007 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 zhangyou1010 的回复:]
顶起,不能沉下去了啊。
现在的问题是不是读文件时缓冲数据大小的设置问题啊?

我有个想法,就是每次读一行数据,读到文件中有回车,换行时即13、10时,动态设置缓存数组的大小。
但不知道怎么实现。
[/Quote]
这个点子不错。
rxw137384765 2009-06-29
  • 打赏
  • 举报
回复
还没学,先帮顶一下,以后学了再来这里学习学习
longq121 2009-06-29
  • 打赏
  • 举报
回复
来晚了,不错,学习了
冰思雨 2009-06-29
  • 打赏
  • 举报
回复
看楼主的代码。
貌似像是接触字符编码处理时间比较短暂。

一般情况下,我们就用固定编码形式来处理字节流。
如果发现乱码,就更改配置文件,换一个编码试一试。

如果,程序非要完成编码的自动识别。这个问题就非常有难度了。
通常的办法,就是逐个的将已知的编码逐个去试,能解码成功的就OK。
这方面做的比较好的,mozilla基金会有一个Firefox用来自动探测编码的库
LZ可以参看一下它的使用方式。
其他方面的我就不知道了。

我一般遇到这种情况,都是按照固定编码的方式来做的。
只是,先使用GBK解码试试,不行再换UTF-8试试,都不行,就程序停止。
InputStream is = ....;
InputStreamReader isr = new InputStreamReader(is,"GBK");
如果代码有异常,就重新获取InputStream , 然后InputStreamReader isr = new InputStreamReader(is,"UTF-8");
当然,如果无法重新获取InputStream 的情况下,
貌似有个ByteArrayInputStream的类,可以先把字节流存到这里,然后再使用。
chudu 2009-06-29
  • 打赏
  • 举报
回复
楼主,建议你先设置一下流的编码:InputStreamReader(InputStream in, String charsetName);
bigbug9002 2009-06-28
  • 打赏
  • 举报
回复
一次性全读进来就没有问题了:

import java.io.*;
public class TestStream {
public static void main(String[] args) throws Exception{
//q.txt带有中文和中文特有的标点符号。保存为ANSI编码格式
InputStream in = new FileInputStream("c:\\q.txt");
byte[] b = new byte[640];

int size = in.read(b);
BufferedOutputStream bos=new BufferedOutputStream(System.out);
while(size!=-1){
//下面这样会有很多乱码。
System.out.print(new String(b, 0, size));
//如果我把q.txt保存为UTF-8,然后象下面这样构造String, 乱码没了。
//但是有少量问号
//System.out.print(new String(b, 0, size, "UTF-8"));
//bos.write(b,0,32);
size = in.read(b);
}
in.close();
}
bigbug9002 2009-06-28
  • 打赏
  • 举报
回复
这个确实和半角(英文)全角字符(汉字)有关.
如果文本全是汉字没有问题,全是半角也没有问题.如果混用但连续的半角是偶数个也没有问题.就怕出现奇数个半角.

比如,你前31个字节是英文,第32,33个字节是汉字,你一次性读入32个字节,就会读入31个英文字符,再读入半个汉字的字符。再往后就乱套了。


超维电脑科技 2009-06-28
  • 打赏
  • 举报
回复
学习
sunxing007 2009-06-28
  • 打赏
  • 举报
回复
这么多回帖呀?非常感谢大家!
wibnmo 2009-06-28
  • 打赏
  • 举报
回复
这个真不知道。继续关注。
加载更多回复(37)

62,616

社区成员

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

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