`

关于编码的详细分析(转载)

    博客分类:
  • java
阅读更多

编码无处不在。Database, file, editor, IDE, compiler, browser。
代码(比如java, jsp, asp, php, python, ruby etc)里面的字符串比较麻烦,涉及到editor, compiler, interpreter等等。
所以,我的做法是,从来不在代码里面直接写字符串资源,尤其是双字节编码的字符串资源。
都是把字符串资源分离到一个单独的资源文件里面。这样,只需要照管这个文件的编码就够了。
需要注意的一点是,文件里面、数据库里面、网络传输需要的数据,都是byte[]。
以下的讨论,不涉及代码里面的字符串编码问题。只讨论系统运行起来之后,各部分之间的编码问题。

 

先说Java。
关于编码转换

JVM里面的任何字符串资源都是Unicode,就是说,任何String类型的数据都是Unicode编码。没有例外。既然只有一种编码,那么,我们可以这么说,JVM里面的String是不带编码的。String相当于 char[]。
JVM里面的 byte[] 数据是带编码的。比如,Big5,GBK,GB2312,UTF-8之类的。
一个GBK编码的byte[] 转换成 String,其实就是从GBK编码向Unicode编码转换。
一个String转换成一个Big5编码的byte[],其实就是从Unicode编码向Big5编码转换。
所以,Unicode是所有编码转换的中间介质。所有的编码都有一个转换器可以转换到Unicode,而Unicode也可以转换到其他所有的编码。这样构成了一个总线结构。
比如,如果总共有10种编码,那么只需要 10 + 10 = 20个转换器就够了。如果要是两两直接转换,那么,需要的转换器数量是一个组合数字,需要90个转换器。

一个系统的不同部分,都有自己的编码。比如,数据库,文件,JVM,浏览器这4个部分。
在这些部分之间数据交换的地方,就会出现编码问题。比如,数据库和JVM之间,文件和JVM之间,浏览器和JVM之间。这些问题的原理都是相通的。

编码问题最容易处理的地方是文件和JVM之间。文件IO API带有encoding 参数,请自行查阅。
最不容易出现编码问题的地方是数据库和JVM之间。这应该是数据库JDBC连接的基本功能。本文不专门进行讨论。
最容易出问题的地方是浏览器和服务器JVM之间(其实,代码里面的字符串更容易出问题,不过,我已经事先声明,本文不讨论代码中的字符串编码)。下面主要讨论这块浏览器和服务器JVM之间的编码问题。

我们把浏览器编码叫做 Browser_Charset,把JVM编码叫做JVM_Charset(通常等于服务器系统编码)。
当浏览器的数据过来的时候,是一个带有Browser_Charset的byte[]。
如果用户处理程序需要一个String类型的数据,那么JVM会好心好意地把这个byte[]转换成String。使用的转换器是 JVM_Charset -> Unicode。
注意,如果这个时候,Browser_Charset 和 JVM_Charset并不相等。那么,这个自动转换是错误的。
为了弥补这个错误。我们需要做两步工作。
(1) Unicode -> JVM_Charset,把这个String 转换回到原来的 byte[]。
(2) Browser_Charset -> Unicode,把这个还原的byte[]转换成 String。

这个效果,和直接从HTTP Request取得byte[],然后执行 (2) Browser_Charset -> Unicode 的效果是一样的。

如果在Request里面设置了CharacterEncoding,那么POST Data参数就不需要自己手工转换了,web server的自动转换就是正确的。URL的参数编码还涉及到URL编码,需要考虑的问题多一些,没有这么简单。

JVM把数据发到浏览器的时候。也需要考虑编码问题。可以在Response里面设置。另外,HTML Meta Header里面也可以设置编码,提醒Browser选择正确编码。

有些语言的VM或者解释器的字符串编码可能不同。比如,Ruby。不过,编码转换原理都是一样的。

分享到:
评论

相关推荐

    STM32F103C8T6驱动旋转编码器模块

    增量式编码器:因为通过检测脉冲的数量和方向来确定旋转的角度和方向。每个脉冲代表一个固定的角度变化,通常有A相和B相两个信号输出,可以通过脉冲的相位差来确定旋转方向。 所以我就先直接拿逻辑分析仪测试了一下...

    深入分析 Java I/O 的工作机制(转载)

    以下是对Java I/O机制的详细分析: 1. **I/O 流的概念** Java中的I/O操作基于流的概念,流是数据的有序传输通道。Java将所有的I/O操作抽象为流对象,分为字节流和字符流两大类。字节流处理单个字节的数据,如...

    dsp课件(转载)

    下面将详细阐述DSP的基础知识以及可能在课程中涵盖的内容。 1. **数字信号与模拟信号的区别** 数字信号处理是将连续的模拟信号转换为离散的数字信号进行处理,以提高精度、抗干扰能力和计算效率。与模拟信号相比,...

    视频监控源码(转载)

    本文将基于提供的"视频监控源码(转载)"进行深入探讨,分析相关知识点。 首先,视频监控系统的核心在于图像采集、传输、存储和分析。源码中可能包含以下几个关键部分: 1. 图像采集:这部分通常涉及摄像头驱动程序...

    (转载)关于分辨率,还是没搞清楚

    标题 "(转载)关于分辨率,还是没搞清楚" 暗示了这篇博客可能讨论的是计算机显示技术中的分辨率概念,以及可能存在的误解。在IT领域,分辨率是衡量图像清晰度的关键指标,通常以宽度和高度的像素数表示,如1920x...

    dz编码规范(PHP)

    未经许可,禁止传播、转载和发表 **作者:** 戴志康、王海波 **最后更新日期:** 2006年2月26日 #### 2. 适用范围 如无特殊说明,以下规则要求完全适用于Discuz!项目,同时也适用于Comsenz旗下其他PHP项目。 ##...

    华为技术有限公司C语言编程规范

    为提高产品代码质量,指导广大软件开发人员编写出简洁、可维护、可靠、可测试、高效、可移植的代码,编程规范修订工作组分析、总结了我司的各种典型编码问题,并参考了业界编程规范近年来的成果,重新对我司1999年版...

    ArcEngine开发集锦

    26. C#编码标准--编码习惯 80 27. 基于AE删除选择的要素- - 96 28. 基于AO/AE获取要素信息 97 29. ArcEngine中拓扑的使用- - 100 30. ArcEngine 渲染的使用 103 31. 利用ArcEngin进行空间分析的简单应用- - 110 32...

    [转载]迭代算法 1.0

    4. 数据压缩:迭代算法在编码和解码过程中发挥重要作用,例如霍夫曼编码就是迭代构建最优编码树的过程。 5. 操作系统调度:如Linux中的CFS( Completely Fair Scheduler)调度器,使用红黑树和时间片的迭代更新来...

    arcgis开发集锦

    26. C#编码标准--编码习惯 80 27. 基于AE删除选择的要素- - 96 28. 基于AO/AE获取要素信息 97 29. ArcEngine中拓扑的使用- - 100 30. ArcEngine 渲染的使用 103 31. 利用ArcEngin进行空间分析的简单应用- - 110 32...

    【RPA之家转载视频教程3】将安全字符串转换为字符串--UIPath.rar

    在RPA中,我们可能需要将这些安全字符串还原为可读形式,以便进行进一步的处理或分析。这个过程涉及到密码学和编码理论的知识,但UIPath提供了一些内置的功能来简化这个任务。 首先,视频教程可能会介绍UIPath中的...

    dtree 例子 转载的

    在给定的标题和描述中,“dtree 例子”被反复提及,这暗示我们将要探讨的是关于如何使用决策树的实例。虽然没有提供具体的代码示例,但我们可以基于一般的决策树实现过程来解析这个概念。 首先,我们理解决策树的...

    转载 纯nasm实现中文操作系统.txt

    根据提供的文件信息,本文将对纯NASM实现中文操作系统的核心技术点进行详细的解析与总结。 ### 一、项目概述 该文件描述了一个基于NASM汇编语言开发的中文操作系统的初步实现。NASM (Netwide Assembler) 是一个...

    ArcMap使用手册.pdf

    本文将详细解读文件中提及的ArcMap使用手册的内容,包括其可视化信息、空间分析、开发制图应用和GIS应用技巧等方面的知识点。 1. 可视化信息 可视化信息是GIS的核心功能之一,通过ArcMap,用户可以直观地展示地理...

    转载的简单的网络验证源码

    以下是一些关于网络验证的核心概念和关键技术: 1. **HTTP身份验证**:基于HTTP协议的身份验证,包括基本认证(Basic Authentication)和摘要认证(Digest Authentication)。基本认证将用户名和密码以Base64编码的...

    一个设计文档的模版!!

    文档开头通常会包含版权信息,防止未经授权的复制和转载。 2. **文档更新记录**:记录文档的各个版本及其变更,便于跟踪文档的演化过程。每个版本的说明应包括完成日期、修改人以及修改内容的简述。 3. **概述**:...

    WCF 分布式开发转载

    4. **绑定**: 绑定定义了服务如何与外界通信,包括传输协议、编码格式等。例如,`HttpBinding`允许通过HTTP进行通信。 5. **终结点**: 终结点是服务暴露给外部世界的具体地址,包含地址、绑定和合同信息。 **二、...

    c#面试题 网络转载 不错 经典

    从给定的文件标题、描述、标签以及部分内容中,我们可以推断出这是一份关于C#编程语言的面试题目集合,旨在帮助准备面试的人们熟悉C#中的关键概念和技术。以下是从这些信息中提取和扩展的相关知识点: ### C#中的...

    ISO软件工程模板(6)概要设计说明书-转载

    这份概要设计说明书是软件开发过程中的关键文档,它为项目的后续详细设计、编码和测试提供了清晰的蓝图,有助于提高开发效率和软件质量。通过遵循这样的模板,开发团队可以确保所有方面都得到了充分考虑,降低潜在...

Global site tag (gtag.js) - Google Analytics