06:27

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
[ok]

MySQL/UTF-8

читать дальше

upd: решено - данные в базе надо проверять не из консоли, а с помощью php-скрипта, т.к. консоль не всегда может корректно отобразить символы UTF-8.
Спасибо  neo_rage.

Комментарии
01.04.2012 в 06:28

The day that you stop running is the day that you arrive.
вы бы скрипт показали, который не заносит у вас
01.04.2012 в 06:30

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
<?php
$i = $_GET['text'];
$link = mysql_connect('localhost', 'root', 'niagara');
if ($link == false)
echo "Ошибка соединения";
else
{
mysql_select_db('test', $link);
mysql_query("insert into one(area) values($i)");
mysql_close($link);
}
?>
01.04.2012 в 06:35

The day that you stop running is the day that you arrive.
values(\"$i\")
01.04.2012 в 06:37

The day that you stop running is the day that you arrive.
т.к. без кавычек можно передавать только числовые значения.

ещё правильнее вызывать на переданных переменных mysql_real_escape_string, чтобы потом не думать о иньекциях:
$i=mysql_real_escape_string($i);
а потом уже вставлять: mysql_query("insert into one(area) values(\"$i\")"); - этот запрос для мускула будет выглядеть так:
insert into one(area) values("$i").
а int и float приводить явно: $i=(int)$i; и $i=(float)$i; соответственно.

заодно можно почитать про insert...set и update...set, чтобы при редактировании использовать тот же запрос с минимальными поправками.
01.04.2012 в 07:00

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Спасибо, в таком виде уже стало латиницу кушать и немного кириллицу.

<?php
$i = $_GET['text'];
$link = mysql_connect('localhost', 'root', 'niagara');
if ($link == false)
echo "Ошибка соединения";
else
{
$i = mysql_real_escape_string($i);
mysql_select_db('test', $link);
mysql_query("insert into one(area) values(\"$i\")");
mysql_close($link);
}
?>

Кириллицу через скрипт добавляет, но она отображается кракозябрами. Хотя из консоли она всё равно не добавляется.


echo mysql_client_encoding($link); показывает, что соединение установлено в utf8. Отсюда вопрос - где проблема?
01.04.2012 в 07:04

The day that you stop running is the day that you arrive.

01.04.2012 в 08:53

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
так что надо явно прописать в заголовках html

Это которое ?
01.04.2012 в 09:17

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
mysql_query("SET NAMES utf8"); результатов не дало. Всё также закорючками.
01.04.2012 в 14:52

The day that you stop running is the day that you arrive.
Ryuzaki_rnd, в браузере кодировку тоже надо проверить, я писал
01.04.2012 в 14:56

отделите мухи от котлет, консоль и хттп в данном случае две разные проблемы. в принципе не нужно быть семи пядей во лбу чтобы посмотреть на ошибку, увидеть там три байта, и заподозрить что вы ему суёте восьмибитный текст вместо ютф8. разбирайтесь с самой консолью, нет у вас там никакого юникода. аналогично, чтобы юникод пришёл в скрипт, нужно чтобы браузер отправил данные в юникоде.

ну то есть не надо здесь спрашивать какую гаечку подкрутить, надо понять как всё вместе работает, иначе страшный суд, вечные муки, ад и погибель.
01.04.2012 в 21:45

Sanctus Satanas
Это которое <meta http-equiv="content-type" content="text/html" charset="utf-8">?
Мысль почти правильная. Вообще кодировка передаётся в HTTP-заголовках. Выглядит это примерно так:
Content-Type: text/html; charset="utf-8"
Этого не будет в исходном коде страницы никоим образом. Посмотреть можно через Firebug (для FF) или Opera Dragonfly (понятно, для чего) или Web Inspector (для Safari/Chrome). Ну или чем-нибудь трафик посниффать. )
Браузер всегда будет ориентироваться на этот заголовок. Задаётся или настройками сервера (см. мануалы к апачу тому же) или в PHP это можно сделать так:
header('Content-Type: text/html; charset="utf-8"');
Обязательно должно выполняться до любого вывода на страницу (т.к. PHP сразу же пошлёт заголовки при первом же выводе).
Если же заголовка нет и по какой-то причине нет возможности поставить (ну мало ли…), то тогда можно задать прямо в HTML через тег META. Который позволяет сэмулировать отсылку заголовка.
Если же ни того, ни другого нет — кодировка браузеру неизвестна и он волен её выбрать наугад, какая больше ему понравится. )
По поводу форм: хотя этого нет в стандартах, но браузеры соблюдают правило отсылать формы в той же кодировке, в которой была страница.
Есть и маленькое исключение — AJAX-запросы, емнип, всегда будут в UTF-8, хочется этого или нет.
Это то, что касается кодировки в браузере.
02.04.2012 в 00:12

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, Мысль почти правильная.... header('Content-Type: text/html; charset="utf-8"');

