Эта тема на forum.dklab.ru


MVH: Определение кодировки для ф-и convert_cyr_string()
Ситуация значит такая. Мне необходимо сделать так, что бы перед отправкой письма (через mail()) его текст можно было перекодировать в разные кодировки. Перекодировку делаю с помощью ф-и convert_cyr_string(). Но как узнать текущую кодировку текста?
Евгений Галашин: определение кодир*
Коротко -- никак.
кодир*
Константин Жинько [tIT]:
Коротко -- никак.
MVH
Ну на самом деле можно... Только с помощью глаз =)
Машину нельзя научить понимать символы так, как они есть...
Если б в каждой кодировке стояла строка, описывающая кодировку, жить стало бы может и проще, только то, что получилось бы кодировкой уже не назовешь %
Во как! *)
Юрий Насретдинов:
Но как узнать текущую кодировку текста
Можно очень примитивный способ в принципе сделать - если текст состоит в основном из букв в верхнем регистре, то это KOI-8, если в основном из знаков типа ©, то это DOS, если из кракозябликов - то ISO
MVH:
Проблема возникла.
При перекодировке пропадает символ "»"
$qwe = 'q»q';
$qwe = convert_cyr_string($qwe, 'w', 'k');
print $qwe;
Его что в koi8-r нет? Или я чего-то не доганяю?
Дмитрий Котеров:
Его и правда нет в KOI. Такая вот беда. Заменяйте на entity - "»".
MVH:
Заменять на "»" не получится, т.к. я хотел посылать полученный текст по email в text/plain.
Вообще я хотел сделать рассылку на сайте и что бы пользователь при подписке мог выбирать кодировку. А теперь вот думаю, может вообще убрать возможность выбора кодировки и посылать письма в win-1251.
И ещё. В документации по ф-и convert_cyr_string (http://ru.php.net/manual/ru/function.convert-cyr-string.php) написано следующее:
Поддерживаются следующие кодировки:
k - koi8-r
w - windows-1251
i - iso8859-5
a - x-cp866
d - x-cp866
m - x-mac-cyrillic

А в чём разница между буквами a и d, если они обозначают одну и тужу кодирокву???
Евгений Галашин:
MVH значит, ни в чём (-; Просто алиасы.
Юрий Насретдинов:
теперь вот думаю, может вообще убрать возможность выбора кодировки и посылать письма в win-1251
А лучше в koi8
bæv:
А лучше в koi8

-- это почему?
Дмитрий Котеров: base64_encode
вообще убрать возможность выбора кодировки и посылать письма в win-1251
Да не важно, по сути, в чем посылать. Можете в Win, можете в KOI. Главное - правильный Content-type в письме указывайте, и заголовки From, To и Subject обрабатывайте base64_encode() (base64_encode). Сейчас все почтовые клиенты понимают все кодировки без особых проблем. А еще можете в UTF-8 слать - тогда уж точно никаких проблем не будет.

KOI чем хороша, так это тем, что, если вырезать последний бит из каждого байта (т.к. поделить нацело код на 2), то все равно получим читаемый текст (почти транслит) из английских букв. Ее так специально придумывали. Но где может этот бит сейчас потеряться, совершенно непонятно (это лет 10 назад такое случалось). KOI - вообще архаизм, Windows-кодировка давно самая популярная в России.
Евгений Галашин:
последний бит из каждого байта (т.к. поделить нацело код на 2)
следует читать как "самый старший бит каждого байта (сделать b & 0x7F, где b -- данный байт)" (-;
Юрий Насретдинов:
baev
Говорят, в Outlook с этим проблемы. По крайней мере, по умолчанию там стоит кодировка koi8. То есть если не указывать кодировку, то лучше посылать в koi8. А так - как и сказал Дмитрий, можно посылать в любой кодировке
Vladimir Sergeev:
Для определения кодировки/языка и прочего существует один сложный,
но надежный способ: проверять сочетания букв в слове, с какой буквы слово начинается,
в каком регистре и прочее.
Если я не ошибаюсь, так работает почтовый декодер Лебедева, некоторый функционал Яндекса
(типа: "возможно, Вы имели ввиду 'pass', а не 'зфыы'?") и прочий софт.

Думаю, на PHP это реализуемо, разумеется, с некоторой погрешностью.
Евгений Бондарев:
На больших объемах текста работает такой простенький алгоритм: http://tony2001.phpclub.net/misc/detect_charset/

Эта тема на forum.dklab.ru