Java编程中的编码问题、Java中的中文编码问题

作者:小菜 更新时间:2025-02-27 点击数:
简介:前往java软件专题 1.只有字符到字节或者字节到字符的转换才存在编码转码;2.Java String 采用 UTF-16 编码方式存储所有字符。

unicod

【菜科解读】

前往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(StringcharsetName) 可实现编码转换。

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 来解码。

如果也没有定义的话,那么浏览器将使用默认的编码来解码。

%@ page contentType="text/html; charset= GBK" %>。

该设置和response.setCharacterEncoding("GBK")等效。

示例代码

/** * @author zhenjing * @date 2013-9-7public class cnCodeTest { public static void toHex(char[] b) { for (int i = 0; i 几种常见的编码格式

为什么要编码

不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言。

由于人类的语言有太多,因而表示这些语言的符号太多,无法用计算机中一个基本的存储单元—— byte 来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解。

我们可以把计算机能够理解的语言假定为英语,其它语言要能够在计算机中使用必须经过一次翻译,把它翻译成英语。

这个翻译的过程就是编码。

所以可以想象只要不是说英语的国家要能够使用计算机就必须要经过编码。

这看起来有些霸道,但是这就是现状,这也和我们国家现在在大力推广汉语一样,希望其它国家都会说汉语,以后其它的语言都翻译成汉语,我们可以把计算机中存储信息的最小单位改成汉字,这样我们就不存在编码问题了。

所以总的来说,编码的原因可以总结为:

计算机中存储信息的最小单元是一个字节即 8 个 bit,所以能表示的字符范围是 0~255 个

人类要表示的符号太多,无法用一个字节来完全表示

要解决这个矛盾必须需要一个新的数据结构 char,从 char 到 byte 必须编码

如何“翻译”

明白了各种语言需要交流,经过翻译是必要的,那又如何来翻译呢?计算中提拱了多种翻译方式,常见的有 ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16 等。

它们都可以被看作为字典,它们规定了转化的规则,按照这个规则就可以让计算机正确的表示我们的字符。

目前的编码格式很多,例如 GB2312、GBK、UTF-8、UTF-16 这几种格式都可以表示一个汉字,那我们到底选择哪种编码格式来存储汉字呢?这就要考虑到其它因素了,是存储空间重要还是编码的效率重要。

根据这些因素来正确选择编码格式,下面简要介绍一下这几种编码格式。

ASCII 码

学过计算机的人都知道 ASCII 码,总共有 128 个,用一个字节的低 7 位表示,0~31 是控制字符如换行回车删除等;32~126 是打印字符,可以通过键盘输入并且能够显示出来。

ISO-8859-1

128 个字符显然是不够用的,于是 ISO 组织在 ASCII 码基础上又制定了一些列标准用来扩展 ASCII 编码,它们是 ISO-8859-1~ISO-8859-15,其中 ISO-8859-1 涵盖了大多数西欧语言字符,所有应用的最广泛。

ISO-8859-1 仍然是单字节编码,它总共能表示 256 个字符。

GB2312

它的全称是《信息交换用汉字编码字符集 基本集》,它是双字节编码,总的编码范围是 A1-F7,其中从 A1-A9 是符号区,总共包含 682 个符号,从 B0-F7 是汉字区,包含 6763 个汉字。

GBK

全称叫《汉字内码扩展规范》,是国家技术监督局为 windows95 所制定的新的汉字内码规范,它的出现是为了扩展 GB2312,加入更多的汉字,它的编码范围是 8140~FEFE(去掉 XX7F)总共有 23940 个码位,它能表示 21003 个汉字,它的编码是和 GB2312 兼容的,也就是说用 GB2312 编码的汉字可以用 GBK 来解码,并且不会有乱码。

GB18030

全称是《信息交换用汉字编码字符集》,是我国的强制标准,它可能是单字节、双字节或者四字节编码,它的编码与 GB2312 编码兼容,这个虽然是国家标准,但是实际应用系统中使用的并不广泛。

UTF-16

说到 UTF 必须要提到 Unicode(Universal Code 统一码),ISO 试图想创建一个全新的超语言字典,世界上所有的语言都可以通过这本字典来相互翻译。

可想而知这个字典是多么的复杂,关于 Unicode 的详细规范可以参考相应文档。

Unicode 是 Java 和 XML 的基础,下面详细介绍 Unicode 在计算机中的存储形式。

UTF-16 具体定义了 Unicode 字符在计算机中存取方法。

UTF-16 用两个字节来表示 Unicode 转化格式,这个是定长的表示方法,不论什么字符都可以用两个字节表示,两个字节是 16 个 bit,所以叫 UTF-16。

UTF-16 表示字符非常方便,每两个字节表示一个字符,这个在字符串操作时就大大简化了操作,这也是 Java 以 UTF-16 作为内存的字符存储格式的一个很重要的原因。

UTF-8

UTF-16 统一采用两个字节表示一个字符,虽然在表示上非常简单方便,但是也有其缺点,有很大一部分字符用一个字节就可以表示的现在要两个字节表示,存储空间放大了一倍,在现在的网络带宽还非常有限的今天,这样会增大网络传输的流量,而且也没必要。

而 UTF-8 采用了一种变长技术,每个编码区域有不同的字码长度。

不同类型的字符可以是由 1~6 个字节组成。

UTF-8 有以下编码规则:

如果一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 - 7F)。

可见,所有 ASCII 编码已经是 UTF-8 了。

如果一个字节,以 11 开头,连续的 1 的个数暗示这个字符的字节数,例如:110xxxxx 代表它是双字节 UTF-8 字符的首字节。

如果一个字节,以 10 开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节

Java,编程,中的,编码,问题,、,中文,前往,java,

暗物质的作用是什么,解决大爆炸理论中的不自洽性

相信对于天文学比较好奇的朋友们都知道暗物质,暗物质是什么呢?简单来说就是宇宙中人们看不见的一种物质,也有人说是科学家们设想出来为了“填坑”的,因为暗物质捕鱼电磁产生作用,那么暗物质的作用是什么呢?一、暗物质是什么要想了解暗物质的作用的话,首先还是要来了解一下暗物质是什么,要了解暗物质,需要先从宇宙说起。

宇宙是由什么组成的?你可能会想到星球、尘埃以及广阔无垠的空间。

但是这些只是人类对于宇宙组成所理解的一小部分,我们可以从三个部分来概括宇宙的组成部分:正常物质,暗物质,还有暗能量。

正常物质只占宇宙所有能量的4%,暗物质占26%,而余下的70%左右的宇宙能量则都是暗能量。

虽然暗物质在整体宇宙能量中所占的比重很大,但现在却还不知道它由什么组成,未知大于已知。

正常的物质,包括了中子、质子、电子、中微子以及其他粒子。

而暗物质,只知道它是一种新的、不发光、不在人们现在所理解范畴内的物质。

比起宇宙全景图还要更为神奇,暗物质的作用又是什么呢?二、暗物质的作用暗物质的作用是什么呢?暗物质的存在可以解决大爆炸理论中的不自洽性,对结构形成也非常地关键。

暗物质很有可能是一种 或几种粒子物理标准模型以外的新粒子所构成。

对暗物质 和暗能量的研究是现代宇宙学和粒子物理的主要课题。

简单来说,暗物质就是科学家设想的用来填坑的,填的是许多无法解释的天文现象。

1933年瑞士物理学家弗里茨-兹威基 Fritz Zwichy区别用两种方法来计算后发座宇宙岛团 距离太阳系大约3.2亿光年的质量,一是“根据各宇宙岛运动速度来计算其质量”,二是“根据各宇宙岛内的太阳亮度来计算其质量”。

但前者所得质量是后者的400倍。

为解释这一矛盾,他提出宇宙岛中存在“无法看到的质量”。

而这个质量就是暗物质的质量。

海洋中的恐怖物种,看看你有没有见到过?

神奇的海洋中,恐怖物种有许多海洋当作地球占据面积最多的地方,对于人类来说是非常神奇的,毕竟有大多数的人都是没有见过海洋。

其中还要最深的地方可以达到1万多米。

就是我们用人类的力量去不到的家园,在这个海洋家园当中有着很多强悍的物种,那我们来看一看有哪些是我们在平时生活当中根本见不到的强悍物种。

海洋中的隐形物种在海洋当中有着一种隐形的物种,它的浑身都是透明的,要是在海水当中不仔细看,肯定是发现不了。

这种物种的名字叫12,它的外形就像是一片柳树叶儿一样。

不管是身体还是里面的骨头都是透明的,只有眼睛的部分有一点发黑,在没有光线的时候,柳叶鳗根本看不到,在有一点光线的时候,柳叶鳗就像是一条丝带一样,这在海洋当中扭动。

柳叶鳗的捕食能力柳叶鳗长成这样可以大大幸免他们被其他动物给捕食。

而且他们也可以更好的隐藏自己,他们平时都是欢欢躲藏在水下休息,然后再到了夜晚的时候,一旦遇到一些小鱼小虾在他们面前经过,他就会毫不犹豫的张口直接吃掉,而这些被吃掉的小鱼小虾进入到他们身体之后也是会变成透明,而在柳叶鳗长得越来越大之后,他身体里面的黑色素也越来越多,逐渐就会变成黑色的样子。

并不是,永远都是透明。

柳叶鳗的营养价值柳叶鳗别看他们是生活在深海当中,可是也没有能够躲过被人类捕捞的命运,柳叶鳗有着很丰富的营养价值,不过因为捕捞难度比较高,价格也比较高,导致市场并不是巨大。

加入收藏
               

Java编程中的编码问题、Java中的中文编码问题

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录