我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java使用readLine() 乱码的解决方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java使用readLine() 乱码的解决方法

这期内容当中小编将会给大家带来有关java使用readLine() 乱码的解决方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

使用readLine() 乱码的解决

本人在公司开发程序遇到了读取 一行乱码

eclipse 默认为utf-8

FileInputStream f4 = new FileInputStream(new File("F:\\bb.txt"));BufferedReader bufferedReader2 = new BufferedReader(new InputStreamReader(f4));String readLine = bufferedReader2.readLine(); //会输出乱码

测试文件有两个文本文件分别为,aa.txt (UTF-8编码),bb.txt(GB2312编码)两个文件中的内容都为一个字符 中:

java使用readLine() 乱码的解决方法

java使用readLine() 乱码的解决方法

前提知识: utf-8中文占三个字节,GB2312中文占两个字节

测试 代码:

public class EncodeTest {    @Test    public void test1() throws Exception{        FileInputStream f1 = new FileInputStream(new File("F:\\aa.txt"));        byte[] b1  =  new byte[f1.available()];        f1.read(b1);        for(byte b : b1){            System.out.println(b);        }        System.out.println(new String(b1));        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");        FileInputStream f2 = new FileInputStream(new File("F:\\bb.txt"));        byte[] b2  =  new byte[f2.available()];        f2.read(b2);        for(byte b : b2){            System.out.println(b);            byte[] tb = new byte[]{b};            String lm = new String(tb);            System.out.println("当前乱码"+lm);            byte[] lm_b = lm.getBytes();            System.out.println("-----------乱码 start--------");            for(byte bn: lm_b){                System.out.println(bn);            }            System.out.println("-----------乱码 end--------");        }        System.out.println(new String(b2,"gb2312"));        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");        FileInputStream f3 = new FileInputStream(new File("F:\\bb.txt"));        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(f3));        String readLine2 = bufferedReader.readLine();        byte[] b3 = readLine2.getBytes("UTF-8");        for(byte b : b3){            System.out.println(b);        }        System.out.println(new String(b3));        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");                FileInputStream f4 = new FileInputStream(new File("F:\\bb.txt"));        BufferedReader bufferedReader2 = new BufferedReader(new InputStreamReader(f4,"GB2312"));        String readLine = bufferedReader2.readLine();        byte[] b4 =readLine.getBytes("UTF-8");        for(byte b : b4){            System.out.println(b);        }        System.out.println(new String(b4));        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");    }}

通过分析打印结果:

-28 #字节1
-72 #字节2
-83 #字节3
中 #utf-8 解码后字符为:中,没有出现乱码
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-42 #字节1
当前乱码� #将 -42 按照utf-8 解码后的字符是乱码,然后再将乱码按照utf-8编码得到的字节如下
-----------乱码 start--------
-17
-65
-67
-----------乱码 end--------
-48 #字节2
当前乱码� ##将 -48 按照utf-8 解码后的字符是乱码,然后再将乱码按照utf-8编码得到的字节如下
-----------乱码 start--------
-17
-65
-67
-----------乱码 end--------
中 # 将 字节1: -42和字节2:-48 按照 gb2312 解码 后为字符 中
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-17 # 这里为readline()方法没有设置使用eclipse默认编码 默认使用utf-8 (读取bb.txt)
-65
-67
-17
-65
-67
�� # 输出的中文为乱码
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-28 #这里为readline()方法设置了编码为GB2312 读取一行文字为中 (读取bb.txt)
-72
-83

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

小结一下

new BufferedReader(new InputStreamReader(f4)); 默认用utf-8去解码字节,而bb.txt文件内容的字符是gb2312 所以该 中 字符在磁盘中占两个字节,而utf-8编码集中的中文占3个字节,而readline()的时候发现是两个字节,当前使用的又是utf-8,所以java底层就将这两个字节单独使用utf-8进行了解码, 每一个字节 使用utf-8编码一次为 一个char字符,所以经过utf-8将两个字节分别解码后的最终数据为两个乱码字符,

读者可以看上面的代码和打印的信息,两字符个乱码编码后的字节分别为-17 -65 -67(红色),和上面单独将一个字节用utf-8 接码后的字符再按照utf-8编码后得到的字节 -17 -65 -67(蓝色)一样,也就是说 当字节按照utf-8 解码时在utf-8编码集中找不到对应的正确的字符时就会默认作为� 输出,而� 对应的utf-8 字节 -17 -65 -67。所以当找不到对应正确的编码字符时都会按照 -17 -65 -67 对应的 字符 � 输出。

常识: 当使用 new BufferedReader(new InputStreamReader(f4),"文本源的编码") 文本源的编码一定要写。这样就不会有乱码。

调用readLine的乱码问题

readLine是一个很好用的方法,但是作为字符流的方法,确实会遇到各种关于编码方面的问题。但是用字节流来处理数据,比如说一个文本文件,要作按行处理的话,又会显得很不灵活。

下面提供的是readLine字符流指定编码方式的方法

//定义一个File对象File someFile = new File("somefile.txt");//输入流FileInputStream fis = new FileInputStream(someFile);InputStreamReader isr = new InputStreamReader(fis,"UTF-8"); //指定以UTF-8编码读入BufferedReader br = new BufferedReader(isr);//输出流FileOutputStream fos = new FileOutputStream(someFile + ".生成的文件.txt");OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); //指定以UTF-8编码输出while ((line = br.readLine()) != null) {//osw.write("write something");osw.write(line);}//关闭IO流br.close();osw.close();

上述就是小编为大家分享的java使用readLine() 乱码的解决方法了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java使用readLine() 乱码的解决方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java使用readLine() 乱码的解决方法

