编码01

一、字符集

规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系。对应到真实生活中,字符集就是对某种语言的称呼。例如:英语,汉语,日语。
Unicode是为了统一ASCII(仅英文字母)GBK(中文)等而发明的,就是要把地球上所有的语言的符号,都用统一的字符集来表示,一个编码真正做到了唯一。
不过,Unicode只是一个符号集,只规定了符号的 二进制代码,却没有规定这个二进制代码应该如何存储

二、字符编码

对于一个字符集来说要正确编码转码一个字符需要三个关键元素:字库表(character
repertoire)、编码字符集(coded character
set)、字符编码(character
encoding form)。

  1. 字库表:所有的单词,(为了能够涵盖世界上所有的字符)
  2. 编码字符集:单词在字库的哪里,索引id
  3. 字符编码:把序号转换成另外一种存储格式,(真正用的上的字符相对整个字库表来说比例非常低),是字符集的实现方式,因为计算机只能看懂bytes。我们需要一种用bytes来表示Unicode的方法这样才可以存储和传播他们。

UTF-8就是字符编码,变长。UTF-8是Unicode的实现方式之一
i) 好处一是节省流量。
ii) 好处二是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。
iii) UTF-8编码能表示的字符数量远超GBK。

三、 Window笔记本

Windows 记事本里面的4个选项:

  1. ANSI,俗称“默认编码”,不是确定的一种编码,是Windows提出来的一种解决方案,会根据不同的语言版本选择。对于英文文件,是ASCII编码,对于简体中文是GB2312,繁体中文是Big5,日文是JIS
  2. Unicode, 这个选项用的是little endian
  3. Unicode big endian
  4. UTF-8

四、JAVA的内部编码

既然计算机在内存中统一使用的是unicode编码,JAVA自然也是如此了。
Java 内部处理字符使用的字序方式是 Unicode,这是一种通行全球的编码方式。 Unicode 另有一种储存或传输的格式,叫做 UTF-8。UTF-8 的格式在编码英文时,只需要 8 位,但是中文则是 24 位,所以中文字出现比例高的地方还是使用 UTF-16 比较节省空间。Java 的 Class File(也就是 bytecode)中有一字段叫做常数区(Constant Pool),一律使用 UTF-8 为字符编码。

五、 JAVA 的I/O 编码

虽然 Java 内部完整地使用 Unicode,但是你所使用的操作系统可不见得。
Java 现行的 IO 一律使用 Stream 的方式,相关的类别都放在 java.io 中。
输出 binary 的使用 OutputStream 的子类别,输入 binary 的资料使用 InputStream 的子类别;
输出文字的使用 Writer 的子类别,输入文字的资料使用 Reader 的子类别。

  1. InputStream/OutputStream 与 Reader/Writer的区别
    InputStream/OutputStream 会原封不动地传送资料,但是Reader/Writer 会将资料当作文字对待,所以 Reader/Writer 在「必要时」会把(文字)资料转码(会根据操作系统的默认编码方式进行转码)。
  2. 什么时候转码?
    Java 的 Stream(包括 Reader 和 Writer)是可以互相串接的。当 Reader 的资料来源是另一个 Reader 时,不转码,当 Reader 的资料来源是一个 InputStream 时,就会转码。当 Writer 的资料去处是另一个 Writer 时,不转码,当 Writer 的资料去处是一个 OutputStream 时,就会转码。
  3. 由什么码转成什么码?
    这是可以指定的。
    因为转码只发生在 Reader/InputStream 的交界处与 Writer/OutputStream 的交界处,所以正是由 InputStreamReader 和 OutputStreamWriter 此二类别负责,下面两个 constructor 的第二个参数,正是用来指定转码的方式。
    new InputStreamReader(new FileInputStream(inputFilePath), encoding)
    如果你清楚地知道你要读写的档案(或资料来源 / 去处)是采用某种编码方式,你也可以主动指定编码方式。但是,请记得抓取可能导致的 UnsupportedEncodingException,并务必处理之,不可对此例外置之不理,因为该 JRE 有可能没有附上此种编码表(也有可能你的编码名称给错)。
  4. 保持现场 ,保持资料的完整性
    如果你不知道你的 I/O 资料来源或去处是用何种编码方式,那么你最好不要用 Reader 和 Writer,而应该直接用 InputStream 和 OutputStream,因为与其被 Reader 和 Writer 胡乱编码之后造成信息遗失或错乱,不如保持资料的完整不变,留待以后进一步解读。
  5. 建议
    在我们的应用程序中涉及到 I/O 操作时只要注意指定统一的编解码 Charset 字符集,一般不会出现乱码问题,有些应用程序如果不注意指定字符编码,中文环境中取操作系统默认编码,如果编解码都在中文环境中,通常也没问题,但是还是强烈的不建议使用操作系统的默认编码,因为这样,你的应用程序的编码格式就和运行环境绑定起来了,在跨环境下很可能出现乱码问题。

六、 内存操作中的编码

Java中,String 类就提供转换到字节的方法,也支持将字节转换为字符串的构造函数。
Charset 提供 encode 与 decode 分别对应 char[] 到 byte[] 的编码和 byte[] 到 char[] 的解码。
参考: http://blog.csdn.net/mazhimazh/article/details/19327421
把一个字符串“中”赋给 String 类的一个对象 str,这个字符串“中”是按照操作系统默认编码方式进行编码,在中文 windows 系统中通常是“GBK”,“中”在GBK编码中是0xD6D0,在将该字符赋给str时,Java会对该字符串进行编码转换,即将GBK编码方式的“中”转换成Unicode编码方式的“中”,Unicode编码方式“中”的编码是0x4E2D,所以str在程序运行期间在内存中的二进制表示成16进制就是0x4E2D。

七、 造成MySQL乱码的一个原因

  1. 存入和取出时对应环节的编码不一致
    我们把存入阶段的三次编解码使用的字符集编号为C1,C2,C3;取出时的三个字符集依次编号为C1’,C2’,C3’。那么存入的时候bash C1用的是UTF-8编码,取出的时候,C1'我们却使用了windows终端(默认是GBK编码),那么结果几乎一定是乱码。又或者存入MySQL的时候set names utf8(C2),而取出的时候却使用了set names gbk(C2'),那么结果也必然是乱码
  2. 单个流程中三步的编码不一致
    即上面任意一个流程同一方向的三步中,只要两步或者两部以上的编码有不一致就有可能出现编解码错误。如果差异的两个字符集之间无法进行无损编码转换,那么就一定会出现乱码。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换...
    x360阅读 2,396评论 1 20
  • 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是...
    艾小天儿阅读 17,051评论 0 2
  • 其实,以我跟老二这种互称“人中龙凤”的关系,是不好意思谈及对彼此隐秘的感情的。之所以现在写出来,一是因为,我写了,...
    桃球蛋阅读 148评论 0 0
  • 匆匆忙忙,理财学习100天就结束了。从一个理财小白,到现在入门。自问这一百天没有全力以赴、尤其是年后的后半段,也许...
    juice_张阅读 158评论 0 0
  • 1.循环的嵌套 2.数组:一组数据类型相同的数据的集合 数组的创建有三种方式: (1)int[] a = {1,2...
    红颜心雨阅读 106评论 0 0