Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2009, 14:44   #1
POPOV
Форумчанин
 
Аватар для POPOV
 
Регистрация: 26.10.2007
Сообщений: 124
Восклицание Некорректо отображается кирилица и перенос строки (\n)

Здраствуйте !
Я обучаюсь PHP, столкнулся с проблемой. У меня почему-то например при использовании функции strlen (кол-во символов в строке), символ кирилицей считается за 2 символа. А также, когда использую перенос строки "\n" при записи в файл, он не работает, а отображается как квадратик на месте где должен был быть перенос. Также при использовании некоторых функций , кирилица вообще отображается иероглифами.

вот например код:

Код:
<?php
$str="строка кирилицей";
$kol=strlen($str);
echo $kol."<br>";

$file="file.txt";
$open=fopen($file,w);
fwrite($open,"СТРОКА"."\n");
fclose($open);
?>
Так вот у меня получилось, что количество символов в строке $str = 31.
В книжке "Строганов А.С - ваш первый сайт с использованием PHP скриптов. 2008 г." в примерах русские символы нормально считаются, перенос строки нормально работает (не упоминается в возможности появления такой ерунды).

Вот что записалось в блокнот (рядом со словом СТРОКА):


Подскажите, может что в PHP.ini настроить нужно, или в Apache. PHP v.5.2.8, Apache v.2.2.11-x86-no ssl.
POPOV вне форума Ответить с цитированием
Старый 16.07.2009, 18:08   #2
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,714
По умолчанию

Длинна строки 31, тк ваш документ наверняка сохранён в utf-8, все символы из кирилицы занимают по 2 байта символа пробела 1 байт 15*2+1*1=31. И отображаются у Вас иероглифы тк Вы наверняка не указали кодировку тут
Код:
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" >
.

Судя по блокноту вы работаете под windows, в windows перенос строки обозначается 2 символами "\r\n".
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 16.07.2009, 20:20   #3
POPOV
Форумчанин
 
Аватар для POPOV
 
Регистрация: 26.10.2007
Сообщений: 124
По умолчанию

mv28jam

За помощь с переносом большое спасибо, в книге не слова про то что в Windows это так. Странно книга современная вроде..

но вот с кодировкой так и не разобрался..

вот код (кстати прям из книги):

Код:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>PHP</title>
</head>
<body>
<?php

$str="  Эта строка, которую Вы видите, будет преобразована ";
$eng="Welcome in the world of programming!";

$dlina=strlen($str);
echo "$dlina<br>";

$itog=trim($str);
$dlina=strlen($itog);
echo "$itog $dlina<br>";

$itog=ltrim($str);
$dlina=strlen($itog);
echo "$itog $dlina<br>";

$itog=rtrim($str);
$dlina=strlen($itog);
echo "$itog $dlina<br>";

$itog=substr($str,6,25);
echo "$itog<br>";

$itog=stristr($str,"в");
echo "$itog<br>";

$itog=strchr($str,"п");
echo "$itog<br>";

$itog=str_replace("будет","уже",$str);
echo "$itog<br>";

$itog=str_repeat($str,2);
echo "$itog<br>";

$itog=strrev($str);       // выводит иероглифы
echo "$itog<br>";

$itog=strpos($str, "видите");
echo "$itog<br>";

$itog=strrpos($str,"р");
echo "$itog<br>";

$itog=strtolower($str);     // выводит квадратики
echo "$itog<br>";

$itog=strtoupper($str);    // набор символов
echo "$itog<br>";

$itog=ucfirst($str);
echo "$itog<br>";

$itog=ucwords($str);
echo "$itog<br>";

$itog=str_word_count($eng,1);
print_r($itog);
echo "<br>";

$itog=str_word_count($eng);
print_r($itog);
echo "<br>";

$itog=strtok($str,",");
echo "$itog<br>";

$path=pathinfo("C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\php\1.php");
echo $path["dirname"]."<br>";
echo $path["basename"]."<br>";
echo $path["extension"];

?>

</body>
</html>
а вот его результат:



Многое нормально, но вот эти иероглифы и квадратики аж бесят.
Результат каждой функции пишется с новой строки. В коде функции разделяются абзацами.
POPOV вне форума Ответить с цитированием
Старый 16.07.2009, 21:04   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Исходник сохранён в UTF-8, или сохрани его в Win-1251 или не знаю, может быть, можно как-то сделать, чтобы это работало с неоднобайтовыми кодировками. А так логически здесь правильно, 95 байт, в UTF-8 кириллица - два байта на символ, пробелы - один. Замена работает так, как и должна, upper - lower работают тут с какой-то другой кодировкой и дают фигню, rev переворачивает всё побайтово, однобайтовые пробелы "выжили", буквы испортились.
Somebody вне форума Ответить с цитированием
Старый 16.07.2009, 21:51   #5
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Слеши либо экранируй, либо пиши в формате UNIX
PHP код:
("C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/php/1.php"
PHP код:
("C:\\Program Files\\Apache Software Foundation\\Apache2.2\\htdocs\\php\\1.php"
Поможет избежать кое каких проблем с путями в винде

ЗЫ. Сори за оффтоп
psycho-coder вне форума Ответить с цитированием
Старый 16.07.2009, 21:52   #6
POPOV
Форумчанин
 
Аватар для POPOV
 
Регистрация: 26.10.2007
Сообщений: 124
По умолчанию

Somebody

ЕЕЕЕ, сохранил в ANSI кодировка, заработало !! )

мне mv28jam упомянал о том что файл у меня в UTF 8, а я забыл что менять при сохранении нужно.

Всё, теперь всё как в книге, огромное вам спасибо !

psycho-coder Спасибо, буду знать теперь )

Последний раз редактировалось POPOV; 16.07.2009 в 21:54.
POPOV вне форума Ответить с цитированием
Старый 10.11.2010, 22:38   #7
Cergey2008
Новичок
Джуниор
 
Регистрация: 10.11.2010
Сообщений: 1
По умолчанию

mv28jam огрооооомное тебе спасибо за подсказку о переносе строк в Windows \r\n, пару ночей сидел в нете, нигде ни слова о данной команде (везде либо \n, либо \r). Еще раз спасибо!!!!!
Cergey2008 вне форума Ответить с цитированием
Старый 11.11.2010, 09:44   #8
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Совет:
- Собирайте все выводимые строки в переменную, а только потом выводите. Будет значительно быстрее.
Виталий Желтяков вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сайт не отображается в IE и Opera. Отображается только в FireFox. Roman_K HTML и CSS 3 03.02.2011 22:32
Перенос строки по файлу XAOC-forever Общие вопросы C/C++ 29 15.07.2009 17:44
Кирилица в C++ ROD Помощь студентам 2 06.12.2008 14:50
Перенос строки boostman Общие вопросы Delphi 2 08.08.2008 18:12