非 BMP 字符判断及判断字符串中是否包含非 BMP 字符

判断一个字符是 BMP 字符还是非 BMP 字符(增补字符),以及判断字符串中是否包含非 BMP 字符。

在 Java 中,要判断一个字符是否为增补字符,也即所谓的非 BMP 字符,可以综合使用 String 类中的 codePointAt 和 Character 类中的 isSupplementaryCodePoint 方法,具体如下:
继续阅读“非 BMP 字符判断及判断字符串中是否包含非 BMP 字符”

Java 语言中一个字符占几个字节?

一个字符占几个字节?很多人喜欢问这个问题,遗憾的是他们没有意识到这其实是一个糟糕的问题,因为它缺乏了必要的前提……

这是一个来自知乎上的问题,https://www.zhihu.com/question/27562173,提问者问:

Java中理论说是一个字符(汉字 字母)占用两个字节。
但是在UTF-8的时候 new String(“字”).getBytes().length 返回的是3 表示3个字节

小白求回答。。

继续阅读“Java 语言中一个字符占几个字节?”

文本在内存中的编码(3)——乱码探源(6)

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

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

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

来自知乎问答“古人是如何「装逼」的?”,略有改动。
继续阅读“文本在内存中的编码(3)——乱码探源(6)”

文本在内存中的编码(2)——乱码探源(5)

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

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

继续阅读“文本在内存中的编码(2)——乱码探源(5)”

文本在内存中的编码(1)——乱码探源(4)

摘要:文本在内存中的编码以及 String 类型的本质。

让我们从一个故事开始说起。话说北大是很有哲学传统的,当你准备踏进北大校门时,连门卫都会连问你三个终极哲学问题:

你是谁?你从哪里来?你要到哪里去?

那么这与我们的问题又有何关系呢?我觉得理解内存中的编码的关键在于理解 String 类型,因此我们也来探讨一下 String 的前世今生:String 是谁(什么)?String 从哪里来?String 到哪里去?

当我们能够清晰地回答这三个终极问题时,对文本在内存中的编码也算理解得差不多了。

继续阅读“文本在内存中的编码(1)——乱码探源(4)”

引入编码信息的一些实践——乱码探源(3)

摘要:介绍了两种引入编码信息的实践,变相引入及外部指定。

前面说到,文本文件中没有编码信息,导致了各种混乱,那么,最关键的就是要指定好所用的编码信息。具体地讲,有以下一些途径。

继续阅读“引入编码信息的一些实践——乱码探源(3)”

确定文本文件的编码——乱码探源(2)

摘要:介绍了如何去确定一个文本文件所使用的编码,特别地以记事本保存“联通”为例进行了深入分析。

在上一篇中,探讨了文件名编码以及非文本文件中的文本内容的编码,在这里,将介绍更为重要的文本文件的编码。

继续阅读“确定文本文件的编码——乱码探源(2)”

文件,文本文件以及编码——乱码探源(1)

摘要:介绍了文件名在操作系统中的编码,以及一些非文本文件中的文本内容所用的编码。

在前面的字符集编码系列中,已经探讨了几大主要的字符集编码。在此基础之上,这里将进一步探讨编码的应用及乱码的根源,我们先从基本的文件说起。

继续阅读“文件,文本文件以及编码——乱码探源(1)”

字符集与编码(九)——GB2312,GBK,GB18030

摘要:关于 GB2312,GBK,GB18030 编码的一些介绍,还有区位码,国标码,机内码间的转换关系。

前面的一些篇章更多谈论了 Unicode 的相关话题,虽然也有提到 GBK 等编码,但都没细说,这里打算系统说一下。GB 系列包括 GB2312,GBK,GB18030。

继续阅读“字符集与编码(九)——GB2312,GBK,GB18030”

字符集与编码(八)——ASCII 和 ISO-8859-1

摘要:简单介绍了 ASCII 和 ISO-8859-1 两个常见的字符集(编码)。

在前面其实也谈到了 ASCII 了,但并没有很具体,作为一个完整系列的一部分,还是有必要谈一下,也作为后面讨论的一些基础。

继续阅读“字符集与编码(八)——ASCII 和 ISO-8859-1”