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 на хосте попробуй
#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)
Дак у тебя проблема в чем?
)) у тебя текст неправильно режется, потому что в кодировке 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, я же писал, что всё в виндовс кодировке.
И записывается в базу вот в таком виде:
Новость
В редакторе PHP также используется Windows. Везде Windows.
38.
CROWS (25.01.2010 / 16:08)
Или я что-то не доганяю, или хз что
Спасибо, что помагаете
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, я же писал, что всё в виндовс кодировке.
И записывается в базу вот в таком виде:
Новость
В редакторе 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