Допустим (для простоты), что у меня есть многобайтовый, UTF-8 кодируются строковое переменный с 3-х буквами (состоящих из 4-х байт):Как я могу получить одиночные байты из многобайтовой строковой переменной PHP двоично-безопасным способом?
$original = 'Fön';
Поскольку это UTF-8, шестигранные значения байт являются (за исключением BOM):
46 C3 B6 6E
в качестве переменной $original
определяется пользователем, мне нужно будет Hande две вещи:
- Получить точное число байтов (не UT F-8 символов), используемых в строке, и
- Способ доступа к каждому отдельному байту (не символ 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();
?>
Это доказывает мою первоначальная идея не работает:
- var_dump показывает 3 байта
- Printf не может также, так как "Орд" работает только на ASCII символов
Как я могу получить одиночные байты из многобайтовой строковой переменной PHP двоично-безопасным способом?
Что я ищу - это двоично-безопасный способ преобразования строк (строк) UTF-8 в байтовые массивы.
Если STRLEN возвращает количество символов, а не счетчику байтов, а затем проверить php.ini для значения [mbstring.func_overload] (http://php.net/manual/en/mbstring.overload .php); но уверены ли вы, что ваш 'ö' является символом UTF-8, а не просто [расширенным ASCII] (http://www.ascii-code.com/)? F6 - это шестнадцатеричный код для 'ö' в расширенном ascii –
только идея:' $ a = utf8_encode ('Fön'); $ b = распаковать ('C *', $ a); var_dump ($ b); 'result - массив с 4 значениями int, i utf8_encoded, потому что у меня был iso-файл. – steven
и вы можете найти функцию uniord в комментариях здесь: http://us.php.net/manual/en/function.ord.php (поиск «uniord») – steven