你应该记住的一个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–
版权声明转载请注明出处,本文原始链接
延伸文章資訊
- 1UTF-8 Tool
Hex code point, 0025. Decimal code point, 37. Hex UTF-8 bytes, 25. Octal UTF-8 bytes, 45. UTF-8 b...
- 2Whats going on with this byte array? - Stack Overflow
When that character gets encoded back to UTF-8, this results in the byte sequence EF BF BD . You ...
- 3UTF8 3byte(ef)
UTF8 3byte(ef) ; ef 80 80,, ; ef 81 80,, ; ef 82 80,, ; ef 83 80,, ; ef 84 80,, ...
- 4Unicode/UTF-8-character table - starting from code position ...
code point, character, UTF-8 (hex.) name. U+FF00, , ef bc 80. U+FF01 ! ef bc 81, FULLWIDTH EXCLA...
- 5UTF-8字符「EF BF BD」-备胎_mob604756f87695的技术博客
UTF-8字符「EF BF BD」-备胎,在众多的utf-8码点值中,除了ascii,你还应该记住「EFBFBD」,因为它是很多编程语言以及库中的备胎,即无效的码点值在 ...