- 浏览: 113647 次
- 性别:
- 来自: 北京
文章分类
最新评论
编码无处不在。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。不过,编码转换原理都是一样的。
发表评论
-
was 8.5环境生成heapdump文件
2016-09-26 10:03 14931、我在/etc/profile里面增加参数: expor ... -
BTrace实际案例分析(转)
2016-03-28 17:09 550BTrace实际案例分析 问题表象 问题描 ... -
BTrace试用
2016-03-28 16:35 1399说明: BTrace是Java进程诊断分析工具,优点是无 ... -
XML节点当做文本处理
2014-10-31 08:45 703XmlHelper类中封装的方法,采用JDOM实现。 ... -
采用JDK自带的类库解析XML(转)
2014-07-01 16:43 39031,需求说明假设要查询一个图书列表,寻找TEST的著作. 2 ... -
玩转 XPath 和缺省命名空间(Default Namespaces)(转)
2014-07-01 16:38 2739诸如“为什么用 XPath 的表达式进行查询,却没有返回所期 ... -
java远程通讯协议对比(转载)
2013-12-25 11:04 1365在分布式服务框架中, ... -
java SPI机制(转)
2013-12-18 08:03 765From ServiceLoader javadoc: A ... -
java编码问题汇总(转载)
2013-12-05 09:20 484工作中经常遇到java编码问题,由于缺乏研究,总是无法给出 ... -
和Lambdas的第一次亲密接触(转载)
2013-05-21 11:18 863英文原文:Java 8: The First Tas ... -
获得javacore和dump文件
2013-02-01 17:31 1451linux环境下,尝试了如下方法获得javacore文件, ... -
采用jca分析javacore文件示例
2012-06-13 10:09 9095今天帮助项目组分析websphere 7下的线程挂起问题,现象 ... -
查看java class的编译版本
2012-03-31 15:38 990使用 UE 打开 class 文件,第一行内容:0000000 ... -
集群环境下的单例任务调度基类
2012-02-23 15:37 1419最近为公司框架提供了基于ID的单例的任务调度基类,用于集群的 ... -
JDK 1.5自带的几个小工具
2012-02-23 15:24 1080提供了jps,jmap,jconsole,jstat几个比较实 ... -
使用IBM heapAnalyzer分析内存泄露的原因(转载)
2012-02-23 15:21 3657大家在开发J2EE应用时可能经常碰到OOM的问题。出现这种问题 ... -
关于XML对特殊字符的编码
2012-02-23 15:13 1129项目中遇到这类问题,比如“优褅股份”,采用GBK编码可以,如果 ... -
sys_uuid()导致oracle的session缓慢增长
2012-02-09 10:19 1505最近负责的数据交换平 ... -
NIO技术
2011-12-20 11:12 725复习了一下 nio 技术,发现了一个不错的专题,留个记号: ... -
常用concurrent包下的类图
2011-11-15 16:07 1708摘自:http://www.blogjava.net/xyl ...
相关推荐
增量式编码器:因为通过检测脉冲的数量和方向来确定旋转的角度和方向。每个脉冲代表一个固定的角度变化,通常有A相和B相两个信号输出,可以通过脉冲的相位差来确定旋转方向。 所以我就先直接拿逻辑分析仪测试了一下...
以下是对Java I/O机制的详细分析: 1. **I/O 流的概念** Java中的I/O操作基于流的概念,流是数据的有序传输通道。Java将所有的I/O操作抽象为流对象,分为字节流和字符流两大类。字节流处理单个字节的数据,如...
下面将详细阐述DSP的基础知识以及可能在课程中涵盖的内容。 1. **数字信号与模拟信号的区别** 数字信号处理是将连续的模拟信号转换为离散的数字信号进行处理,以提高精度、抗干扰能力和计算效率。与模拟信号相比,...
本文将基于提供的"视频监控源码(转载)"进行深入探讨,分析相关知识点。 首先,视频监控系统的核心在于图像采集、传输、存储和分析。源码中可能包含以下几个关键部分: 1. 图像采集:这部分通常涉及摄像头驱动程序...
标题 "(转载)关于分辨率,还是没搞清楚" 暗示了这篇博客可能讨论的是计算机显示技术中的分辨率概念,以及可能存在的误解。在IT领域,分辨率是衡量图像清晰度的关键指标,通常以宽度和高度的像素数表示,如1920x...
未经许可,禁止传播、转载和发表 **作者:** 戴志康、王海波 **最后更新日期:** 2006年2月26日 #### 2. 适用范围 如无特殊说明,以下规则要求完全适用于Discuz!项目,同时也适用于Comsenz旗下其他PHP项目。 ##...
为提高产品代码质量,指导广大软件开发人员编写出简洁、可维护、可靠、可测试、高效、可移植的代码,编程规范修订工作组分析、总结了我司的各种典型编码问题,并参考了业界编程规范近年来的成果,重新对我司1999年版...
26. C#编码标准--编码习惯 80 27. 基于AE删除选择的要素- - 96 28. 基于AO/AE获取要素信息 97 29. ArcEngine中拓扑的使用- - 100 30. ArcEngine 渲染的使用 103 31. 利用ArcEngin进行空间分析的简单应用- - 110 32...
4. 数据压缩:迭代算法在编码和解码过程中发挥重要作用,例如霍夫曼编码就是迭代构建最优编码树的过程。 5. 操作系统调度:如Linux中的CFS( Completely Fair Scheduler)调度器,使用红黑树和时间片的迭代更新来...
26. C#编码标准--编码习惯 80 27. 基于AE删除选择的要素- - 96 28. 基于AO/AE获取要素信息 97 29. ArcEngine中拓扑的使用- - 100 30. ArcEngine 渲染的使用 103 31. 利用ArcEngin进行空间分析的简单应用- - 110 32...
在RPA中,我们可能需要将这些安全字符串还原为可读形式,以便进行进一步的处理或分析。这个过程涉及到密码学和编码理论的知识,但UIPath提供了一些内置的功能来简化这个任务。 首先,视频教程可能会介绍UIPath中的...
在给定的标题和描述中,“dtree 例子”被反复提及,这暗示我们将要探讨的是关于如何使用决策树的实例。虽然没有提供具体的代码示例,但我们可以基于一般的决策树实现过程来解析这个概念。 首先,我们理解决策树的...
根据提供的文件信息,本文将对纯NASM实现中文操作系统的核心技术点进行详细的解析与总结。 ### 一、项目概述 该文件描述了一个基于NASM汇编语言开发的中文操作系统的初步实现。NASM (Netwide Assembler) 是一个...
本文将详细解读文件中提及的ArcMap使用手册的内容,包括其可视化信息、空间分析、开发制图应用和GIS应用技巧等方面的知识点。 1. 可视化信息 可视化信息是GIS的核心功能之一,通过ArcMap,用户可以直观地展示地理...
以下是一些关于网络验证的核心概念和关键技术: 1. **HTTP身份验证**:基于HTTP协议的身份验证,包括基本认证(Basic Authentication)和摘要认证(Digest Authentication)。基本认证将用户名和密码以Base64编码的...
文档开头通常会包含版权信息,防止未经授权的复制和转载。 2. **文档更新记录**:记录文档的各个版本及其变更,便于跟踪文档的演化过程。每个版本的说明应包括完成日期、修改人以及修改内容的简述。 3. **概述**:...
4. **绑定**: 绑定定义了服务如何与外界通信,包括传输协议、编码格式等。例如,`HttpBinding`允许通过HTTP进行通信。 5. **终结点**: 终结点是服务暴露给外部世界的具体地址,包含地址、绑定和合同信息。 **二、...
从给定的文件标题、描述、标签以及部分内容中,我们可以推断出这是一份关于C#编程语言的面试题目集合,旨在帮助准备面试的人们熟悉C#中的关键概念和技术。以下是从这些信息中提取和扩展的相关知识点: ### C#中的...
这份概要设计说明书是软件开发过程中的关键文档,它为项目的后续详细设计、编码和测试提供了清晰的蓝图,有助于提高开发效率和软件质量。通过遵循这样的模板,开发团队可以确保所有方面都得到了充分考虑,降低潜在...