Java 字节流与字符流(1)

Java 的 IO 系统是比较庞杂的,各种流特别多,其中有一种就是字符流。

在本系列前面的一些文章中,也曾涉及过字符流的话题,不过没有详细展开讨论,这次准备具体综合地谈一谈。

你可能听过不少关于字节流与字符流对比的介绍,不过严格地说,我认为把“字节流”和“字符流”去对比这种说法不是特别妥当,为什么呢?

继续阅读“Java 字节流与字符流(1)”

网页中的编码与乱码(5)

深入探讨了缺省情况下浏览器的响应行为,包括静态和动态的响应,最后,对所有情况作了一个简单总结。

在上一篇我们谈论了 BOM 编码的页面,并知道了它是有最高优先级的。而这一篇将讨论最后的一个主题,也就是缺省的情况。既然名为缺省,也就不难想到,它的优先级是最低的,也即是在其它情况下都无法确定编码时,才轮到它上场。

继续阅读“网页中的编码与乱码(5)”

网页中的编码与乱码(4)

深入介绍了 html 页面使用 BOM 编码的情况,它的优先级为什么最高以及具体的静态页面和动态响应的测试示例。

这一篇将介绍 BOM 在 html 页面编码中的运用。在最前面曾提到,它的优先级实际上是最高的,在这里,将具体介绍什么是 BOM,还会解析为什么它的优先级最高,然后还会构建一些具体的测试来验证这一点。

继续阅读“网页中的编码与乱码(4)”

网页中的编码与乱码(3)

深入介绍了响应头 Response Headers 中的 Content-Type 中的 charset 信息的应用,包括许多在静态文档和动态文档中的实验与测试的细节,以及一些具体配置和与文档内编码声明的优先级问题。

在上一篇说完了如何通过文档内的编码声明来确定网页的编码通过文档内的编码声明来确定网页的编码,这一篇则开始具体讲述如何通过响应头下的 Content-Type 条目中的 charset 信息来确定文档的编码,包括如何去配置这个响应头,以及一些具体的实验,还有它与文档内编码声明的优先级选择问题。

继续阅读“网页中的编码与乱码(3)”

网页中的编码与乱码(2)

深入介绍了文档内编码声明的应用,包括许多在静态文档和动态文档中的实验与测试的细节,以及其它的一些注意事项等。

接着上一篇中的讨论,也是先从“文档内编码声明”讲起,因为它是最直观也最容易控制的。

不过事实上也没有那么容易,它还是很容易受各种因素干扰,下面会详细介绍整个过程,囊括了静态文档响应和动态文档响应两种情况,以及各种其它注意事项。

继续阅读“网页中的编码与乱码(2)”

网页中的编码与乱码(1)

授人以鱼不如授人以渔,在这里我会告诉有关网页中的编码的一些事实与结论,但我更希望传达给你分析问题的方法,当你遇到乱码困扰时,你能够独立迅速地分析并解决问题。

在之前谈了很多关于字符集编码与乱码的基础知识,可以说,如果你掌握了这些,对于各种乱码问题,就有了一个良好的基础,基本能够分析甚至独立地解决各类的乱码问题。

自然,基础问题的重要性无需多言,但另一方面,具体的问题也同样很重要。据我的观察,具体的问题有很多是关于 web 开发方面所碰到的乱码,尽管从原理方面来说,道理都是一样的,但导致问题产生的许多细节还是值得一说的,所以这次也打算具体谈谈这些方面。

继续阅读“网页中的编码与乱码(1)”

在开发者工具中查看响应头的字符集编码信息

介绍了如何在浏览器的开发者工具中查看响应头(Response Headers)下的 Content-type 中的字符集编码信息

要想查看某个文档的响应头中的字符集编码信息,以 Chrome 浏览器为例,首先打开“开发者工具”:

可以按快捷键 F12,或单击窗口右上角的选项按钮,然后选择 “更多工具–开发者工具”即可打开“开发者工具”窗口。

如下图打开我的网站为例所示:

继续阅读“在开发者工具中查看响应头的字符集编码信息”

非 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)”