Архів мітки: utf8

Масове перекодування файлів з cp1251 у utf8

Пересаджуючи старий проект на Twitter Bootstrap я стикнувся з необхідністю перекодування шаблонів HTML з кодової сторінки window-1251 у UTF-8. Шаблони всі були в одному каталозі, мали розширення *.tmpl і їх було не багато, але запускати для кожного файлу iconv було якось не по лінуксоїдські. Проблема була ще й у методі конвертації утиліти iconv – вона не перезаписувала файл, а робила вивід у новий. Тобто для кожного файлу треба було зробити такі дії:

  1. Перевести з cp1251 у utf8 та зберегти у новому файлі
  2. Замінити старий файл новим

Писати сценарій для такої простої операції не варто, тому я зробив це у 3 команди, але потім трохи подумав і зменшив їх до 2:

$ ls *.tmpl | sed s/tmpl$/tmp/ | xargs -I '{}'
 iconv -f cp1251 -t utf8 -o '{}' '{}'l

Знаходимо в поточній директорії всі файли шаблонів (з розширенням tmpl), змінюємо розширення на tmp, конвертуємо файл *.tmpl у *.tmp. Тепер tmp-файли містять шаблони в UTF-8 кодуванні.

А тепер у старі tmpl-файли кладемо новий зміст:

$ ls *.tmp | xargs -I '{}' mv '{}' '{}'l

Якщо вам треба перекодувати файли, що розташовані в піддиректоріях, то змініть команду ls на find.

Локаль у Debian

Про локаль у Лінукс ми згадуємо, як правило, під час початкового встановлення системи, або коли треба запустити програму з англомовним інтерфейсом.

Але сьогодні я зіштовхнувся з проблемою додавання нової локалі до системи, що вже налаштована. Мені потрібно було на своєму робочому комп’ютері встановити локаль яка встановлена на сервері.

Виявилось, що Debian досить стримана система і за умовчанням не встановлює всі локалі без винятку. Так в мене був дуже короткий список:

$ locale -a
C
POSIX
uk_UA.utf8

Та на сервері не було локалі uk_UA.utf8. Замість неї стояла en_US.utf8. І саме її я вирішив встановити собі.

Для цього слід використовувати команду:

# dpkg-reconfigure locales

На екрані з’явиться простий інтерфейс в якому можна вибрати потрібні локалі та обрати одну за умовчанням.

Якщо такої команда у Вас у системі не має, то спершу встановіть її пакет:

# apt-get install debconf

 

Конвертація дампу бази даних MySQL з Latin1 у UTF8

Постала задача забезпечити підтримку юнікоду у базі даних. Після модифікації параметрів підключення до БД виявилось, що замість юнікоду зберігається якась абракадабра.

Хоча були додані стандартні параметри:

  • useUnicode=true
  • characterEncoding=utf8
  • characterSetResults=utf8
  • connectionCollation=utf8_general_ci

Уважно подивившись у код дампу БД я побачив, що для усіх таблиць використовується кодування latin1 замість utf8. Нижче ви можете побачити фрагмент дампу:

...
DROP TABLE IF EXISTS `autosave`;
SET @saved_cs_client     = @@character_set_client;
SET character_set_client = utf8;
CREATE TABLE `autosave` (
 `id` int(10) unsigned NOT NULL auto_increment,
 `create_time` timestamp NOT NULL default CURRENT_TIMESTAMP
 on update CURRENT_TIMESTAMP,
 PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
SET character_set_client = @saved_cs_client;
...

Традиційний програміст почав би копати документацію MySQL на тему зміни кодування БД та окремих таблиць, але сьогодні я обрав тактику системного адміністратора: я вирішив замінити кодування прямо у дампі БД.

Отже спочатку я створюю дамп БД у файлі dump.sql:

$ mysqldump -u КОРИСТУВАЧ -p БД > dump.sql

Потім використовую команду sed для заміни всіх кодувань таблиць:

$ sed -i 's/DEFAULT CHARSET=latin1;/DEFAULT CHARSET=utf8;/' dump.sql

Якщо лячно одразу використовувати цей запит на реальному дампі, можете переглянути спочатку його результати (що саме він модифікує) такою командою:

$ sed -n 's/DEFAULT CHARSET=latin1;/DEFAULT CHARSET=utf8;/p' dump.sql
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
...

Тепер видаляємо стару БД, створюємо її знову, але вже з кодуванням UTF-8 за умовчанням:

$ mysql -u КОРИСТУВАЧ -p БД
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 36
Server version: 5.0.51a-24+lenny2 (Debian)
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql> DROP DATABASE БД;
Query OK, 64 rows affected (0.20 sec)
mysql> CREATE DATABASE БД DEFAULT CHARSET utf8;
Query OK, 1 row affected (0.01 sec)
mysql> exit
Bye

І нарешті заливаю новий дамп:

$ mysql -u КОРИСТУВАЧ -p БД < dump.sql