Символы Utf-8 отображаются как ISO-8859-1

У меня проблема с вставкой/чтением содержимого utf8 из БД. Все проверки, которые я делаю, похоже, указывают на тот факт, что содержимое в моей БД должно быть закодировано в кодировке utf8, однако, похоже, оно закодировано в латинице. Данные изначально импортируются из сценария PHP из CLI.

Конфигурация:

Zend Framework Version: 1.10.5
mysql-server-5.0:   5.0.51a-3ubuntu5.7
php5-mysql:     5.2.4-2ubuntu5.10
apache2:        2.2.8-1ubuntu0.16
libapache2-mod-php5:    5.2.4-2ubuntu5.10

Подтверждения:

-mysql:

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_bin        |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+

-база данных

created with 
CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_bin;
CREATE SCHEMA `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;

mysql> status;
--------------
mysql  Ver 14.12 Distrib 5.0.51a, for debian-linux-gnu (i486) using readline 5.2

Connection id:          7
Current database:       mydb
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.0.51a-3ubuntu5.7-log (Ubuntu)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/run/mysqld/mysqld.sock
Uptime:                 9 min 45 sec

-sql: перед выполнением вставок я запускаю

SET names 'utf8';

-php: перед вставкой я использую utf8_encode() и mb_detect_encoding(), что дает мне «UTF-8». После извлечения содержимого из базы данных и перед его отправкой пользователю mb_detect_encoding() также выдает «UTF-8».

Проверочный тест:

единственный способ для меня правильно отображать контент - установить тип контента на латиницу (если я обнюхиваю трафик, я вижу заголовок типа контента с ISO-8859-1):

ini_set('default_charset', 'ISO-8859-1');

Этот тест показывает, что содержимое выходит как латиница. Я не понимаю, почему. У кого-нибудь есть идеи?

Спасибо.


person Max    schedule 22.07.2010    source источник
comment
Какой набор символов установлен на вашем веб-сервере (Apache?) для файлов php? Какой набор символов вы пытались установить для utf в PHP? Как пробовали ставить?   -  person Amber    schedule 22.07.2010
comment
Не могли бы вы уточнить, какие параметры конфигурации вы имеете в виду? Единственное, что я могу придумать на уровне сервера, это HTTP-заголовок типа контента, и он устанавливается с помощью функции ini_set(), как описано выше. Если у вас есть другие предложения, пожалуйста, дайте мне знать.   -  person Max    schedule 23.07.2010


Ответы (2)


Что ж, я обнаружил, что SET NAMES не так уж и хорош. Взгляните на документацию...

Обычно я выполняю 4 запроса:

SET CHARACTER SET 'UTF8';
SET character_set_database = 'UTF8';
SET character_set_connection = 'UTF8';
SET character_set_server = 'UTF8';

Попробуйте и посмотрите, поможет ли это вам...

Да, и помните, все символы UTF-8 ‹= 127 также являются допустимыми символами ISO-8859-1. Таким образом, если в потоке есть только символы ‹= 127, mb_detect_encoding попадет в кодировку с более высокой распространенностью (по умолчанию "UTF-8")...

person ircmaxell    schedule 22.07.2010

  1. Что вы делаете перед извлечением? Также «SET NAMES utf8;»? В противном случае MySQL автоматически преобразует кодировку в кодировку, указанную соединением как используемую.
  2. Если даже не это, что показывает SHOW FULL COLUMNS FROM table;? Наличие таблицы с кодировкой по умолчанию не означает, что столбец такой. то есть это действительно:

.

CREATE TABLE test (
    `name` varchar(10) character set latin1
) CHARSET=utf8
person Wrikken    schedule 22.07.2010