如何使编码未知的字节序列可用作 PHP 的输入?

Posted

技术标签:

【中文标题】如何使编码未知的字节序列可用作 PHP 的输入?【英文标题】:How can a byte sequence with unknown coding be made available as input for PHP? 【发布时间】:2021-03-09 17:03:36 【问题描述】:

我有一个编码未知的文件。我可以使用 file_get_contents() 将此文件作为字符串读取。我想导出这个字符串,以便它可以作为 php 代码使用。 字符串可以使用 bin2hex () 以十六进制表示。 但是,如果没有特殊代码,这不能在 PHP 中使用。 所以我的问题: 如何使用 PHP 输出来自未知编码文件的字节序列,以使输出可以用作可重现的 PHP 代码?

【问题讨论】:

【参考方案1】:

var_export 可能是您正在寻找的功能。 jspit 的解决方案也可以,但是var_export 会更紧凑。

【讨论】:

var_export() 在几个地方引起问题。正是这些问题促使我寻找另一种解决方案。我在答案中添加了一个示例。【参考方案2】:

使用此功能,可以回显包含任何字符(控制字符..)的字符串。该字符串可以复制并作为字符串插入到编辑器中。

function strhex($s)
    return $s != '' ? '\\x'.implode('\\x',str_split(bin2hex($s),2)) : '';

示例:

$str = "íéťů4€ ";  //"my unknown string"
echo strhex($str);
//\xc3\xad\xc3\xa9\xc5\xa5\xc5\xaf\x34\xe2\x82\xac\x20\x01

复制输出并用作字符串

$input = "\xc3\xad\xc3\xa9\xc5\xa5\xc5\xaf\x34\xe2\x82\xac\x20\x01";

$input 与 $str 相同。使用此函数的输出可以在浏览器中完成并使用 Ctrl C 复制。 var_dump() 和 var_export() 等 PHP 函数在多个地方失败。

例子:

$str = "\xe2\x82";
var_export($str);
//'�'

浏览器中 var_export() 的输出在此处失败,因为 $str 不是有效的 UTF-8。 strhex() 的输出是 \xe2\x82

【讨论】:

以上是关于如何使编码未知的字节序列可用作 PHP 的输入?的主要内容,如果未能解决你的问题,请参考以下文章

字符串编码ord,chr,字面值

字符串编码ord,chr,字面值

gRPC笔记与相关问题

如何在 PHP 中验证 utf 序列?

如何高效的使用IO流?字节流字符流缓冲流序列化对象流打印流全整理

php中字符与字节的区别