搜 decode 函数,前几条结果一半在讲 Python 的 bytes.decode,一半在讲 Oracle 的 DECODE(),还有 JavaScript 的 decodeURIComponent。三个东西完全不是一回事。
同名不同物在编程里很常见。先确认自己在哪个环境,再看对应的用法。
Python 里的 decode
bytes 转 str 用 decode,参数是编码名。抓下来的网页字节按 utf-8 解,中文就正常;按 gbk 解,就是一堆问号。
报 UnicodeDecodeError 说明字节和编码对不上。加 errors 参数能强行跑通,但会丢字符,不如先确认源编码。
还有一个坑:解码出来的字符串看着正常,实际带着不可见字符,比如 BOM 或者零宽空格。存库之前过滤一遍,免得后面查找对不上。
Oracle 里的 DECODE
它是个条件函数,类似 if-else,按顺序比较,命中就返回对应结果,最后给个默认值。注意它做的是等值比较,NULL 也能匹配,这点和 CASE 的写法不一样。
MySQL 没有 DECODE,对应的是 IF 或者 CASE WHEN。从 Oracle 迁到 MySQL 时这一条经常漏改,跑起来才发现函数不存在。
前端和 URL 里的解码
decodeURIComponent 解百分号编码,decodeURI 保留斜杠和问号这类分隔符。两个混用,会把带参数的地址解坏。
Base64 的 atob 处理不了中文,得先转成 UTF-8 字节,否则出来是乱码。
PHP 里还有 urldecode 和 base64_decode,名字像,作用差得远,搜的时候容易串。
怎么快速判断
看参数。传的是编码名,就是字节解码;传的是字段加一串键值对,是 Oracle 的条件函数;传的是百分号开头的字符串,是 URL 解码。
乱码问题九成不是函数用错,是源头编码没确认。抓包看响应头里的 charset,比在代码里反复试编码快得多。
下次搜这类函数名,把语言或者数据库名一起打进去,能省一半时间。