如何以二进制安全的方式从多字节PHP字符串变量中获取单字节?

e-s*_*shi 3 php byte bytearray utf-8 multibyte

让我们说(为简单起见),我有一个多字节,UTF-8编码的字符串变量,带有3个字母(由4个字节组成):

$original = 'Fön';
Run Code Online (Sandbox Code Playgroud)

由于是UTF-8,因此字节的十六进制值为(不包括BOM):

46 C3 B6 6E
Run Code Online (Sandbox Code Playgroud)

由于$original变量是用户定义的,因此我需要处理两件事:

  1. 获取字符串中使用的确切字节数(不是UTF-8字符),并
  2. 一种访问每个单独字节(不是UTF-8字符)的方法。

我倾向于使用strlen()处理“ 1”的方法,并使用如下所示$original的简单方法访问变量的字节`$original[$byteposition]

<?php
header('Content-Type: text/html; charset=UTF-8');

$original = 'Fön';
$totalbytes = strlen($original);
for($byteposition = 0; $byteposition < $totalbytes; $byteposition++)
{
    $currentbyte = $original[$byteposition];

    /*
        Doesn't work since var_dump shows 3 bytes.
    */
    var_dump($currentbyte);

    /*
        Fails too since "ord" only works on ASCII chars.
        It returns "46 F6 6E"
    */
    printf("%02X", ord($currentbyte));
    echo('<br>');
}

exit();
?>
Run Code Online (Sandbox Code Playgroud)

这证明我的最初想法不起作用:

  1. var_dump显示3个字节
  2. printf也会失败,因为“ ord”仅适用于ASCII字符

如何以二进制安全的方式从多字节PHP字符串变量中获取单字节?

我正在寻找一种将UTF-8字符串转换为字节数组的二进制安全方法。

ste*_*ven 5

您可以通过解压缩utf8_ecoded字符串$ a获得字节数组:

$a = utf8_encode('Fön');
$b = unpack('C*', $a); 
var_dump($b);
Run Code Online (Sandbox Code Playgroud)

使用C *格式表示“无符号字符”

参考文献