2013-08-01 2 views
2

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

$original = 'Fön'; 

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

46 C3 B6 6E 

в качестве переменной $original определяется пользователем, мне нужно будет Hande две вещи:

  1. Получить точное число байтов (не UT F-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 не может также, так как "Орд" работает только на ASCII символов

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

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

+0

Если STRLEN возвращает количество символов, а не счетчику байтов, а затем проверить php.ini для значения [mbstring.func_overload] (http://php.net/manual/en/mbstring.overload .php); но уверены ли вы, что ваш 'ö' является символом UTF-8, а не просто [расширенным ASCII] (http://www.ascii-code.com/)? F6 - это шестнадцатеричный код для 'ö' в расширенном ascii –

+1

только идея:' $ a = utf8_encode ('Fön'); $ b = распаковать ('C *', $ a); var_dump ($ b); 'result - массив с 4 значениями int, i utf8_encoded, потому что у меня был iso-файл. – steven

+0

и вы можете найти функцию uniord в комментариях здесь: http://us.php.net/manual/en/function.ord.php (поиск «uniord») – steven

ответ