Здравствуйте,уважаемые! как мне подружить strval с русскими символами utf-8? пока приходится вот так: PHP: strval(iconv('UTF-8', 'CP1251//IGNORE', $Square1[$i][$j]))
пока не помогло. вообще,я пытаюсь реализовать шифр "двойной квадрат" с русскими буквами. хотел в кодировке utf-8. Даже вот с этого места у меня беда: PHP: $input="АБВГДЕЁЖЗИЙ"; $symb1 =strval($input[0]); //Получаем первый символ echo "<br/>",$symb1,"<br/>";//выводит кракозябру хотя мне вывод на экран и не нужен...но, кажется дальше работа будет неправильная, не понятно, что за символ
скорее даже дело не в самой функции strval() просто PHP: $symb1 =$input[0]; также выдает кракозябру (string) и strval() одно и тоже делают
Пока только так решил: перегоняю массив с исходными символами в win1251 при помощи PHP: iconv('UTF-8', 'CP1251//IGNORE', $Square1[$i][$j]) , то что нужно шифровать также перевожу...шифрую и опять перевожу в utf-8. но мне не нравится вариант с iconv()
вобщем приведу полный код...кодировка файла utf-8 - тогда прога не работает. если кодировка файла win, то работает. соответственно,чтоб работало когда файл в UTF , приходиться изватиться: PHP: <?php $o = $Square1 = $Square2 = array(); // Arrays for: Output, Square1, Square2 $RusLoLetters=array('а','б','в','г','д','е','ж','з','и','к','л','м','н','о', 'п','р','с','т','у','ф','х','ц','ч','ш','щ','ь','ы','ъ', 'э','ю','я','ё','й'); $RusUpLetters=array('А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н', 'О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я'); //Объединяем массивы $RusLetters=array_merge($RusLoLetters,$RusUpLetters); $basea = array('?','(','@',';','+','#',"]","&",'*'); // base symbol set //Добавляем в массив символы латинского, спецсимволы и цифры //Отсутствуют символы '$','|','%', //ЧТоб символов было 144 $basea = array_merge($basea, range('a','z'), range('A','Z'), range(0,9) ); $basea = array_merge($basea, array('!',')','_','/','[','.',' ') ); //Объединяем все в один массив $basea = array_merge($basea, $RusLetters ); $c=count($basea); for ($i=0;$i<$c; $i++){ $basea[$i] = iconv('UTF-8', 'CP1251//IGNORE', $basea[$i]); } echo count($basea); //Размерность матрицы $dimension=12; // create Square1 for($i=0;$i<$dimension;$i++) { for($j=0;$j<$dimension;$j++) { $Square1[$i][$j] = $basea[$i*$dimension+$j]; } } //Сортируем массив sort($basea); // create Square2 for($i=0;$i<$dimension;$i++) { for($j=0;$j<$dimension;$j++) { $Square2[$i][$j] = str_rot13($basea[($dimension*$dimension-1) - ($i*$dimension+$j)]); } } echo "<br />" ; /* string str_rot13 (string str) Выполняет над строкой str преобразование ROT13 и возвращает полученную строку. Преобразование ROT13 заключается в простом сдвиге каждой латинской буквы на 13 позиций в алфавите, остальные символы не изменяются. Обратное преобразование выполняется той же функцией. */ unset($basea);//Уничтожаем массив $input="Преобразование ROT13 заключается в простом сдвиге каждой латинской буквы на 13"; $input = iconv('UTF-8', 'CP1251//IGNORE', $input); //пережимаем текст в WIN-1251 $m = floor(strlen($input)/2)*2; // !strlen%2 echo strlen($input),"<br>"; $symbl = $m==strlen($input) ? '':$input[strlen($input)-1]; $al = array(); #$decrypt=1; for ($ii=0;$ii<$m; $ii=$ii+2) { $symb1 = $symbn1 =strval($input[$ii]); //Получаем первый символ $symb2 = $symbn2 = strval($input[$ii+1]);//Второй //Ищем символы в матрицах. 1ый в первом квадрате, 2ой - во втором //Необходимы индексы этих символов. $a1 = $a2 = array(); for($i=0;$i<$dimension;$i++) { // search symbols in Squares for($j=0;$j<$dimension;$j++) { if ($decrypt) { if ($symb1===strval($Square2[$i][$j]) ) $a1=array($i,$j); if ($symb2===strval($Square1[$i][$j]) ) $a2=array($i,$j); if (!empty($symbl) && $symbl===strval($Square2[$i][$j])) $al=array($i,$j); } else { if ($symb1===strval((string)$Square1[$i][$j]) ) {$a1=array($i,$j); }//запоминаем индексы первого символа в матрице if ($symb2===strval( (string)$Square2[$i][$j]) ) {$a2=array($i,$j); } if (!empty($symbl) && $symbl===strval($Square1[$i][$j])) $al=array($i,$j); } } } if (count($a1) && count($a2)) { $symbn1 = $decrypt ? $Square1[$a1[0]][$a2[1]] : $Square2[$a1[0]][$a2[1]]; $symbn2 = $decrypt ? $Square2[$a2[0]][$a1[1]] : $Square1[$a2[0]][$a1[1]]; } $o[] = $symbn1.$symbn2; } if (!empty($symbl) && count($al)) // last symbol $o[] = $decrypt ? $Square1[$al[1]][$al[0]] : $Square2[$al[1]][$al[0]]; echo"<br/>"; $o = implode("", $o); $o =iconv('CP1251//IGNORE','UTF-8', $o); echo $o; ?> по мотивам статьи http://habrahabr.ru/blogs/php/61309/
Rizan В кодировке UTF-8 каждая русская буква занимает 2 байта. Ты берёшь первый, но не берёшь второй, потому и кракозябра. Подробнее про утф-8 можно почитать в википедии. Перевод в ср1251 - самый оптимальный, потому что работать побайтово с многобайтными кодировками сложно.
Понял, спасибо! а я думаю почему у меня длина строки с русскими буквами в два раза больше, чем количество символов.