Проблема с кодировками.

bigramx

Новичок
Проблема с кодировками.

Всем доброго времени суток!

Есть такая проблема:
База данных в CP1251. Соединение с базой и кодировка тоже CP1251. Все скрипты PHP и код HTML в windows-1251.
С помощью $jquery.ajax() отправляю данные в скрипт test.php

В test.php делаю:
PHP:
$sText = $_REQUEST['text'];
$sText = iconv( "UTF-8", "WINDOWS-1251",  $sText );
$sQuery = 'UPDATE `test` SET `text`="'.$sText .'"  WHERE `id`="1"';
mysql_query($sQuery);
Проблема в том, что спецсимволы обрезаются. Если мы пытаемся передать через ajax строку:
"££ ♂♂ ♡♡"
то iconv возвращает пустой результат. Та же процедура с функцией mb_convert_encoding возвращает строку из знаков вопросов.

Помогите, уже пятый час бьюсь... Как перекодировать строку и сохранить все спецсимволы? Переходить на utf-8 здесь не реально, можно даже не предлагать.

Заранее спасибо за помощь!
 

Nicholas

Новичок
Наверно так:

℘ (℘ )
ℑ (ℑ )
ℜ (ℜ )

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

bigramx

Новичок
Это-то понятно... Именно так и планирую хранить их в базе, но вот как их к такому виду привести... (((
 

bigramx

Новичок
Автор оригинала: kstati
От чтения мануалов еще ни кто не умирал.
И я не умер! Ещё лет пять назад как...

Суть проблемы в следующем:
В test.php передана строка "Я люблю тебя ... ♥♥♥"

После всех обработок она превращается в строку вида:
PHP:
"Я люблю тебя ... ♥♥♥"
Вроде всё отлично, но! Эта строка пришла через $jquery.ajax();, то есть XMLHTTPRequest и соответственно пришла она в кодировке UTF-8.
А чтобы сохранить её в базе, и она была читаема на сайте, необходимо привести её к кодировке Windows-1251 перед записью в базу. И здесь-то и возникает основная проблема! И iconv и mb_convert_encoding в результате обработки строки отдают её в Windows-1251, но вместо спецсимволов выводят знаки вопросов!
Получается строка: "Я люблю тебя ... ???".

Вот и ломаю голову как изменить кодировку и при этом сохранить спецсимволы в том виде, в каком они были?
Есть идея такого плана: выбираем из строки всё, что начинается с & и заканчивается ;. Символы складываем в массив, а на том месте где оны должны быть пишем что-нибудь вроде {array_element}. После смены кодировки производим обратную замену. Но как перевести тогда сами эти специальные символы из UTF-8 в Windows-1251?
 

Gas

может по одной?
последовательности вида ♥♥♥
ни iconv, ни mb_convert_encoding никак не преобразуют, значит у тебя не они и тебе нужно привести пришедшую строку сначала к такому виду.
 

FB3

Новичок
А в win-1251 есть символы с таким кодом?
Я может че-то не понимаю, но если такой символ присутствует в кодировке UTF-8, то это вовсе не значит, что он должен быть и в кодировке win-1251.
 

Gas

может по одной?
но если такой символ присутствует в кодировке UTF-8, то это вовсе не значит, что он должен быть и в кодировке win-1251.
кодировки тут не причём, это html entity, они могут не показываться только если этих символов нет в _шрифте_ броузера. по идее так.
 

bigramx

Новичок
Всем спасибо! Разобрался, причина была в другом. Думаю, что это нужно даже обязательно в том или ином виде поместить в FAQ AJAX/PHP/Проблема с кодировкой.

PHP:
// Отправляем текст на сервере.
$.ajax({
	type: "POST",
	url: "test.php",
	data: "text="+$("#test_text").val(),
	dataType: "text",
	success: function(text){
		text = text==""?"Изменить текст...":text;
		$("#test_text").html(text);
	},
	error: function(msg){
		$("#test_text").html("Ошибка AJAX!");
	}
});
Так вот. Преобразование htmlentities для символов, которых нет в текущей кодировке происходит на уровне браузера, как мне удалось узнать погуглив этот вопрос.
Соответственно часть символов преобразуется к эспейсимволам вида
PHP:
&...;
И вот тут-то и возникает проблема! В результате через POST передаётся строка вида:
PHP:
text=blah-blah-blah♥blah-blah-blah
В результате, в переменной text в php лежит значение
PHP:
blah-blah-blah
, а не нужное нам
PHP:
blah-blah-blah♥blah-blah-blah
Вот и всё! Проблема решилась заменой всех амперсандов в $("#test_text").val() на %26.
PHP:
var sText = $("#test_text").val();
sText = sText .replace(/\&/g,"%26");

и при передаче ajax уже ставим
data: "text="+sText ,
 
Сверху