你应该记住的一个UTF-8字符「EF BF BD」 | 行思錄

文章推薦指數: 80 %
投票人數:10人

所谓编码方案即讲字符集到码点(code point)的映射方式。

在众多的utf-8码点值中,除了ascii,你还应该记住「EF BF BD」,因为它是很多 ... 文章导航 ←上一篇 下一篇→ utf-8是一种变长(1byte~6bytes)的unicode字符集编码方案。

所谓编码方案即讲字符集到码点(codepoint)的映射方式。

在众多的utf-8码点值中,除了ascii,你还应该记住「EFBFBD」,因为它是很多编程语言以及库中的备胎,即无效的码点值在编码的时候会默认用这个码点值进行替换,即utf-8中的超级「备胎」(REPLACEMENTCHARACTER)。

为什么会有无效的码点值? 从上图可以知道,utf-8编码并非连续的。

很多人会忽略这个细节。

什么时候会遇到无效的utf-8码点? 当你试图把一个无效的码点值作为utf-8码点处理时,就会产生无效的码点。

此时,无效的码点会被替换为「EFBFBD」,然后进行后续处理,以避免无效码点可能引起的异常。

很多语言对这种处理是自动进行的,比如golang: Go now:=time.Now().Unix()//一个无效的码点值 str:=string(now)//golang是utf-8编码,会对无效码点进行替换 fmt.Printf("%X",[]byte(str))//EFBFBD,即字符「�」 123 now:=time.Now().Unix()//一个无效的码点值str:=string(now)//golang是utf-8编码,会对无效码点进行替换fmt.Printf("%X",[]byte(str))//EFBFBD,即字符「�」 为什么要记住这个码点 在「字符集敏感」的环境中,如果你的数据中出现了「EFBFBD」就应该警惕了,因为你传输的数据中途很可能经过了自动替换,收到的数据未必是原始的数据。

这对于你排查一些奇怪的数据交换不一致问题是很有用的,很多时候,可能是你的最后一颗救命稻草。

例如,使用utf-8编码的xml文档进行数据交换,如果看见了「�」,毫无疑问数据源有非法码点值。

网页中出现了「�」,那么肯定是html文档的编码不是合规的utf-8编码文档。

文本编辑器中出现了「�」,那一定是你打开这个文档的姿势不对——又选错编码了。

总之,当你看见超级备胎「�」的时候,不要觉得大事不妙,不要像遇到一般乱码那样惊慌失措,你应该轻轻弹一下鼠标上的灰尘,将之打回原形。

因为aws的账单,才意识到自己的vps已经很久没有折腾了,博客也已经长草,应该说已经长成灌木丛了。

这才意识到自己已经回成都快9个月了。

有人说,时间是把杀猪刀。

这很公平。

但是,即使哪天挨上了这杀猪刀,也希望自己是头优雅的猪。

而此时,2015已经过去1/4. –EOF– 版权声明转载请注明出处,本文原始链接



請為這篇文章評分?