Здравствуйте.
Необходимо выводить текст вертикально в таблице. Написала такую функцию:
Function VerticalText($str){
$DlStr = strlen($str);
$NewMas[0] = 0;
for($n=0; $n<$DlStr; $n++){
echo $str[$n]."<br>";
} // for
} // function
Функция выводит вместо букв вопросики. Если убрать перенос строки, То текст выводится правильно. Как сделать, чтобы работало с переносом?..
Вертикальный текст
14 января 2012, 12:47
Автор: Cherneeka
|
1234ruНе совсем понятно.. Можете привести пример строки?В какой кодировке у вас текст? То, что не убивает нас, делает нас инвалидами.
|
16.01.2012, 00:40 Ответить |
|
CherneekaНапример, делаю так:echo VerticalText("Бальные танцы"); Текст в кодировке utf8 без BOM В самом браузере win1251 Если заменить в моей функции строку: echo $str[$n]."<br>"; на строку: echo $str[$n]; то слово выводится по буквам горизонтально и все в порядке, но как только я после вывода каждой буквы подставляю перенос строки или любой другой символ или пробел, то функция выводит вопросики. Подскажите, если знаете, почему так происходит?.. Я вроде догадываюсь что с может все дело в кодировке, но в то же время не могу понять, почему просто в строку по буквам выводит все нормально тогда?.. новичок
|
16.01.2012, 13:23 Ответить |
|
1234ruВыражение вида $str[N], где $str - строковая переменная, есть взятие N-го байта этой строки. PHP рассматривает строку как "набор символов, где символ - это то же самое, что и байт. Это значит, что PHP поддерживает ровно 256 различных символов, а также то, что в PHP нет встроенной поддержки Unicode." (Описание строкового типа в руководстве по PHP).Поэтому код вида $str = 'абв'; echo $str[1]; даст 'б' только в случае работы с однобайтовой кодировкой, где один символ занимает строго один байт. Если же строка записана в многобайтовой кодировке, $str[n] по-прежнему продолжит возвращать n-й байт строки, но он уже не будет соответствовать какому-либо символу. Поэтому похоже на то, что текст у Вас все-таки в cp-1251, и в браузере 1251, поэтому $str[$n] выводит буквы нормально. Сам же файл скрипта, вероятно, в UTF-8, поэтому когда Вы $str[$n] дополняете чем-то из скрипта, результирующая строка получается в смешанной кодировке, и результат не тот, который ожидался. Если строка у Вас в 1251 и нужна она Вам в 1251, Вам нужно либо скрипт перевести в ту же кодировку, либо никакие строки непосредственно из его кода не дописывать. В остальном можно оставить как сейчас. Если же ваша строка все-таки в UTF-8, код на основе $str[$n], как уже было сказано выше, работать не будет, и Вам понадобится что-то вот такое: function VerticalText($str, $tail) { $DlStr = mb_strlen($str); $text = ''; for ($n = 0; $n < $DlStr; $n++) $text .= mb_substr($str, $n, 1) . $tail; return $text; } // пример: header("Content-type: text/html; charset=UTF-8"); ini_set('mbstring.internal_encoding', 'UTF-8'); // информируем механизм mb-функций, в какой кодировке будут строки $str = "Бальные танцы"; $tail = " - "; echo VerticalText($str, $tail); // результат: Б - а - л - ь - н - ы - е - - т - а - н - ц - ы - Такой код будет работать для любой кодировки обрабатываемых строк. (ваш вариант функции из-за вызова echo был больше похож на процедуру, чем на функцию - при работе с функцией удобно, когда она возвращает значение, так что я ее изменил соответствующим образом). Потребуются функции для работы со строками в многобайтовых кодировках (сейчас на большинстве хостингов они включены). Если их установить нет возможности - можно через регулярное выражение, но его вид будет зависеть от кодировки. То, что не убивает нас, делает нас инвалидами.
|
18.01.2012, 01:00 Ответить |
|
CherneekaСпасибо вам большое за подробный развернутый ответ :) Очень полезная для меня информация, буду заполнять пробелы в моей голове )))новичок
|
18.01.2012, 18:35 Ответить |
|
1234ruПожалуйста, обращайтесь :)То, что не убивает нас, делает нас инвалидами.
|
19.01.2012, 14:12 Ответить |
© 2007—2012 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.