Я тоже в начале про HTTP-заголовки подумал, но меня смутило "neo_rage, так что надо явно прописать в заголовках html и проверить кодировку в самом браузере". Потому и привёл вариант с html.)
Прописал в начале скрипта header('Content-Type: text/html; charset="utf-8"'); Никакого эффекта.


AJAX-запросы, емнип, всегда будут в UTF-8, хочется этого или нет.

О, а вот это полезная инфа. Спасибо. То есть любые данные, которые ajax посылает серверу будут перекодированы в UTF-8 перед отправкой? Необходимо ли, при передаче даннных ajax-запросу, прогонять их через encodeURIComponent() или XmlHttp.setRequestHeader("Content-Type", "text/html; charset=utf-8") будет достаточно? *извиняюсь, если вопросы вообще из разных категорий*


ehlo_kitty, разбирайтесь с самой консолью, нет у вас там никакого юникода.

Что имеется в виду? Что база не в utf8, или что винда отправляет запрос не в utf8?


не надо здесь спрашивать какую гаечку подкрутить, надо понять как всё вместе работает, иначе страшный суд, вечные муки, ад и погибель.

Никто не отрицает полезность фундаментальных знаний, но это приходит со временем. Но есть ситуации, когда этого времени нет и решение нужно уже сейчас. Так что отвечать на вопрос в стиле "сам дурак, учи матчать" не есть лучший способ обучения и помощи, без обид.
02.04.2012 в 01:11

The day that you stop running is the day that you arrive.
в http тоже надо.

так в браузере какая кодировка стоит? поставьте верную вручную.
02.04.2012 в 01:41

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
neo_rage, так в браузере какая кодировка стоит? поставьте верную вручную.

Chrome: Изначально стоит UTF-8. Ни на что поменять не даёт. В базу заносятся кракозябрики.
IE: Изначально стоит UTF-8. Даёт менять кодировку. В базу заносятся кракозябрики.
FireFox: Изначально стоит UTF-8. Даёт менять кодировку. В базу заносятся кракозябрики.
Opera: Изначально стоит UTF-8. Даёт менять кодировку. В базу заносятся кракозябрики.


Базу смотрю из консоли, через select * from tablename;
02.04.2012 в 01:45

The day that you stop running is the day that you arrive.
ерунда какая-то. )
ну, посмотрите базу через скрипт, выбрав занесенное.
консоль - не показатель.
02.04.2012 в 02:01

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
neo_rage, ерунда какая-то. )
ну, посмотрите базу через скрипт, выбрав занесенное.
консоль - не показатель.


Ага, вот оно. Если выводить через такое вот:
<?php
$link = mysql_connect('localhost', 'root', 'niagara');
if ($link == false)
echo "Ошибка соединения";
else
{
mysql_select_db('test', $link);
$result = mysql_query("select * from one");
while ($row = mysql_fetch_assoc($result))
{
echo $row["id"] . " ";
echo $row["area"] . "
";
}
mysql_close($link);
}
?>


то выводит содержимое таблицы, из которого ясно, что всё это время туда заносились нормальные данные. Хоть с принудительной установкой кодировки, хоть без неё. И русские нормально, и английские.

Приношу свои извинения, что не допёр сразу, проверить с помощью скрипта, а не консольно. Получается, что проблемы то и не было. По крайней мере с данными в таблице.

