PHP中如何将binary字符串转换为常规字符串?
我之前碰到过一模一样的坑,你说的b"Crédito"其实是PHP里的二进制字符串——它本质就是文件读取到的原始字节序列,没有被标记为特定编码的常规字符串,所以直接和字面量比较才会失效。下面给你几个靠谱的解决方法:
核心思路:明确编码后转换
二进制字符串本身只是一堆字节,要转成能正常比较的常规字符串,关键是要知道你读取的文件用的是什么编码(比如UTF-8、ISO-8859-1、Windows-1252这些),然后把字节序列转换成对应编码的常规字符串。
方法1:用mb_convert_encoding转换(推荐)
如果确定文件是UTF-8编码,直接把二进制字符串转成UTF-8常规字符串:
$regularString = mb_convert_encoding($myVariable, 'UTF-8', 'UTF-8');
如果文件是ISO-8859-1(西欧常用编码),就改成:
$regularString = mb_convert_encoding($myVariable, 'UTF-8', 'ISO-8859-1');
方法2:用iconv转换
和mb_convert_encoding原理类似,语法稍有不同:
// 假设原编码是ISO-8859-1,转成UTF-8 $regularString = iconv('ISO-8859-1', 'UTF-8//TRANSLIT', $myVariable);
//TRANSLIT参数可以让无法转换的字符自动转成相近的字符,避免乱码。
方法3:不确定编码?先检测再转换
如果不知道文件编码,可以用mb_detect_encoding尝试检测(注意:这个函数不是100%准确,优先建议确认文件实际编码):
// 常见编码列表,按优先级排序 $possibleEncodings = ['UTF-8', 'ISO-8859-1', 'Windows-1252']; $detectedEncoding = mb_detect_encoding($myVariable, $possibleEncodings); $regularString = mb_convert_encoding($myVariable, 'UTF-8', $detectedEncoding);
验证转换结果
转换完成后,用var_dump($regularString)看看类型,应该会显示string(7) "Crédito"(而不是之前的binary string(7) "Crédito"),这时候再做比较就会正常生效了:
if ($regularString === "Crédito") { echo "匹配成功!"; }
为什么之前的比较都失效?
在PHP里,b"字符串"是二进制字符串字面量,它和常规字符串的区别在于:二进制字符串不会被PHP当成“带编码的文本”处理,只是纯粹的字节序列;而常规字符串会关联当前脚本的编码设置。所以即使字节内容一样,类型标记不同,严格比较===就会失败,宽松比较==也可能因为编码隐式转换的问题不生效。
内容的提问来源于stack exchange,提问作者gabpalves

