A. java 用FileInputStream中read方法读取文件出现乱码
read方法读取复的是字节流(制每次读取一个字节),如果是中文,就是两个字节,就会出现乱码的。
可以通过BufferedReader 流的形式进行流缓存,之后通过readLine方法获取到缓存的内容。
BufferedReader bre = null;
try {
String file = "D:/test/test.txt";
bre = new BufferedReader(new FileReader(file));//此时获取到的bre就是整个文件的缓存流
while ((str = bre.readLine())!= null) // 判断最后一行不存在,为空结束循环
{
System.out.println(str);//原样输出读到的内容
};
备注: 流用完之后必须close掉,如上面的就应该是:bre.close(),否则bre流会一直存在,直到程序运行结束。
B. mysql数据库中存进的是中文,为什么查出来的乱码
一、转码失败
在数据写入到表的过程中转码失败,数据库端也没有进行恰当的处理,导致存放在表里的数据乱码。
针对这种情况,前几篇文章介绍过客户端发送请求到服务端。
其中任意一个编码不一致,都会导致表里的数据存入不正确的编码而产生乱码。
比如下面简单一条语句:
set @a = "文本字符串";
insert into t1 values(@a);
变量 @a 的字符编码是由参数 CHARACTER_SET_CLIENT 决定的,假设此时编码为 A,也就是变量 @a 的编码。
2. 写入语句在发送到 MySQL 服务端之前的编码由 CHARACTER_SET_CONNECTION 决定,假设此时编码为 B。
3. 经过 MySQL 一系列词法,语法解析等处理后,写入到表 t1,表 t1 的编码为 C。
那这里编码 A、编码 B、编码 C 如果不兼容,写入的数据就直接乱码。
二、客户端乱码
表数据正常,但是客户端展示后出现乱码。
这一类场景,指的是从 MySQL 表里拿数据出来返回到客户端,MySQL 里的数据本身没有问题。客户端发送请求到 MySQL,表的编码为 D,从 MySQL 拿到记录结果传输到客户端,此时记录编码为 E(CHARACTER_SET_RESULTS)。
那以上编码 E 和 D 如果不兼容,检索出来的数据就看起来乱码了。但是由于数据本身没有被破坏,所以换个兼容的编码就可以获取正确的结果。
这一类又分为以下三个不同的小类:
1)字段编码和表一致,客户端是不同的编码
比如下面例子, 表数据的编码是 utf8mb4,而 SESSION 1 发起的连接编码为 gbk。那由于编码不兼容,检索出来的数据肯定为乱码。
2)表编码和客户端的编码一致,但是记录之间编码存在不一致的情形
比如表编码是 utf8mb4,应用端编码也是 utf8mb4,但是表里的数据可能一半编码是 utf8mb4,另外一半是 gbk。那么此时表的数据也是正常的,不过此时采用哪种编码都读不到所有完整的数据。这样数据产生的原因很多,比如其中一种可能性就是表编码多次变更而且每次变更不彻底导致(变更不彻底,我之前的篇章里有介绍)。举个例子,表 t3 的编码之前是 utf8mb4,现在是 gbk,而且两次编码期间都被写入了正常的数据。
3)每个字段的编码不一致,导致乱码和第二点一样的场景。不同的是:非记录间的编码不统一,而是每个字段编码不统一。举个例子,表 c1 字段 a1,a2。a1 编码 gbk,a2 编码是 utf8mb4。那每个字段单独读出来数据是完整的,但是所有字段一起读出来,数据总会有一部分乱码。
三、LATIN1
还有一种情形就是以 LATIN1 的编码存储数据
估计大家都知道字符集 LATIN1,LATIN1 对所有字符都是单字节流处理,遇到不能处理的字节流,保持原样,那么在以上两种存入和检索的过程中都能保证数据一致,所以 MySQL 长期以来默认的编码都是 LATIN1。这种情形,看起来也没啥不对的点,数据也没乱码,那为什么还有选用其他的编码呢?原因就是对字符存储的字节数不一样,比如 emoji 字符 "❤",如果用 utf8mb4 存储,占用 3 个字节,那 varchar(12) 就能存放 12 个字符,但是换成 LATIN1,只能存 4 个字符。
C. java打印中文乱码
java控制台中文输出乱码,已经注意文件格式和控制台格式了?不要用系统写字板notepad保存UTF8的Java源文件。M$的UTF8是UTF8withBOM,而Java编译器识别的UTF8是UTF8withoutBOM,两者不兼容。
eclipse中java中文控制台输出的这种乱码解决方式:(1)打开eclipse或myeclipse,点击run-》runconfigurations如图提示,改成UTF-8,有的eclipse或myeclipse有可能需要gbk的形式,不同形式改成不同的编码,尝试一下即可。
设置单个文件的编码:只是个别文件出现了乱码,那么设置个别文件的编码格式就可以解决问题了。选中有乱码的文件,然后点击右键。在弹出的菜单中选择属性(Properties)。
java中输入输出中文乱码,怎么办?1、在代码区域右键-runas-runconfigurations-common(右侧)-consoleencoding如果出现此错误,此时的编码格式应该是UTF-8,选择Other,这时可能没有GBK选项,如果没有,则执行之后操作。
2、读取文件的时候如果是用的read方法(字节流),碰到中文输出就是乱码,然后存储的时候设置下编码为GBK或者是UTF-8形式即可,可以有效的解决乱码问题。
3、java文件读取的时候有中文就很出现乱码,通常获取到的文件中通常都是“iso8859-1”格式,需要转换为“UTF-8”格式。
Java程序输出txt文件内容时中文乱码怎么解决?
解决办法:在代码区域右键-runas-runconfigurations-common(右侧)-consoleencoding如果出现此错误,此时的编码格式应该是UTF-8,选择Other,这时可能没有GBK选项,如果没有,则执行之后操作。
txt文档一般是GBK编码格式的,你可以将它另存一下,改为Utf-8格式,你也可以将你的开发工具调成GBK编码格式,总之就是将你的开发环境的编码格式与你要读取的txt文件的编码格式调成一致的。
读取文件的时候如果是用的read方法(字节流),碰到中文输出就是乱码,然后存储的时候设置下编码为GBK或者是UTF-8形式即可,可以有效的解决乱码问题。
把txt文件重新另存为时选择编码为与编辑器IED的编码一致,比如我IntellijIDEA的编辑器右下角显示为utf-8,然后把要读取的txt文件另存为的时候编码选项选择utf-8,再次运行程序时,就能显示中文。
只是个别文件出现了乱码,那么设置个别文件的编码格式就可以解决问题了。选中有乱码的文件,然后点击右键。在弹出的菜单中选择属性(Properties)。
eclipse中java中文控制台输出的这种乱码怎么解决解决方法其实很简单,设置一下编码就行了。打开Eclipse,右键点击项目文件,然后点击最下方的属性。
进行再textfileencoding进行勾选上default的选项即可。
这不是乱码,原因很明显,索引String数组错误,将最后一个for循环里面的zfc改成zfc[j]即可。
改变整个工作空间的编码格式,这样以后新建的文件也是新设置的编码格式。
为什么我用sublime写java代码时打印中文打印出来是乱码?请问大神编码...1、点击“preferences”菜单,选择“BrowsePackages”打开插件所在目录,找到“java”这一项,双击打开。后缀名为sublime-build的文件是编译程序的命令,找到JavaC.sublime-build,拖入SublimeText2打开进行编辑。
2、产生原因:因为这个开源项目的默认字符编码不对,所以控制台的字符编码也自动变成了UTF-8,而键盘的输入流的默认格式是GBK格式,这样就造成了在GBK转UTF-8的过程中产生的奇数乱码错误(这个问题的解释可以在搜索引擎找到)。
3、SublimeText软件中,用这款代码编辑器打开某个GB2312和GBK编码的文件时,大家可能会遇到中文显示乱码的情况,这是因为SublimeText软件默认的不支持GB2312和GBK编码格式,想要它能够正常显示中文就需要在软件中安装一个中文插件包。
4、字符编码问题:ide下设成utf-8命令行下检查字符页设置对不对。修改cmd窗口字符编码为UTF-8,命令行中执行:chcp65001切换回中文:chcp936这两条命令只在当前窗口生效,重启后恢复之前的编码。
5、SublimeText2目前还不支持gbk编码,UTF-8完美支持。因此,你的文件出现中文乱码应该是打开gbk编码的文件,你可以用系统的记事本直接另存为UTF-8编码的。
6、java文件读取的时候有中文就很出现乱码,通常获取到的文件中通常都是“iso8859-1”格式,需要转换为“UTF-8”格式。
D. java中字节流和字符流读取的问题(有图)
不在于是否来字节流还是字源符流,因为字符流其实也是要经过字节流转换而来的。出现乱码的原因是编码方式不一致。
例如:
系统编码是GBK,文件编码是UTF-8,java读取文件时,就会以GBK的编码方式读取UTF-8的文件,因为两者的编码方式不一样,导致乱码(GBK用两个字节表示字符,最高位1,UTF-8当英文时用一个字节表示,中文时3个字节表示),所以当java以GBK的编码方式读取UTF-8的文件时就会对接不上从而导致乱码。
根本原因是编码方式不一致,字符流,字节流都不关事。因为java读取的时候,是先确定编码方式后,才会根据编码方式去解析文件,确定编码方式是前提,字节流,字符流一样都是要先确定编码方式的,既然编码方式不一致了,那就肯定会乱码,无论是字节流还是字符流。
E. 在java中怎样处理中文乱码的问题(有几种处理方式)
读取文件的时候如果是用的read方法(字节流),碰到中文输出就是乱码,然后存储的时候设置下编码为GBK或者是UTF-8形式即可,可以有效的解决乱码问题。
可以通过BufferedReader 流的形式进行流缓存,之后通过readLine方法获取到缓存的内容。
BufferedReader bre = null;
try {
String file = "D:/test/test.txt";
bre = new BufferedReader(new FileReader(file));//此时获取到的bre就是整个文件的缓存流
while ((str = bre.readLine())!= null) // 判断最后一行不存在,为空结束循环
{
System.out.println(str);//原样输出读到的内容
};
备注: 流用完之后必须close掉,如上面的就应该是:bre.close(),否则bre流会一直存在,直到程序运行结束。
可以通过“FileOutputStream”创建文件实例,之后过“OutputStreamWriter”流的形式进行存储,举例:
OutputStreamWriter pw = null;//定义一个流
pw = new OutputStreamWriter(new FileOutputStream(“D:/test.txt”),"GBK");//确认流的输出文件和编码格式,此过程创建了“test.txt”实例
pw.write("我是要写入到记事本文件的内容");//将要写入文件的内容,可以多次write
pw.close();//关闭流
备注:文件流用完之后必须及时通过close方法关闭,否则会一直处于打开状态,直至程序停止,增加系统负担。
F. Java中有几种类型的流
字节流,字符流。字节流继承于InputStream、OutputStream,字符流继承于InputStreamReader、
OutputStreamWriter。在java.io包中还有许多其他回的流,主要是为了提高答性能和使用方便。