Значит проблема в том, что консоль винды не умеет отображать кириллические символы UTF-8;

Спасибо за помощь.
02.04.2012 в 02:02

The day that you stop running is the day that you arrive.
да не за что)
но html и http хидеры все равно ставьте
02.04.2012 в 02:06

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
neo_rage, но html и http хидеры все равно ставьте

То бишь, в страничках прописывать , а в скриптах - header('Content-Type: text/html; charset="utf-8"');. Правильно?
02.04.2012 в 02:14

Sanctus Satanas
Ryuzaki_rnd
То бишь, в страничках прописывать , а в скриптах
Правильно — в заголовках. При наличии заголовка тег meta игнорируется.
Но часто пишут и там и там для надёжности — типа, вдруг отвалится конфиг или header() случайно уберут?

консоль винды не умеет отображать кириллические символы UTF-8
Так на скриншоте так-то вообще cp866. ;-)

То есть любые данные, которые ajax посылает серверу будут перекодированы в UTF-8 перед отправкой?
Я честно скажу, что не помню, как оно должно быть и можно ли это изменить (нагуглить по-быстрому тоже не удалось), но по умолчанию — это точно так и я сталкивался с этой проблемой когда-то давно, когда страница была в 1251. ) Никаких специальных действий не надо, оно само.
02.04.2012 в 02:16

The day that you stop running is the day that you arrive.
да, на всякий случай и там и там
02.04.2012 в 02:29

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, Правильно — в заголовках.

*блин, забыл что meta здесь не отображается ^^"*

То есть, если страничка, то я в ней обязательно указываю:
1) кодировку в теге html (это ж вроде заголовок, или нет?)
2) дублирую указание кодировки в теге meta.

Если скрипт, то я в начале скрипта указываю:
1) header('Content-Type: text/html; charset="utf-8"');

Так?


neo_rage, Спасибо!
02.04.2012 в 03:00

Sanctus Satanas
=_=

Ладно, ещё раз. )
И кодировка и тип данных содержимого указывается в HTTP-заголовках. )) В частности, заголовок может формироваться веб-сервером самостоятельно для данного типа файла. Или, тоже в частности, в PHP HTTP-заголовки можно задать функцией header().
Если кодировка НЕ указана в заголовке, то браузер смотрит, нет ли этого в содержимом — т.е. в отданном HTML. И если видит там тег META с Content-Type, то прекращает разбор страницы и начинает заново с указанной там кодировкой.

кодировку в теге html (это ж вроде заголовок, или нет?)
Неа, речь шла про HTTP-заголовки.
Я вообще рекомендую для понимания сути открыть отладчик в браузере и посмотреть, как реально происходит обмен данными между веб-сервером и браузером.
Пример также можно найти в вики: en.wikipedia.org/wiki/Hypertext_Transfer_Protoc...
02.04.2012 в 03:02

Никто не отрицает полезность фундаментальных знаний, но это приходит со временем. Но есть ситуации, когда этого времени нет и решение нужно уже сейчас. Так что отвечать на вопрос в стиле "сам дурак, учи матчать" не есть лучший способ обучения и помощи, без обид.

решение чего вам нужно сейчас? что вам захотелось найти в вебдеве? что это для вас: работа, хобби, минутная прихоть? энивейс тут не обучают, обучаются всегда самостоятельно, а помощь вам вот оказали, а зря, потому что вы же ничего не поняли.
02.04.2012 в 05:51

The day that you stop running is the day that you arrive.
Я когда начинал разбираться в пхп и мускуле - тоже нифига не понимал... И сейчас немного жалко, что особо некого спросить было. Хотя опыт и блаблабла.
02.04.2012 в 05:54

ну а я когда начинал читал документацию, а все вопросы задавал гуглю, и ничуть об этом не жалею, и всем оголтело советую.
02.04.2012 в 06:01

The day that you stop running is the day that you arrive.
По-моему, никто не оспаривает полезность документации.
02.04.2012 в 06:39

да блин, не надо про неё вообще рассуждать, надо её брать и читать