Lake PowayLake Poway // 2018-01-02

Автоматичне визначення кодування

Існує дуже багато (я б навіть сказав занадто багато) різних кодувань для кирилиці (і української мови зокрема):

UTF-8 (Unicode), яка все більше набирає популярності, як серед ОС так і в Інтернеті
CP1251 (ака Windows-1251), яка залишилась в спадок від старих версій Windows
KOI8-U (або KOI8-R), яка залишилася в спадок від старих версіх *nix’ів (Linux, FreeBSD)
MacUkraine (або MacCyrillic), яка залишилася в спадок від старих версіх MacOS
CP866, яка залишилася в спадок від DOS’у
ISO 8859-5, яка майже ніде і не використовувалась

Зараз відбувається міграція на UTF-8, що позбавляє проблем з використанням різних мов.

На одному з моїх проектів я аналізую, звідки користувачі заходять на сайт (в основному мене цікавлять, за якими ключовими словами сайт знаходиться в пошукових системах).
І ось тут виникла проблема з кодуваннями, бо деякі пошукові системи (наприклад Яндекс) ще й досі використовують CP1251, а Google може використовувати різні кодування (в залежності від параметрів).
Тому я написав функцію на php (використавши функцію для визначення UTF-8), яка автоматично визначає кодування (підтримується UTF-8, CP1251 та KOI8-U) і перекодовує текст в потрібне.

Вихідний код: Автоматичне визначення кодування

Опис:
string autoencode (string $string, [string $encoding])

Приклад використання:

include("шлях/до/autoencode.php");
$text_utf=autoencode($text, 'utf-8');

В цієї функції є недоліки. Основний – вона визначає кодування, підраховуючи коди маленьких літер (яких в звичайному тексті – більшість). Але якщо в тексті переважають великі літери, то відбувається плутанина між CP1251 та KOI8-U

P.S. Якщо в когось є кращий алгоритм, поділіться
P.S.S. Таблиця з кодуваннями кирилиці