За последние 24 часа нас посетили 56046 программистов и 1682 робота. Сейчас ищут 1093 программиста ...

strval vs utf-8

Тема в разделе "PHP для новичков", создана пользователем Rizan, 11 янв 2011.

  1. Rizan

    Rizan Активный пользователь

    С нами с:
    25 июн 2007
    Сообщения:
    115
    Симпатии:
    0
    Адрес:
    Пермь
    Здравствуйте,уважаемые! как мне подружить strval с русскими символами utf-8?

    пока приходится вот так:
    PHP:
    1.  
    2. strval(iconv('UTF-8', 'CP1251//IGNORE', $Square1[$i][$j]))
    3.  
     
  2. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    а приведение к строке не решит задачу случайно?

    (string)$Square1[$i][$j]
     
  3. Rizan

    Rizan Активный пользователь

    С нами с:
    25 июн 2007
    Сообщения:
    115
    Симпатии:
    0
    Адрес:
    Пермь
    пока не помогло. вообще,я пытаюсь реализовать шифр "двойной квадрат" с русскими буквами. хотел в кодировке utf-8.
    Даже вот с этого места у меня беда:

    PHP:
    1.  
    2. $input="АБВГДЕЁЖЗИЙ";
    3. $symb1 =strval($input[0]); //Получаем первый символ
    4. echo "<br/>",$symb1,"<br/>";//выводит кракозябру
    5.  
    хотя мне вывод на экран и не нужен...но, кажется дальше работа будет неправильная, не понятно, что за символ
     
  4. Rizan

    Rizan Активный пользователь

    С нами с:
    25 июн 2007
    Сообщения:
    115
    Симпатии:
    0
    Адрес:
    Пермь
    скорее даже дело не в самой функции strval()


    просто
    PHP:
    1. $symb1 =$input[0];
    также выдает кракозябру

    (string) и strval() одно и тоже делают
     
  5. Rizan

    Rizan Активный пользователь

    С нами с:
    25 июн 2007
    Сообщения:
    115
    Симпатии:
    0
    Адрес:
    Пермь
    Пока только так решил: перегоняю массив с исходными символами в win1251 при помощи
    PHP:
    1. iconv('UTF-8', 'CP1251//IGNORE', $Square1[$i][$j])
    , то что нужно шифровать также перевожу...шифрую и опять перевожу в utf-8. но мне не нравится вариант с iconv()
     
  6. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Так а символы откуда берутся? Почему они не в UTF-8 ?
     
  7. Rizan

    Rizan Активный пользователь

    С нами с:
    25 июн 2007
    Сообщения:
    115
    Симпатии:
    0
    Адрес:
    Пермь
    вобщем приведу полный код...кодировка файла utf-8 - тогда прога не работает. если кодировка файла win, то работает.
    соответственно,чтоб работало когда файл в UTF , приходиться изватиться:


    PHP:
    1.  
    2. <?php
    3.  
    4. $o = $Square1 = $Square2 = array(); // Arrays for: Output, Square1, Square2
    5.  
    6. $RusLoLetters=array('а','б','в','г','д','е','ж','з','и','к','л','м','н','о',
    7.                       'п','р','с','т','у','ф','х','ц','ч','ш','щ','ь','ы','ъ',
    8.                       'э','ю','я','ё','й');
    9. $RusUpLetters=array('А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н',
    10.                       'О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я');
    11.  
    12. //Объединяем массивы
    13. $RusLetters=array_merge($RusLoLetters,$RusUpLetters);
    14.  
    15. $basea = array('?','(','@',';','+','#',"]","&",'*'); // base symbol set
    16.  
    17. //Добавляем в массив символы латинского, спецсимволы и цифры
    18. //Отсутствуют символы   '$','|','%',  //ЧТоб символов было 144
    19. $basea = array_merge($basea, range('a','z'), range('A','Z'), range(0,9) );
    20. $basea = array_merge($basea, array('!',')','_','/','[','.',' ') );
    21.  
    22. //Объединяем все в один массив
    23. $basea = array_merge($basea, $RusLetters );
    24.  
    25. $c=count($basea);
    26. for ($i=0;$i<$c; $i++){
    27.        $basea[$i] = iconv('UTF-8', 'CP1251//IGNORE', $basea[$i]);
    28. }
    29.  echo count($basea);
    30. //Размерность матрицы
    31. $dimension=12;
    32.  
    33. // create Square1
    34. for($i=0;$i<$dimension;$i++)
    35.  {
    36.     for($j=0;$j<$dimension;$j++)
    37.       {
    38.          $Square1[$i][$j] = $basea[$i*$dimension+$j];        
    39.       }
    40.  }
    41.  
    42. //Сортируем массив
    43. sort($basea);
    44.  
    45. // create Square2
    46. for($i=0;$i<$dimension;$i++)
    47.  {
    48.     for($j=0;$j<$dimension;$j++)
    49.       {
    50.          $Square2[$i][$j] = str_rot13($basea[($dimension*$dimension-1) - ($i*$dimension+$j)]);        
    51.       }
    52.  }
    53.  echo "<br />" ;
    54.  
    55.  /*
    56.  string str_rot13 (string str)
    57. Выполняет над строкой str преобразование ROT13 и возвращает полученную строку.
    58. Преобразование ROT13 заключается в простом сдвиге каждой латинской буквы на 13
    59. позиций в алфавите, остальные символы не изменяются.
    60. Обратное преобразование выполняется той же функцией.
    61.  */  
    62. unset($basea);//Уничтожаем массив
    63.  
    64. $input="Преобразование ROT13 заключается в простом сдвиге каждой латинской буквы на 13";
    65. $input = iconv('UTF-8', 'CP1251//IGNORE', $input); //пережимаем текст в WIN-1251
    66.  
    67. $m = floor(strlen($input)/2)*2; // !strlen%2
    68. echo strlen($input),"<br>";
    69. $symbl = $m==strlen($input) ? '':$input[strlen($input)-1];
    70. $al = array();
    71.  
    72. #$decrypt=1;
    73. for ($ii=0;$ii<$m; $ii=$ii+2)
    74. {
    75.  $symb1 = $symbn1 =strval($input[$ii]); //Получаем первый символ
    76.  $symb2 = $symbn2 = strval($input[$ii+1]);//Второй
    77.  
    78. //Ищем символы в матрицах. 1ый в первом квадрате, 2ой - во втором
    79. //Необходимы индексы этих символов.
    80.   $a1 = $a2 = array();
    81.    for($i=0;$i<$dimension;$i++) { // search symbols in Squares
    82.             for($j=0;$j<$dimension;$j++) {
    83.                 if ($decrypt) {                  
    84.                     if ($symb1===strval($Square2[$i][$j]) ) $a1=array($i,$j);                    
    85.                     if ($symb2===strval($Square1[$i][$j]) ) $a2=array($i,$j);
    86.                     if (!empty($symbl) && $symbl===strval($Square2[$i][$j])) $al=array($i,$j);
    87.                 }
    88.                 else {
    89.                     if ($symb1===strval((string)$Square1[$i][$j]) ) {$a1=array($i,$j); }//запоминаем индексы первого символа в матрице                    
    90.                     if ($symb2===strval( (string)$Square2[$i][$j]) ) {$a2=array($i,$j); }
    91.                     if (!empty($symbl) && $symbl===strval($Square1[$i][$j])) $al=array($i,$j);
    92.                 }
    93.             }
    94.         }
    95.   if (count($a1) && count($a2)) {
    96.             $symbn1 = $decrypt ? $Square1[$a1[0]][$a2[1]] : $Square2[$a1[0]][$a2[1]];
    97.             $symbn2 = $decrypt ? $Square2[$a2[0]][$a1[1]] : $Square1[$a2[0]][$a1[1]];
    98.         }
    99.       $o[] = $symbn1.$symbn2;
    100.        
    101. }
    102. if (!empty($symbl) && count($al)) // last symbol
    103.         $o[] = $decrypt ? $Square1[$al[1]][$al[0]] : $Square2[$al[1]][$al[0]];
    104.  echo"<br/>";
    105.  $o = implode("", $o);
    106.  $o =iconv('CP1251//IGNORE','UTF-8', $o);
    107. echo $o;
    108.        
    109.  
    110. ?>
    по мотивам статьи http://habrahabr.ru/blogs/php/61309/
     
  8. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Rizan
    В кодировке UTF-8 каждая русская буква занимает 2 байта.
    Ты берёшь первый, но не берёшь второй, потому и кракозябра.
    Подробнее про утф-8 можно почитать в википедии.

    Перевод в ср1251 - самый оптимальный, потому что работать
    побайтово с многобайтными кодировками сложно.
     
  9. Rizan

    Rizan Активный пользователь

    С нами с:
    25 июн 2007
    Сообщения:
    115
    Симпатии:
    0
    Адрес:
    Пермь
    Понял, спасибо!
    а я думаю почему у меня длина строки с русскими буквами в два раза больше, чем количество символов.