ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java 进阶P-11+P-12

2022-06-23 20:34:18  阅读:180  来源: 互联网

标签:11 编码 12 Java String 解码 浏览器 cn toHex


文本流

在流上建立文本处理

PrintWriter pw = new PrintWriter()(

  new BufferedWriter(

    new Out put StreamWriter(

      new File OutputStream("avc.txt")

    )

  )

);

Reader

常用的是Buffered Reader

read Line();

Line Number Reader

可以得到行号

getLine Number();

File Reader

  • Input Stream Reader类的子类,所有方法都从父类中继承而来
  • FileReader(File file)
  • 在给定从中读取数据的文件名的情况下创建一个新的file Reader
  • File Reader(String fileName)
  • 在给定从中读取数据的文件名的情况下创建一个新File Reader
  • file Reader不能指定编码转换方式

汉字编码

Java中文编码小结

1. 只有 字符到字节 或者字节到字符 的转换才存在编码转码;

2. Java String 采用 UTF-16 编码方式存储所有字符。unicode体系采用唯一的码点表示唯一的字符信息, 码点的存储方式有UFT-16、UTF-8 等等。: AStringrepresents a string in the UTF-16 format in whichsupplementary charactersare represented bysurrogate pairs(see the sectionUnicode Character Representationsin theCharacterclass for more information). Index values refer tocharcode units, so a supplementary character uses two positions in aString. TheStringclass provides methods for dealing with Unicode code points (i.e., characters), in addition to those for dealing with Unicode code units (i.e.,charvalues).

3. String只有一种格式,可认为String是独立于编码系统的,通过getBytes(String charsetName) 可实现编码转换。

4. String对象是内存数据,string之间不存在编码变换问题。

5. 编码转换场景主要在 I/O , I/O 包括磁盘 I/O 和网络 I/O:文件输入输出、屏幕、数据库、浏览器、服务器。

6. 在内存中倒腾String数据是编码无关的,比如压缩编码。

7. 编码误区: new String(str.getBytes("ISO-8859-1"), "GB18030") 这种用法是无意义的,甚至是错误的。这种用法是用GB18030编码将ISO-8859-1编码格式的字节数据强制转换成unicode码点,不乱码是运气!

9. 数据库JDBC能够处理 数据库数据 <=> String 的正确互换。

9.OutputStreamWriter 和 InputStreamWriter 应该指定编码格式,避免程序依赖操作系统默认编码。

10. 用户从浏览器端发起一个 HTTP 请求,需要存在编码的地方是 URL、Cookie、Parameter。服务器端接受到 HTTP 请求后要解析 HTTP 协议,其中 URI、Cookie 和 POST 表单参数需要解码,服务器端可能还需要读取数据库中的数据,本地或网络中其它地方的文本文件,这些数据都可能存在编码问题,当 Servlet 处理完所有请求的数据后,需要将这些数据再编码通过 Socket 发送到用户请求的浏览器里,再经过浏览器解码成为文本。

11. tomcat: URL 的 URI 部分进行解码的字符集是在 connector 的

12. QueryString(GET 查询参数) 的解码字符集要么是 Header 中 ContentType 中定义的 Charset 要么就是默认的 ISO-8859-1,要使用 ContentType 中定义的编码就要设置 connector 的 中的 useBodyEncodingForURI 设置为 true。

13. 不要在 Header 中传递非 ASCII 字符,如果一定要传递的话,我们可以先将这些字符用 org.apache.catalina.util.URLEncoder 编码然后再添加到 Header 中,这样在浏览器到服务器的传递过程中就不会丢失信息了,如果我们要访问这些项时再按照相应的字符集解码就好了。

14. POST 表单的编解码: 通过 HTTP 的 BODY 传递到服务端的。当我们在页面上点击 submit 按钮时浏览器首先将根据 ContentType 的 Charset 编码格式对表单填的参数进行编码然后提交到服务器端,在服务器端同样也是用 ContentType 中字符集进行解码。所以通过 POST 表单提交的参数一般不会出现问题,而且这个字符集编码是我们自己设置的,可以通过 request.setCharacterEncoding(charset) 来设置。

15.HTTP BODY 的编解码:当用户请求的资源已经成功获取后,这些内容将通过 Response 返回给客户端浏览器,这个过程先要经过编码再到浏览器进行解码。这个过程的编解码字符集可以通过 response.setCharacterEncoding 来设置,它将会覆盖 request.getCharacterEncoding 的值,并且通过 Header 的 Content-Type 返回客户端,浏览器接受到返回的 socket 流时将通过 Content-Type 的 charset 来解码,如果返回的 HTTP Header 中 Content-Type 没有设置 charset,那么浏览器将根据 Html 的 中的 charset 来解码。如果也没有定义的话,那么浏览器将使用默认的编码来解码。。该设置和response.setCharacterEncoding("GBK")等效。

/***@authorzhenjing

*

* @date 2013-9-7*/

public classcnCodeTest {public static void toHex(char[] b) {for (int i = 0; i < b.length; i++) {

System.out.printf("%x " , (int)b[i]);

}

System.out.println();

}public static void toHex(byte[] b) {for (int i = 0; i < b.length; i++) {

System.out.printf("%x ", b[i]);

}

System.out.println();

}public static voidencode() {

String name= "I am 中文编码";

toHex(name.toCharArray());try{byte[] iso8859 = name.getBytes("ISO-8859-1");

toHex(iso8859);byte[] gb2312 = name.getBytes("GB2312");

toHex(gb2312);byte[] gbk = name.getBytes("GBK");

toHex(gbk);byte[] utf16 = name.getBytes("UTF-16");

toHex(utf16);byte[] utf8 = name.getBytes("UTF-8");

toHex(utf8);

}catch(Exception e) {

e.printStackTrace();

}

}public static voidmain(String[] args) {

String cn= "中文编码"; //这里存在编码转换: 将文件存储字节转成unicode存入String对象内存. 采用文件编码

char[] charArray =cn.toCharArray();byte[] data =cn.getBytes();

System.out.println("print char array : " +cn);

toHex(cn.toCharArray());

cn= "���ı���"; //这里存在编码转换: 将文件存储字节转成unicode存入String对象内存. 采用文件编码。//显示乱码是由于文件采用的编码无法解码文件存储字节数据。故存到String的unicode也是乱码的

charArray =cn.toCharArray();

System.out.println("print char array: " +cn);

toHex(cn.toCharArray());

encode();

}

}

 

标签:11,编码,12,Java,String,解码,浏览器,cn,toHex
来源: https://www.cnblogs.com/leijia/p/16406609.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有