这期内容当中小编将会给大家带来有关java使用readLine() 乱码的解决方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。使用readLine() 乱码的解决本人在公司开发程序遇到了读取 一行乱码e
2023-06-22

java中使用jar包乱码解决方法

java使用jar包乱码解决方法:1、修改Eclipse中文本文件的默认编码:windows->Preferences->general->Workspace->Text file encoding设置为UTF-8。修改JAVA源文件的默认编码:windows
java中使用jar包乱码解决方法
2021-06-03

java web乱码解决方法

设置文件的保存编码格式,这个一般在新建项目时,设置了GBK的编码格式,这时文件的页面编码格式是GBK的,而保存格式是ANSI的,后来把项目及文件的编码格式改为utf-8的编码格式后,依然出现中文乱码,这就是因为已经存在的文件的保存编码格式还是ANSI把致,所以
java web乱码解决方法
2014-05-26

MFC Java 使用socket 中文乱码解决方法

在 MFC 中使用 Java 的 Socket 进行通信时,中文乱码问题可能出现在两个方面:发送端和接收端。下面给出解决方法:发送端:1. 在发送方的 MFC 代码中,将要发送的中文字符转换成字节流,并使用 UTF-8 编码:```cppC
2023-10-12

java网页乱码解决方法

java网页乱码常见地方如下:jsp页面中。EL表达式或者直接取值,哪怕写个固定的中文显示都会乱。java代码。前端到后端传输值,乱码。jsp页面编码。只要写jsp的都不陌生,更改页面的字符集。java后台代码。如果是java web项目,那么可以对应在pos
java网页乱码解决方法
2021-08-10

java问号乱码解决方法

在基于Java的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号。(推荐:java视频教程)这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码,故会出现此问题。1、在网页中输出中文
java问号乱码解决方法
2020-03-31

java读oracle乱码解决方法

当Java读Oracle遇到中文乱码时,我们就需要进行转码。(推荐:java视频教程)转码方法:1、纯手工转码将读到的字符串s进行转码,如:new String(s.getByte(A), B)2、Druiddruid是阿里巴巴自己开发的一个驱动,它其实是对各
java读oracle乱码解决方法
2015-08-19

java读写乱码解决方法

java读写乱码解决方法:1、读文件:/** * 读取文件内容 * * @param filePathAndName * String 如 c:\1.txt 绝对路径 * @return boolean
java读写乱码解决方法
2018-12-07

java邮件乱码解决方法

java发送邮件乱码解决方法://设置邮件主题 message.setSubject(MimeUtility.encodeText(mail_subject,MimeUtility.mimeCharset("gb2312"), null)); messag
java邮件乱码解决方法
2017-11-09

java编译乱码解决方法

Java编译源代码时,默认会从操作系统获取codepage,若你安装操作系统时不小心安装了英文版的,可能就会在编译java源码时产生乱码。请看下面测试代码:package com.test;public class Run { public static v
java编译乱码解决方法
2018-07-24

java中string乱码解决方法

java中string乱码解决方法:(推荐:java视频教程)对字符串进行转码来解决字符串乱码代码如下:System.out.println(str); String str1 = new String(str.getBytes("ISO
java中string乱码解决方法
2021-08-15

java中url乱码解决方法

java中url乱码解决方法:(推荐:java视频教程)1、将字符串转码:newString(“xxxxx”.getBytes(“iso-8859-1”),”utf-8”)这种转码方式有很大的弊端,因为它是使用指定的字符集将此String编码为 byte 序列
java中url乱码解决方法
2017-05-02

java下载乱码解决方法

下载文件乱码解决代码: String userAgent = request.getHeader("User-Agent"); String formFileName = file.getFileName(); // 针对
java下载乱码解决方法
2019-05-29

java页面乱码解决方法

在页面提交到tomcat乱码 解决方法是在tomcat/conf/server.xml中进行配置(推荐:java视频教程)以tomcat6.0.32为例,需将以下代码:Xml代码改为:Xml代码如果tomcat前端有Apache或是Nginx转发,则还需将:X
java页面乱码解决方法
2021-02-14

java传值乱码解决方法

在做JavaWeb时,总是时不时的会遇到中文传值乱码问题,在你把所有”ISO-8859-1”改成“UTF-8”发现还是没什么用。于是我就找到了一个百试百灵的方法(至少目前我是),就是强行转换成“UTF-8”编码。看代码:@RequestMapping("/su
java传值乱码解决方法
2017-11-11

java乱码问号解决方法

java乱码问号如下图:所有涉及到汉字的,全变成了问号,奇怪的很,国际惯例,从html页面开始检查,看着编码没问题啊,而且页面其他模块的汉字是可以正常显示的,那么开始断定是后台的问题,从action里开始看起,把request、response都设置编码格式为
java乱码问号解决方法
2020-05-17

java提交乱码解决方法

java提交乱码解决方法:1、如果提交方式为post,想不乱码,只需要在服务器端设置request对象的编码即可,客户端以哪种编码提交的,服务器端的request对象就以对应的编码接收,比如客户端是以UTF-8编码提交的,那么服务器端request对象就以UT
java提交乱码解决方法
2015-01-02

java接口乱码解决方法

通过接口上传中文信息时,在java后台获取值时request.getParameter(),会出现乱码。在代码中用各种转码都没有处理掉。(java相关视频教程推荐:java视频教程)需要在tomcat配置文件中修改:/conf/server.xml原: 修改为
java接口乱码解决方法
2016-06-15

java项目乱码解决方法

java项目乱码解决方法:(推荐:java视频教程)一、设置工作空间的编码1、编辑器的编码会影响到所有的项目中的字符的显示,可以说是作用最为广泛的设置,每一个项目都会受到这个设置的影响。点击菜单栏中的窗口(Window)— —选项(Preferences)。2
java项目乱码解决方法
2021-10-10

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录