Проверить правильность кодировки

vlav

Новичок
Проверить правильность кодировки

Например на форум постится сообщение.
Как оптимально организовать проверку на допустимость символов в кодировке?
Чтобы не пропустить варианты, например когда спамер настраивает свой авторассыльщик и чтобы сообщение не в той кодировке не записалось в базу?
И еще - в документации по iconv указано, что

string iconv ( string $in_charset , string $out_charset , string $str )

Производит преобразование кодировки символов строки str из начальной кодировки in_charset в конечную out_charset . Возвращает строку в новой кодировке, или FALSE в случае ошибки.

На самом деле она false не возращает и ничего не прерывает, а выдает лишь нотисы во время выполнения - про недопустимый символ в последовательности.
Или у меня что то не так настроено?
 

jonjonson

Охренеть
vlav, то есть есть магический способ изменить кодировку на твоём сервере, которую знает не известный спамер?
 

Nicholas

Новичок
>> Как оптимально организовать проверку на допустимость символов в кодировке?

вырезать все недопустимые символы. Допустим регуляркой.

>> Возвращает строку в новой кодировке, или FALSE в случае ошибки.

PHP:
var_dump(iconv('UTF-8', 'wnidows-1251', $text));
Как результат, имеем: bool(false)

>> недопустимый символ в последовательности

Почитайте внимательно тут: http://ru2.php.net/manual/en/function.iconv.php
 

vlav

Новичок
Спасибо.
результата правда увидеть так и не удалось - что интересно за символы недопустимы?
например
$str="123".chr(0);
iconv("cp1251","utf8",$str);
var_dump(iconv("cp1251","utf8",$str));
результат -
string(4) "123"
и ошибок нет а равно с разными другими комбинациями вместо 0.
а также в любом случае непонятно как это использовать, поскольку var_dump ничего не возвращает .

С регуляркой - чтобы не изобретать велосипеда и не обнаружить что режет что-нибудь лишнее - как должна выглядеть такая регулярка?
Или может все таки как то проверять, дал ли ошибку iconv? так как конечная цель - именно чтобы иконв работал.
 

vlav

Новичок
Returns the converted string or FALSE on failure.

Именно с этого я и вообще начал.
Видимо "недопустимые символы" не считаются "failure" а лишь "notice" и выполнение не прерывается.
 

Zetruger

ivan.chistyakov.name
> Как оптимально организовать проверку на допустимость символов в кодировке?
так а зачем это делать?
UTF-8 на то и создан, чтобы все могли использовать любые символы из любых кодировок
 

AmdY

Пью пиво
Команда форума
блин, что за бред, какие такие символы, которые мешают записать в базу? делай mysql_real_escape_string сктроке и она любой бред запишет.
 

x-yuri

Новичок
На самом деле она false не возращает и ничего не прерывает, а выдает лишь нотисы во время выполнения - про недопустимый символ в последовательности.
Или у меня что то не так настроено?
var_dump(iconv('UTF-8', 'wnidows-1251', $text));
Как результат, имеем: bool(false)
PHP:
var_dump(iconv('UTF-8', 'windows-1251', 'Җ'));
я даже вроде сталкивался с тем, что iconv как-то некорректно работает. Например, последний пример никаких ошибок не выдает и возвращает пустую строку. Есть еще mbstring (http://ua.php.net/manual/en/function.mb-check-encoding.php)

-~{}~ 23.12.08 10:43:

Чтобы не пропустить варианты, например когда спамер настраивает свой авторассыльщик и чтобы сообщение не в той кодировке не записалось в базу?
а вот это не понял. Спамер должен спамит только в правильной кодировке? Тру-спам - только в правильной кодировке :D
 

AmdY

Пью пиво
Команда форума
у меня всё прекрасно работает, выдаёт
PHP:
string(7) 'Җ'
 

x-yuri

Новичок
а, символ заменился на символическую сущность
в таком виде кончено работать будет, а если попробовать вставить туда символ, которого нет в windows-1251?
 

advocat

developer
флаг //IGNORE после указания конечной кодировки еще никто не отменял ;)
 

advocat

developer
x-yuri
так вот, для особо одаренных разжевую
а если попробовать вставить туда символ, которого нет в windows-1251
если скажем написать индуский код с @, то iconv банально дойдет до этого символа ругнеться и прекратит дальнейшую обработку текста

Если же конечную кодировку указать как windows-1251//IGNORE он просто проигнорирует такой символ и продолжит обработки

[m]iconv[/m]
 

x-yuri

Новичок
особо одаренный advocat, а Вы пробовали запустить код который я указал, только вместо сущности реальный символ (любой не из windows-1251)? я документацию тоже читать умею. Без индуского @ и //IGNORE никаких ошибок не выдается и возвращается результат до первого некорректного символа
 

advocat

developer
x-yuri
если для Вас нотайс не ошибка, то думаю дальнейшая дискуссия бесполезна
 

x-yuri

Новичок
advocat
приношу свои извинения, я ошибся, нотайс действительно возникает
 
Сверху