substr

1. CROWS (24.01.2010 / 15:05)
Такая проблема. Есть форма для ввода на странице A.php. На странице В.php есть такой код:
$_POST['theme']=htmlentities($_POST['theme'], ENT_QUOTES, 'Windows-1251');
$_POST['theme']=substr($_POST['theme'],0,100);
На странице А я ввожу текст в форму: "Новость Новость Новость Новость Новость Новость Новость Новость Новость Новость Новость Новость Н666".
В базу записывается только: "Новость Новость".
Кодировка базы win 1251 gen ci.
В чем проблема неправильного обрезания строки?

2. CROWS (24.01.2010 / 15:08)
Если вводить на латыне, то обрезает верно.

3. ramzes (24.01.2010 / 15:39)
mb_substr($str,0,100,'utf-8')
если не ошибаюсь.

4. CROWS (24.01.2010 / 15:48)
3. ramzes, спс, попробую.

5. Neformat (24.01.2010 / 16:12)
Новость Новость Новость Новость Новость Новость Новость Новость Новость Новость Новость Новость Н666
- здесь 100 знаков, а байт около 200, русский символ - 2 байта, латинский и цифра - 1 байт.
Обрезаешь ты до 100 байт. Либо юзай спец функции либо в substr увеличь до 200

6. CROWS (24.01.2010 / 16:21)
В топсервере нету php_mbstring.dll. Скачал, установил, раскомментировал в php.ini. чёт всёравно не работает.
5, ок.

7. ramzes (24.01.2010 / 16:35)
#6 на хосте попробуйsmile
#5 тогда латинскими будет 200 пропускать

8. CROWS (24.01.2010 / 18:54)
Другие способы есть обрезать?

9. Nu3oN (24.01.2010 / 19:26)
я через прег реплейс режу

10. Azzido (24.01.2010 / 19:27)
Для этого в php5 имеется функция iconv_substr

11. Вантуз-мен (24.01.2010 / 19:28)
iconv_substr($str, $offset, $length, 'utf-8');

12. Nu3oN (24.01.2010 / 19:29)
<?php
function sub($str){
return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,0}'.'((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,100}).*#s','$1',$str);}
?>


13. Azzido (24.01.2010 / 19:32)
12 и этим лишь зря грузишь сервер

14. CROWS (24.01.2010 / 20:17)
iconv_substr - тоже самое.

15. Вантуз-мен (24.01.2010 / 21:03)
тогда используй 2 функции
<?
function utf_to_win($str) { 
if (function_exists('mb_convert_encoding')) return mb_convert_encoding($str, 'windows-1251', 'utf-8');
if (function_exists('iconv')) return iconv('utf-8', 'windows-1251', $str);
$utf8win1251 = array( 
"А"=>"\xC0","Б"=>"\xC1","В"=>"\xC2","Г"=>"\xC3","Д"=>"\xC4","Е"=>"\xC5","Ё"=>"\xA8","Ж"=>"\xC6","З"=>"\xC7","И"=>"\xC8","Й"=>"\xC9","К"=>"\xCA","Л"=>"\xCB","М"=>"\xCC",
"Н"=>"\xCD","О"=>"\xCE","П"=>"\xCF","Р"=>"\xD0","С"=>"\xD1","Т"=>"\xD2","У"=>"\xD3","Ф"=>"\xD4","Х"=>"\xD5","Ц"=>"\xD6","Ч"=>"\xD7","Ш"=>"\xD8","Щ"=>"\xD9","Ъ"=>"\xDA",
"Ы"=>"\xDB","Ь"=>"\xDC","Э"=>"\xDD","Ю"=>"\xDE","Я"=>"\xDF","а"=>"\xE0","б"=>"\xE1","в"=>"\xE2","г"=>"\xE3","д"=>"\xE4","е"=>"\xE5","ё"=>"\xB8","ж"=>"\xE6","з"=>"\xE7",
"и"=>"\xE8","й"=>"\xE9","к"=>"\xEA","л"=>"\xEB","м"=>"\xEC","н"=>"\xED","о"=>"\xEE","п"=>"\xEF","р"=>"\xF0","с"=>"\xF1","т"=>"\xF2","у"=>"\xF3","ф"=>"\xF4","х"=>"\xF5",
"ц"=>"\xF6","ч"=>"\xF7","ш"=>"\xF8","щ"=>"\xF9","ъ"=>"\xFA","ы"=>"\xFB","ь"=>"\xFC","э"=>"\xFD","ю"=>"\xFE","я"=>"\xFF"); 
return strtr($str, $utf8win1251); 
}


