精华内容
下载资源
问答
  • 字节流乱码与字符流乱码
    2021-03-13 16:27:14

    本文总结自:https://blog.csdn.net/mingliangniwo/article/details/44178491

    前提:数据展示过程:数据写入response容器,浏览器解析response容器

    字节流乱码问题

    如果用response.getOutputStream.write("中国".getBytes("utf-8")); 写入流(把‘中国’以utf-8的格式存入response容器),浏览器上会展示乱码。

    原因:浏览器默认使用码表gb2312来展示数据,因此会出现乱码。

    解决方法:可以通过设置Content-type来指定码表:

    response.setHeader("Content-type", "text/html;charset=utf-8");

    字符流乱码问题

    如果用response.getWriter.write("中国");  写入流,出现乱码。

    原因:当将"中国"写入到Response中,Response容器默认使用iso8859-1码表存储"中国",那么存储的会是两个乱码

    如果设置:response.setHeader("Content-type", "text/html;charset=utf-8");会怎样?

    依旧出现乱码。。

    原因是试图将iso8859-1字节还原成UTF-8字节是不可行的。

    因此我们需要在源头上,即装入容器是就采用utf-8

    response.setCharacterEncoding("utf-8");

    更多相关内容
  • Java的字符流从本质上来说,是字节流的衍生,他通过StreamDecoder和StreamEncoder进行处理,StreamEncoder的作用是将字符按照某种编码输出为字节,StreamDecoder作用是将某些字节按照某个编码方式解码成字符,你...

    首先,如果你明确的知道使用的编码,那么你可以在读取完毕生成字符串的时候直接指定编码。

    例如:

    FileInputStream in = new FileInputStream("aaa.txt");

    byte[] data = new byte[1024 * 4];

    StringBuilder sb = new StringBuilder();

    while(in.read(data) > 0) {

    sb.append(new String(data,"utf8"); // 指定编码格式,避免乱码}

    System.out.println(sb.toString());

    这里FileInputStream就是很标准的字节流了,只需要在最终形成字符串的时候指定正确的编码,那么就可以避免乱码。

    或者利用新的NIO的API读取:

    Path path = Paths.get("D:/aaa.txt");

    byte[] data = Files.readAllBytes(path);

    String result = new String(data,"utf8"); // 指定编码,可以避免乱码。System.out.println(result);

    那么,当我们不确定他的编码的时候,该怎么办呢,这就需要使用类库去猜解他的编码,我用的是这个:cpdetector,他的maven依赖如下:

    net.sourceforge.cpdetector

    cpdetector

    1.0.7

    具体用法是这样的:

    /*** 初始化一个编码判别器,用于判断文件编码。*/

    public static CodepageDetectorProxy getCodePageDetector() {

    CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();

    // 这个用于处理文本文件或者有明确编码的文件 detector.add(new ParsingDetector(false));

    // 用于检测Unicode的编码 detector.add(UnicodeDetector.getInstance());

    // 用于检测各类型的编码 detector.add(JChardetFacade.getInstance());

    // 用于检测ASCII类型编码 detector.add(ASCIIDetector.getInstance());

    return detector;

    }

    然后通过这种做法获取具体的编码:

    /*** 获取输入流的编码格式,但是似乎这种方法有点问题。*/

    public static Charset getCharset(InputStream in) {

    CodepageDetectorProxy detectorProxy = getCodePageDetector();

    try(BufferedInputStream bufferedInputStream = new BufferedInputStream(in)) {

    return detectorProxy.detectCodepage(bufferedInputStream, 128);

    } catch (Exception e) {

    e.printStackTrace();

    return Charset.defaultCharset();

    }

    }

    /*** 获取文件的编码格式,一般用到的就是他了。*/

    public static Charset getCharset(File file) {

    CodepageDetectorProxy detectorProxy = getCodePageDetector();

    try {

    return detectorProxy.detectCodepage(file.toURI().toURL());

    } catch (Exception e) {

    return Charset.defaultCharset();

    }

    }

    那么经过上面两个步骤,我们就能够得到一个charset对象,用他创建string,如果猜测的编码是正确的,就不会出现乱码,当然猜测代码比较耗费时间的,这个在使用的时候要注意一下。

    说到乱码,我们得知道输入流是怎么处理字符的。

    InputStream是一个读取字节的东西,因为无论是什么文本数据,存到系统的时候都是二进制的字节,为了能正确显示字符,需要有一个东西把字符表示为二进制字节,这个东西就是编码表。

    不同的码表的字符和他对应的二进制字节的对应关系是不一致的,那么如果一个字符通过编码格式A编码,但是读取的时候通过编码格式B读取,那么就有一定几率出现乱码,为什么是有一定几率呢,是因为字符集有的是可以相互兼容的,尤其是英文字符部分,不兼容的部分就会出现乱码。

    那么java是怎么处理字符流的呢?

    Java的字符流从本质上来说,是字节流的衍生,他通过StreamDecoder和StreamEncoder进行处理,StreamEncoder的作用是将字符按照某种编码输出为字节,StreamDecoder作用是将某些字节按照某个编码方式解码成字符,你可以自己指定使用的编码类型,当然你不指定,他也会有一个默认的编码类型,而一旦你的文件编码和默认编码不一致,而你又没有指定字符集,那么出现乱码几乎是必然的。

    因此我不赞同你认为字符流能够解决乱码问题,在这个问题上没有一劳永逸的办法,如果阁下知道更合理的解决方案欢迎补充,或者指出回答中不正确的部分。

    展开全文
  • Java字节流读取汉字乱码

    千次阅读 2019-04-03 16:20:09
    关于Java字节流读取汉字乱码探究 问题概述 当我们尝试使用字节流对汉字进行写入读取操作时,可能出现乱码。其根本原因在于编码标准不同。汉字采用gbk,而idea使用UTF-8。在这样的前提下,开始讨论本文题。 使用...

    关于Java字节流读取汉字乱码探究

    1. 问题概述
      当我们尝试使用字节流对汉字进行写入读取操作时,可能出现乱码。其根本原因在于编码标准不同。汉字采用gbk,而idea使用UTF-8。在这样的前提下,开始讨论本文题。

    2. 使用FileInputStream进行读取汉字

       首先在预先准备好 a.txt 文档,内部存储汉字,如图
      

    在这里插入图片描述
    可以看到其编码格式是ANSI,在中文windows上即为GBK编码。
    在这里插入图片描述
    在不改变编码格式的情况下,对该文件进行读取会产生乱码。我们可以使用byte数组,大小为2,进行对汉字的读取,刚好数组一次存储一个汉字的编码。然后输出到控制台,**由于Idea采用的UTF-8,所以在把数组转换为字符串时,需要加上编码方式。这一点决定成败!!!**代码如下:

    public class Practice5 {
        public static void main(String[] args) throws IOException {
    
            FileInputStream fis = new FileInputStream("D:\\a.txt");
            byte[] bytes = new byte[2];
            int len = 0;
            while ((len = fis.read(bytes))!=-1){
                System.out.println(new String(bytes,"gbk"));//关键就在此处,后面加上指定编码方式, 
                //因为读取的汉字时gbk编码,输出到控制台也要使用gbk,而本问题使用的是UTF-8
            }
            fis.close();
        }
    }
    
    结果如图,已经能够成功打印汉字。
    

    在这里插入图片描述

    1. 结论

      总结可知,当编码方式相同时,还是能够使用字节流读取汉字的,但是局限性太大。本文所讨论内容,仅仅是学习过程中的疑惑分析,无食用价值。如有错误,谢谢指出(手动狗头)~~

    展开全文
  • 使用字节流读取文件乱码问题

    千次阅读 2021-02-27 20:17:31
    写出中文向txt文件中写出中文,通过下面代码的演示,因为一个中文占2个字节,所以按照字节写出中文时会出现乱码的情况。package com.monkey1024.stream;import java.io.BufferedOutputStream;import java.io....

    写出中文

    向txt文件中写出中文,通过下面代码的演示,因为一个中文占2个字节,所以按照字节写出中文时会出现乱码的情况。

    package com.monkey1024.stream;

    import java.io.BufferedOutputStream;

    import java.io.FileNotFoundException;

    import java.io.FileOutputStream;

    import java.io.IOException;

    /**

    * 向txt文件中写入中文

    *

    */

    public class WordWrite {

    public static void main(String[] args) {

    try (FileOutputStream fis = new FileOutputStream("word.txt");) {

    String msg = "好好学习";

    //bos.write(msg.getBytes());

    //每次写出3个字节,因为一个中文占用2个字节,所以导致乱码

    fis.write(msg.getBytes(), 0, 3);

    //换行

    fis.write("\r\n".getBytes());

    fis.write("天天向上".getBytes());

    fis.flush();

    } catch (FileNotFoundException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    读取中文

    从txt文件中读取文件,下面代码也出现了乱码问题

    package com.monkey1024.stream;

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.IOException;

    /**

    * 从txt文件中读取中文

    *

    */

    public class WordRead {

    public static void main(String[] args) {

    try (FileInputStream fis = new FileInputStream("word.txt");) {

    byte[] arr = new byte[3];

    int temp;

    while ((temp = fis.read(arr)) != -1) {

    System.out.println(new String(arr, 0, temp));

    }

    } catch (FileNotFoundException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    要想解决乱码的问题,可以使用字符流Reader和Writer

    展开全文
  • 文件字节流乱码

    2022-01-26 18:12:12
    项目场景: idea2021读取文件内容 问题描述: ...在哔哩哔哩上得到启发,找到了原因,原来是在UTF_8中中文是3个字节,英文是1个字节,只要你用的存储的字符数组不是3的整数倍就一定会出现乱码。 ...
  • 1.利用字节流读取文件(汉字) 2.利用字节流复制文件: 3.利用字符流读取文件 4.利用字符流复制文件 5.字符流+缓冲流 1.利用字节流读取文件(汉字) 提供一个Demo1.txt文件,在里面添加内容:星期一到星期日 ...
  • Java基础-3】吃透Java IO:字节流、字符流、缓冲流

    万次阅读 多人点赞 2020-09-23 20:12:33
    什么是Java-IO?字符流和字节流的区别与适用场景是什么?缓冲流到底实现了什么?如何高效地读写文件? 本文用大量的示例图和实例,带你吃透Java IO。
  • 关于用字节输入读取文本文件时出现乱码的问题分析 这个时候我们通过一个例子来进行说明: package IO.fileinputstream; import java.io.FileInputStream; import java.io.File; import java.io.IOException; ...
  • 字节流乱码问题 如果用response.getOutputStream.write("中国".getBytes("utf-8")); 写入流(把‘中国’以utf-8的格式存入response容器),浏览器上会展示乱码。 原因:浏览器默认使用码表gb2312来展示数据,因此...
  • 1、字节输入字节输出字节读取就是采用InputStream.read()方法来读取字节,然后保存到一个byte[]数组中,最后经常用new String(byte[]);把字节数组转换成String。在最后一步隐藏了一个编码的细节,new String...
  • java从文件,控制台,网页提取数据都是以字节流形式输入,由于编码方式不同,有时候会出现中文乱码javaJDK中有一些类可以很好的解决中文乱码问题; 1)建立一个InputStream对象存储输入的字节流; 2)用...
  • 点击蓝字 关注我们从接收输入值说起,在日常的开发应用中,有时候需要直接接收外部设备如键盘等的输入值,而对于这种数据的接收方式,我们一般有三种方法:字节流读取,字符流读取,Scanner 工...
  • Java IO之中文乱码

    千次阅读 2021-02-12 19:29:06
    相信有过学过JavaEE的人们都有遇到过中文乱码问题吧,最简单的就是表单数据提交时中文出现乱码乱码难解决吗?其实不难,只要掌握好编码的设置,乱码神马的一边去。今天主要就讲讲一些常用的可以设置编码的函数的用法...
  • Java 字节流

    2020-09-12 16:04:58
    1.IO流按数据类型分为:字节流和字符流 2.使用: 如果数据可通过Windows自带的记事本软件打开并且不乱码,就使用字符流;否则使用字节流;如果不知道使用哪种就使用字节流。 3.字节流写数据与异常捕获 ...
  • 字节流读写中文出现乱码 public class a { public static void main(String[] args) throws Exception { //创建字节输入流对象 一 File file = new File("src\\asa.txt"); FileInputStream fileInputStream = ...
  • 字节流传输中,传输的是一个字节,一个字节8位,则最多能表现出256种字符,则一个字节通过ASCII码表则可以查找出相应的字符 public class OrderTest1 { @Test public void say2() { String fileEncoding = ...
  • 主要介绍了java 中的乱码问题汇总相关资料,并附解决方案,出现乱码问题有编码与解码,字节流与字符流出现乱码,等其他情况,需要的朋友可以参考下
  • Javaweb 响应字节流输出中文乱码问题

    千次阅读 2021-06-13 15:14:28
    文章目录问题:使用字节流输出,产生了中文乱码?举个栗子原因:存和取用的不是同一个码表解决办法:把存和取的码表统一第一种解决办法:第二种解决办法: (不建议使用,因为不好记)第三种解决办法:第四种解决办法...
  • java中用字节流读取文本时中文乱码

    千次阅读 2016-06-10 23:56:34
    字节流可以读取任何文件,视频流;音频流都可以; 字符流只能读取字符;  说明:一般的汉字是2个字节,而英语字母是1个字节,如果用字节流读取中文,一个字节一个字节的输出,容易把中文汉字截断,建议用字符流...
  • Java字节流乱码问题

    2013-02-04 10:38:02
    需要用字节流读取文件,该文件中含有中文,英文,键盘上的所有字符,在读取的时候,设置的缓冲区是1024,那么就有可能出现一种问题,在读取到1023字节的时候都是英文和数字,刚好一个字符一个字节,这个时候碰到一个汉字,就只...
  • 乱码的根本原因 编码和解码的规则不同 例如:IDEA默认读取文件,...可以使用转换InputStreamReader来解决乱码问题 IDEA默认编码为UTF-8,读取GBK文件 使用转换设置读取编码为GBK InputStreamReader isr = new Inp
  • 1. 响应-字节流输出中文问题 ... * 演示字节流输出的乱码问题 */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** *
  • 只用字节输入输出 一次读取a.txt文件里面的数据 此刻a.txt文件里面是 abc中国 输出的是: abc中国 就是乱码 public static void main(String[] args) throws IOException { //创建字节输入对象 ...
  • 字节流:分为字节输入流(InputStream)和字节输出流(OutputStream) 字符流:分为字符输入流(InputStreamReader)和字符输出流(OutputStreamWriter) 一、字节流 1.字节输入流(InputStream) 说明:字节输入...
  • java字节流怎么读取数据字节流读取数据例子如下: import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;/** * ...
  • 1.编码的产生:我们的存储的基本单元是一个byte字节,然而人类的语言太多,无法用一个基本单元来表示,然而为了拆分或者一些相应的翻译工作,导致了编码的产生2.常见的编码格式ASCll :用一个字节的低7位共128个来...
  • JAVA字节流读写中文

    千次阅读 2019-02-08 21:24:16
    字节流在读中文的时候有可能会读到半个中文,造成乱码  2.字节流写出中文的问题 字节流直接操作的字节,所以写出中文必须将字符串转换成字节数组,写出回车换行 write("\r\n".getBytes()); 二、代码 ...
  • 很多初学者在学到字节输入时都有一个疑惑,当使用字节输入(FileInputStream)读取数字字母时会正常读取,而读取中文数据时会出现中文乱码的情况,是不是读取中文数据非得使用字符输入来读取呢?其实字节输入...
  • 同时,对于write()方法而言,除了char[]数组以外,还可以直接使用String类型,非常方便,中文也是可以的,字节流则可能会乱码。 那么我们来看一看具体实现吧。 package iostream.FileWriter; import java.io.F

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,660
精华内容 13,864
关键字:

java 字节流乱码

java 订阅
友情链接: DCT.rar