文本在内存中的编码(3)--String 的转换--乱码探源(6)

摘要: 探讨了 String 到 byte[] 的转换, 并结合之前的 new String 作了综合分析.

先讲个小故事, 虽然跟主题有点不太相关哈:

唐朝诗人李绅, 身为官员, 脾气暴躁, 瞧不起信教的, 尤其鄙视装逼之僧人, 动不动就对他们拳脚相加. 曾扬言: "我可以接见他们, 要能答出来还好, 要是答不出来, 我弄死他!" 有一回一个和尚来跟他宣传因果报应, 李绅问: "阿师从哪里来, 到哪里去呢?" 僧答: "贫僧从来处来, 到去处去." 李绅当时就急了, 撸起袖子, 亮出了手腕: "我去年买了个表!"

来自知乎问答"古人是如何「装逼」的? ", 略有改动.

String 到哪里去?

有了前面僧人的教训, 在这里就不故弄玄虚了, 应该说 String 的去处还是蛮确定的, 那就是到 byte[] 中去, 方式就是通过 getBytes 这一方法.

new String 与 getBytes

如果说 new String(byte[], encoding) 是从 byte[] 到 String 的过程, 那么 getBytes(encoding) 则正好与之相反: 它是从 String 到 byte[] 的过程.

string and getbytes conversion

或许我们应该说: 它从去处来, 又到来处去.

继续阅读

文本在内存中的编码(2)--String 的构造--乱码探源(5)

摘要: 深入探讨了 String 的构造, 编码间的转换以及字节流, 字符流等.

在前面我们探讨了 String 是什么的问题, 现在来看 String 从哪来的问题.

String 从哪里来?

所谓从哪里来也可以看作是 String 的构造问题, 因此我们会从 String 的构造函数说起.

String 的构造函数

在前面我们知道 String 的内部就是 char[], 因此它可以根据一组 char[] 来构建, String 中有这样的构造函数:

public String(char value[]) {}

继续阅读

字符集与编码(六)--getBytes 方法及乱码初步

摘要: 本文主要讲述 string.getBytes() 方法, 分析了系统缺省编码的各种陷阱, 并针对测试中出现的乱码作了初步的分析, 对代码页的概念也进行了介绍.

在前一篇里我们谈了 Unicode 的代码单元及 string.length, 现在接着前面的讨论继续谈 string.getBytes() 方法并对乱码的产生作初步分析.

string.getBytes 方法

首先声明一下, 以下讨论如无特别说明, 均是在 Java 语言环境下. 如果你用的不是 java, 我只能说声抱歉. 但另一方面, 我相信无论是何种语言或平台, 也必然有类似的方法及类似的处理, 而其中的原理也必将是相通的, 当然了, 具体到细节上则可能会有些差异.

继续阅读