16. Вантуз-мен (24.01.2010 / 21:04)
<?
function utf_substr($str, $offset, $length = null){
if (function_exists('mb_substr')) return mb_substr($str, $offset, $length, 'utf-8');
if (function_exists('iconv_substr')) return iconv_substr($str, $offset, $length, 'utf-8');
$str = utf_to_win($str);
$str = substr($str,$offset,$length);
return win_to_utf($str);
}


17. Вантуз-мен (24.01.2010 / 21:05)
Точнее нужно 3 функции, вот еще одна
<?
function win_to_utf($str) { 
if (function_exists('mb_convert_encoding')) return mb_convert_encoding($str, 'utf-8', 'windows-1251');
if (function_exists('iconv')) return iconv('windows-1251', 'utf-8', $str);
$win1251utf8 = array( 
"\xC0"=>"А","\xC1"=>"Б","\xC2"=>"В","\xC3"=>"Г","\xC4"=>"Д","\xC5"=>"Е","\xA8"=>"Ё","\xC6"=>"Ж","\xC7"=>"З","\xC8"=>"И","\xC9"=>"Й","\xCA"=>"К","\xCB"=>"Л","\xCC"=>"М",
"\xCD"=>"Н","\xCE"=>"О","\xCF"=>"П","\xD0"=>"Р","\xD1"=>"С","\xD2"=>"Т","\xD3"=>"У","\xD4"=>"Ф","\xD5"=>"Х","\xD6"=>"Ц","\xD7"=>"Ч","\xD8"=>"Ш","\xD9"=>"Щ","\xDA"=>"Ъ",
"\xDB"=>"Ы","\xDC"=>"Ь","\xDD"=>"Э","\xDE"=>"Ю","\xDF"=>"Я","\xE0"=>"а","\xE1"=>"б","\xE2"=>"в","\xE3"=>"г","\xE4"=>"д","\xE5"=>"е","\xB8"=>"ё","\xE6"=>"ж","\xE7"=>"з",
"\xE8"=>"и","\xE9"=>"й","\xEA"=>"к","\xEB"=>"л","\xEC"=>"м","\xED"=>"н","\xEE"=>"о","\xEF"=>"п","\xF0"=>"р","\xF1"=>"с","\xF2"=>"т","\xF3"=>"у","\xF4"=>"ф","\xF5"=>"х",
"\xF6"=>"ц","\xF7"=>"ч","\xF8"=>"ш","\xF9"=>"щ","\xFA"=>"ъ","\xFB"=>"ы","\xFC"=>"ь","\xFD"=>"э","\xFE"=>"ю","\xFF"=>"я"); 
return strtr($str, $win1251utf8); 
} 


18. CROWS (24.01.2010 / 21:13)
Спасибо.

19. ramzes (24.01.2010 / 21:15)
Че то я не осилил..
МБстринг уже не кошерно что ли?
Все отлично режет.

20. Вантуз-мен (24.01.2010 / 21:21)
ramzes (Сегодня / 21:15)
Че то я не осилил..
МБстринг уже не кошерно что ли?
Все отлично режет.
в каждой из 3-х функций идет проверка на стандартные библиотеки такие как iconv или mb_string, если таковы отсутствуют или не установлены идет перекодировка по символам

21. Дмитрий (24.01.2010 / 21:22)
19 у него нет этой библиотеки. и настроить не выходит

22. Azzido (24.01.2010 / 22:28)
По моему на денвере библиотека iсоnv имеется, должно все работать, ну по крайней мере на хосте то точно.

23. Azzido (24.01.2010 / 23:04)
Тьфу топсервер,изжито

24. Neformat (25.01.2010 / 09:53)
Как же вы любите все усложнять... А надо то всего лишь текст обрезать. На топсервере 100 % есть библиотека иконв. Почти на всех хостингах есть иконв и мбстринг

