webew
Войти » Регистрация
 
PHP

Вертикальный текст

14 января 2012, 9:47
Автор: Cherneeka
Здравствуйте.
Необходимо выводить текст вертикально в таблице. Написала такую функцию:

Function VerticalText($str){
$DlStr = strlen($str);
$NewMas[0] = 0;
for($n=0; $n<$DlStr; $n++){
echo $str[$n]."<br>";
} // for
} // function

Функция выводит вместо букв вопросики. Если убрать перенос строки, То текст выводится правильно. Как сделать, чтобы работало с переносом?..
Добавить комментарий
Отображение комментариев: Древовидное | Плоское

1234ru

Не совсем понятно.. Можете привести пример строки?
В какой кодировке у вас текст?
То, что не убивает нас, делает нас инвалидами.
15.01.2012, 21:40
Ответить

Cherneeka

Например, делаю так:
echo VerticalText("Бальные танцы");

Текст в кодировке utf8 без BOM
В самом браузере win1251
Если заменить в моей функции строку: echo $str[$n]."<br>";
на строку: echo $str[$n];
то слово выводится по буквам горизонтально и все в порядке, но как только я после вывода каждой буквы подставляю перенос строки или любой другой символ или пробел, то функция выводит вопросики. Подскажите, если знаете, почему так происходит?.. Я вроде догадываюсь что с может все дело в кодировке, но в то же время не могу понять, почему просто в строку по буквам выводит все нормально тогда?..
новичок
16.01.2012, 10: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 был больше похож на процедуру, чем на функцию - при работе с функцией удобно, когда она возвращает значение, так что я ее изменил соответствующим образом).

Потребуются функции для работы со строками в многобайтовых кодировках (сейчас на большинстве хостингов они включены). Если их установить нет возможности - можно через регулярное выражение, но его вид будет зависеть от кодировки.
То, что не убивает нас, делает нас инвалидами.
17.01.2012, 22:00
Ответить

Cherneeka

Спасибо вам большое за подробный развернутый ответ :) Очень полезная для меня информация, буду заполнять пробелы в моей голове )))
новичок
18.01.2012, 15:35
Ответить

1234ru

Пожалуйста, обращайтесь :)
То, что не убивает нас, делает нас инвалидами.
19.01.2012, 11:12
Ответить
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: