你应该记住的一个UTF-8字符「EF BF BD」 | 行思錄
文章推薦指數: 80 %
所谓编码方案即讲字符集到码点(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–
版权声明转载请注明出处,本文原始链接
延伸文章資訊
- 1Entity Framework Core SQL Server 提供者特有的資料行功能
使用其中一個SQL Server的UTF-8 定序來設定屬性的定序;這些定序具有 UTF8 後置詞(請參閱定序) 的檔。 請勿停用屬性上的Unicode;這會導致EF Core 建立資料 ...
- 2UTF-8字符「EF BF BD」-备胎_mob604756f87695的技术博客
UTF-8字符「EF BF BD」-备胎,在众多的utf-8码点值中,除了ascii,你还应该记住「EFBFBD」,因为它是很多编程语言以及库中的备胎,即无效的码点值在 ...
- 3UTF-8 code page (#66) - Charset.org
- 4你应该记住的一个UTF-8字符「EF BF BD」 | 行思錄
所谓编码方案即讲字符集到码点(code point)的映射方式。 在众多的utf-8码点值中,除了ascii,你还应该记住「EF BF BD」,因为它是很多 ...
- 5UTF-8 - 字嗨!
UTF-8是Unicode的一種可變長度的字元編碼形式。它設計來相容於ASCII,讓原本處理ASCII字元 ... 0800~FFFF, 3, 1110xxxx (E0-EF), 10xxxxx...