25. CROWS (25.01.2010 / 09:57)
Neformat (Сегодня / 09:53)
Как же вы любите все усложнять... А надо то всего лишь текст обрезать. На топсервере 100 % есть библиотека иконв. Почти на всех хостингах есть иконв и мбстринг
есть, но она режет так же как и substr.

26. Lugaro (25.01.2010 / 10:42)
25 потому что нужно указывать кодировку с которой работаеш

27. Lugaro (25.01.2010 / 10:45)
echo mb_substr('абв', 0, 1, 'UTF-8');

28. CROWS (25.01.2010 / 12:08)
.::lugaro::. (Сегодня / 10:42)
25 потому что нужно указывать кодировку с которой работаеш
$_POST['theme']=iconv_substr($_POST['theme'],0,100,'windows-1251');
Если б даже не указал - принималась бы во внимание внутренняя кодировка.

29. Azzido (25.01.2010 / 12:57)
А зачем ты виндовс кодировку указываешь,когда тебе текст в utf-8 резать

30. CROWS (25.01.2010 / 12:59)
Azzido (Сегодня / 12:57)
А зачем ты виндовс кодировку указываешь,когда тебе текст в utf-8 резать
См. первый пост. Мне надо именно виндовс.

31. Azzido (25.01.2010 / 13:16)
Дак у тебя проблема в чем?smile )) у тебя текст неправильно режется, потому что в кодировке utf-8,укажи ее,ты сам себе голову морочаешь.

32. CROWS (25.01.2010 / 13:27)
31. Azzido, чёт я не пойму: к чему utf-8, если у меня всё в Windows-1251?

33. Azzido (25.01.2010 / 13:49)
Если бы текст который ты обрезаешь не был бы в utf-8, он обрезался бы правильно.

34. CROWS (25.01.2010 / 15:01)
дело в том, что передается код буквы, а не сама буква, а код состоит из нескольких символов. Вот и получается, что обрезаются не буквы, а именно символы кода буков.

35. Azzido (25.01.2010 / 15:32)
Это и есть символы кодировки utf-8 (!) когда ты наконец поймешь.

36. ramzes (25.01.2010 / 15:36)
Т.с. У тебя файл в кодировке какой? Утф-8? Все что в нем, тоже будет в утф-8. И бд тут не при чем, ты обрезаешь в скрипте ведь.

37. CROWS (25.01.2010 / 16:07)
35, 36, я же писал, что всё в виндовс кодировке.
И записывается в базу вот в таком виде:
&#1053;&#1086;&#1074;&#1086;&#1089;&#1090;&#1100;
В редакторе PHP также используется Windows. Везде Windows.

38. CROWS (25.01.2010 / 16:08)
Или я что-то не доганяю, или хз что D Спасибо, что помагаете smile

39. Azzido (25.01.2010 / 17:53)
Это как раз utf-8 эти символы

40. CROWS (25.01.2010 / 18:40)
Azzido (Сегодня / 17:53)
Это как раз utf-8 эти символы
Ну дак а почему они там?)))

41. ramzes (25.01.2010 / 18:52)
При наличии Утф-8 все остальные кодировки всего лишь повод для холливара))

42. Azzido (25.01.2010 / 21:59)
AddDefaultCharset ?

43. Вантуз-мен (26.01.2010 / 02:40)
-V_o_R_o_N_a- (25.01.10 / 16:07)
35, 36, я же писал, что всё в виндовс кодировке.
И записывается в базу вот в таком виде:
&#1053;&#1086;&#1074;&#1086;&#1089;&#1090;&#1100;
В редакторе PHP также используется Windows. Везде Windows.
Правильнее это называть юникодом

44. CROWS (26.01.2010 / 09:55)
Azzido (25.01.10 / 21:59)
AddDefaultCharset ?
AddDefaultCharset Windows-1251

45. CROWS (27.01.2010 / 15:26)
Вообщем переделал всё в UTF-8) Теперь отображается не 100, а только 70) Уже лучше. Увеличу значение в ф-ции чуть и всё. Спасибо всем.

URL: https://visavi.net/topics/5298