bin2hex() 将字符串按字节原样转为十六进制,每字节变两个字符;仅接受字符串,非字符串输入会报错;处理UTF-8中文如“中”得“e4b8ad”,正确无误。

bin2hex() 就是用来把一串字节(字符串)转成十六进制字符串的,不挑内容、不验编码、不加判断——原样按字节转,每个字节变两个十六进制字符。
bin2hex() 的输入必须是字符串类型
它不接受数组、整数、对象或 null。传错类型会触发警告甚至致命错误(PHP 8+ 默认 strict 模式下直接 TypeError)。
- 正确:
bin2hex("abc")→"616263" - 错误:
bin2hex(123)→ 警告 + 返回空字符串或 false(取决于 PHP 版本) - 错误:
bin2hex(["a", "b"])→ 致命错误(Array to string conversion) - 安全写法:先用
is_string()判断,或强制转:bin2hex((string)$data)(但注意数字转字符串后含义已变)
中文和 UTF-8 字符串怎么转才不出乱码
bin2hex() 本身没有“编码意识”,它只认字节。UTF-8 下一个中文字符占 3 字节,“中”对应 \xe4\xb8\xad,所以 bin2hex("中") 返回 "e4b8ad" —— 这完全正确,不是 bug。
- 常见误判:看到
"e4b8ad"就觉得“不像 hex”,其实是你期待 GBK 编码下的结果("d6d0") - 若需 GBK 表示,先转码:
bin2hex(iconv('UTF-8', 'GBK', "中")) - 别用
mb_convert_encoding($str, 'ISO-8859-1')强转,中文会变?或截断,再bin2hex()就彻底失真 - 反向还原时,
hex2bin()返回的是原始字节流,输出前必须声明编码,比如header('Content-Type: text/html; charset=utf-8');
bin2hex() 和 random_bytes() 配合生成 token 的典型用法
这是最常见也最容易出错的组合:用 random_bytes() 生成加密安全随机字节,再用 bin2hex() 变成可读、可存储的字符串。
立即学习“PHP免费学习笔记(深入)”;
-
$token = bin2hex(random_bytes(16));→ 得到 32 字符长的十六进制字符串(16 字节 × 2) -
$token = bin2hex(random_bytes(32));→ 64 字符,常用于 API key 或 password reset token - 别写成
bin2hex(mt_rand())或bin2hex(time())—— 这些熵极低,不安全 - 注意:
random_bytes()在 PHP 7.0+ 原生支持;PHP 5.x 需用openssl_random_pseudo_bytes()或兼容库
真正容易被忽略的点是:你拿到 bin2hex() 的结果后,下游系统是否按相同编码解释这些字节。比如前端 JS 用 TextEncoder 处理 UTF-8 字符串再转 hex,后端 PHP 用 bin2hex() 对同一中文字符串处理,结果才能对得上。否则看似“转换失败”,其实只是编码链断在了某一处。



















