Как преобразовать GB2312 (или другие символы, отличные от ANSI) в кодировку UTF-8 (как MySQL, так и файловая кодировка)
Мой первый сайт 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».
блокнот-преобразовать-в-utf-8
Если у вас много файлов, вы можете сделать это с помощью утилиты iconv в Linux (VPS Server ). Следующий сценарий (сохраненный в имени файла, например, 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, текста, длинного текста и т. д.) на 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.