Как я могу получить одиночные байты из многобайтовой строковой переменной PHP безопасным двоичным способом?


Допустим (для простоты), что у меня есть многобайтовая, кодированная UTF-8 строковая переменная с 3 буквами (состоящая из 4 байт):

$original = 'Fön';

Поскольку это UTF-8, шестнадцатеричные значения байтов (исключая BOM):

46 C3 B6 6E

Поскольку переменная $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();
?>

Это доказывает, что моя первоначальная идея не работает:

  1. var_dump показывает 3 байта
  2. printf также терпит неудачу, так как "ord" работает только на ASCII-символах

Как я могу получить одиночные байты из многобайтовой строковой переменной PHP безопасным двоичным способом?

То, что я ищу,-это безопасный двоичный способ преобразования строки UTF-8 в массив байтов.

1 2

1 ответ:

Вы можете получить bytearray, распаковав строку utf8_ecoded $a:

$a = utf8_encode('Fön');
$b = unpack('C*', $a); 
var_dump($b);

Используется формат C* для "unsigned char"

Ссылки