Як конвертувати GB2312 (або інші символи, що не належать до ANSI) у кодування UTF-8 (як MySQL, так і Files Charset)
Мій перший веб-сайт steakovercooked.com був створений у 2006 році (9 років тому). У той час я не знав багато про кодування/набір символів файлів, а також UTF-8 не був таким популярним для веб-сторінок у той час. У ці дні UTF-8 стає настільки популярним, тобто WordPress використовує кодування UTF-8 на всьому сайті, щоб ви могли практично відображати будь-яку мову на одному сайті без проблем.
UTF-8-ascii-iso-8859-1
Кодова сторінка всіх файлів (PHP, HTML, CSS та деяких інших простих текстових файлів) була здебільшого на кодових сторінках ANSI, а китайські ієрогліфи закодовані багатобайтно. Щоб відображати ці символи (у кодуванні ANSI) у браузері, вам потрібно буде розмістити їх між тегами заголовків у HTML, щоб браузери могли зрозуміти:
У HTML5 ви можете писати набагато коротшим методом:
Таким чином, більшість людей, які не розмовляють китайською мовою, не можуть бачити символи, якщо вони не інсталюють мовний пакет GB2312 для браузера. Крім того, деякі звичайні текстові редактори можуть зіпсувати символи. Один символ у китайській мові складається з двох байтів, але іноді текстовий редактор просто розрізає його навпіл.
Перетворення файлів (ANSI) на UTF-8
Перш ніж змінити метазаголовок на:
Вам потрібно буде конвертувати файли в кодування UTF-8. Є багато способів зробити це. Найпростішим способом буде використання блокнота для збереження в кодуванні UTF-8.
notepad-convert-to-utf-8
Якщо у вас багато файлів, ви можете зробити це за допомогою утиліти iconv у Linux (сервер VPS ). Наступний сценарій (збережений у імені файлу, наприклад, toUTF) перетворить один файл на UTF-8.
#!/bin/bash
# https://helloacm.com
if [ "$#" -ne 1 ] ||! [ -r "$1" ]; then
echo "Usage: $0 file1"
exit 1
fi
x=`file -bi $1 | grep 'utf' | wc -l`
if [ $x -eq 1 ]; then
echo "$1 already converted"
else
echo converting $1 to UTF8
iconv -f "gb2312" -t "UTF-8" $1 -o $1
fi
Нам потрібно уникати подвійного перетворення, щоб запобігти можливим проблемам. Перевірить, file -bi $1 | grep 'utf' | wc -l
чи файл уже закодовано UTF-8. Команда iconv -f “gb2312" -t “UTF-8" $1 -o $1 перетворить файл у UTF-8 із gb2132 (змініть це відповідно).
Тепер ми можемо зациклювати всі файли з розширенням *.php у поточному каталозі та всіх підкаталогах:
for x in `find. -type f -name "*.php"`; do
toUTF $x
done
Перетворення бази даних MySQL на UTF-8
У моєму випадку вся моя попередня база даних mysql за замовчуванням використовує кодування ANSI (зіставлення latin1_swedish_ci ). У сучасних браузерах вона пошкоджується, якщо є символи GB2312 (багатобайтові). Наприклад, PhpMyAdmin має кодування UTF-8, а символи ANSI/GB2312 у браузері відображатимуться пошкодженими.
Щоб зберегти ці дані в UTF-8, найпростішим способом є експорт таблиці (рекомендується phpMyAdmin) у файл SQL; переконайтеся, що ви експортуєте його за допомогою iso 8859-1 (повне покриття англійської мови). iso 8859-1 також відомий як ANSI, але символи GB2312 можна зберігати як багатобайтовий рядок. Якщо ви відкриєте SQL у блокноті, ви все одно зможете побачити китайські ієрогліфи, вам просто потрібно зберегти як кодування "UTF-8".
phpmyadmin
О, ще одна річ перед збереженням як UTF-8. Ви повинні виконати пошук і замінити слово «latin1» на «utf-8» у файлі SQL. Потім повторно імпортуйте SQL за допомогою phpMyAdmin, щоб усе було готово. Усі дані буде збережено та змінено на кодування UTF-8, а порівняння буде змінено (для varchar, text, longtext тощо) на utf8_general_ci.
Налаштування MySQL UTF-8
У PHP ви можете встановити кодування за замовчуванням:
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET utf8");
mysql_set_charset робить аналогічно:
Ви також можете встановити набір кодів за замовчуванням під час запуску сервера MySQL (збережіть накладні витрати на виклик вищезгаданих функцій). Перейдіть до редагування файлу /etc/mysql/my.cnf і перезапустіть сервер mysql, наприклад sudo service mysql restart. Додайте наступне до my.cnf :
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
Чому UTF-8?
UTF-8 обробляє букви алфавіту 1 байтом (те саме, що й ANSI), але використовує 3 байти для представлення 1 китайського символу, тоді як 2 байти використовуються, якщо кодується GB2312. Таким чином, якщо ваші сторінки містять багато китайських ієрогліфів, тоді ANSI/GB2312 економить простір, однак UTF-8 і ANSI займають рівно стільки ж місця, коли йдеться лише про англійські літери.
UTF-8 позбавляє вас проблем у майбутньому. Після перетворення на UTF-8 вам не доведеться турбуватися про кодування чи кодування. UTF-8 є більш сприятливим для міжнародних символів, оскільки більшість браузерів знають, як правильно відображати текст. У моєму випадку мені потрібно конвертувати файли в кодування UTF-8, оскільки мої улюблені текстові редактори PsPAD і Sublime text не знають, як правильно відображати ANSI/GB2312.