【发布时间】:2020-04-01 13:23:13
【问题描述】:
这行得通:
$csv = " b'\xd0\x9e\xd0\xb4\xd0\xbd\xd0\xb0\xd0\xba\xd0\xbe \xd0\xbe\xd0\xb1\xd0\xb8\xd0\xb4\xd0\xbd\xd0\xbe \xd0\xb1\xd1\x83\xd0\xb4\xd0\xb5\xd1\x82 \xd0\xbf\xd0\xbe\xd1\x82\xd1\x80\xd0\xb0\xd1\x82\xd0\xb8\xd1\x82\xd1\x8c \xd0\xbd\xd0\xb0 \xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0 \xd0\xb2\xd1\x80\xd0\xb5\xd0\xbc\xd1\x8f, \xd0\xba\xd0\xbe\xd1\x82\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb5 \xd0\xbc\xd0\xbe\xd0\xb3\xd0\xbb\xd0\xb8 \xd0\xb1\xd1\x8b \xd0\xbf\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb5\xd1\x81\xd1\x82\xd0\xb8 \xd0\xb1\xd0\xbe\xd0\xbb\xd0\xb5\xd0\xb5 \xd0\xbf\xd0\xbb\xd0\xbe\xd0\xb4\xd0\xbe\xd1\x82\xd0\xb2\xd0\xbe\xd1\x80\xd0\xbd\xd0\xbe.'";
$csv = mb_convert_encoding($csv,'UTF-8');
虽然这会返回未转换的字符串:
$o = shell_exec('python3.6 /var/www/html/main.py'.'normal');
$contents = mb_convert_encoding($o,'UTF-8');
echo $contents
Python 脚本返回相同的字符串。我试过 strval() 和 unpack(),没用。
这是“locale -a”的结果:
here
即使我在 eval() 中调用脚本,它也会将字符串解释为数据。
【问题讨论】:
-
您在这里没有正确区分 code 和 data。您上面的
$csv = "…";是code - PHP 解析器会将这些\x..转换为它们的实际字节值。之后您的$csv变量 不再包含\x..。 “Python 脚本返回相同的字符串。” - 从 PHP 的角度来看,此时已经是 data。 PHP 解析器不再处理这个问题。 -
@CBroe 但是为什么 strval() 不起作用,如果是这样的话?
-
我不明白为什么应该这样做?该函数的目的是获取一些其他数据类型的字符串表示 - 因此,如果您有
$x = 5;,这将确保您之后有一个实际的 string 值而不是一个数字。如果你给它一个已经是字符串开头的东西,它为什么要anything呢?我认为我们可以假设它首先检查它,并在这种情况下直接返回未修改的值。 -
@CBroe 如果它已经是一个字符串,我只是不知道如何从数据转换为字符串
-
@CBroe 或者您的意思是转换为字节然后解码?