Json и кириллица

Василий М.

Новичок
В нашем проекте используется функция, взятая вроде из разработки Д. Котерова, она является аналогом json_encode для 1251:

PHP:
function php2js($a=false)
{
	if (is_null($a) || is_resource($a)) {
		return 'null';
	}
	if ($a === false) {
		return 'false';
	}
	if ($a === true) {
		return 'true';
	}
	
	if (is_scalar($a)) {
    	if (is_float($a)) {
			//Always use "." for floats.
			$a = str_replace(',', '.', strval($a));
		}

		// All scalars are converted to strings to avoid indeterminism.
		// PHP's "1" and 1 are equal for all PHP operators, but
		// JS's "1" and 1 are not. So if we pass "1" or 1 from the PHP backend,
		// we should get the same result in the JS frontend (string).
		// Character replacements for JSON.
		static $jsonReplaces = array(
			array("\\", "/", "\n", "\t", "\r", "\b", "\f", '"'),
    		array('\\\\', '\\/', '\\n', '\\t', '\\r', '\\b', '\\f', '\"')
    	);

    	return '"' . str_replace($jsonReplaces[0], $jsonReplaces[1], $a) . '"';
	}

	$isList = true;

	for ($i = 0, reset($a); $i < count($a); $i++, next($a)) {
		if (key($a) !== $i) {
			$isList = false;
			break;
		}
	}

	$result = array();
	
	if ($isList) {
		foreach ($a as $v) {
			$result[] = php2js($v);
		}
	
		return '[ ' . join(', ', $result) . ' ]';
	} else {
		foreach ($a as $k => $v) {
			$result[] = php2js($k) . ': ' . php2js($v);
		}

		return '{ ' . join(', ', $result) . ' }';
	}
}
В упор не могу понять как она работает. Почему заменяются лишь спецсимволы, почему сам текст не кодируется?
 

Ragazzo

TDD interested
Причина на стороне клиента, например \" js парсер json сочтет как корректное выражение и получишь ошибку, поэтому например нужно \\", то же и с остальными, насчет остального хз.
 

damner2

Новичок
Василий М.
А не хочешь заменить её на:
PHP:
function php2js($a=false) {
  return json_encode($a);
}
?

мож все проблемы решатся...
 

Absinthe

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

Василий М.

Новичок
я не пойму - JSON требует обязательно наличия UTF-8 или нет? Ведь функция выше работает вместе с
header('Content-type: application/json; charset=windows-1251');
я получаю корректный JSON. В чем загвоздка? Что не так? Что не правильно?
 

AmdY

Пью пиво
Команда форума
Василий М.
джсон не требует утф, это если аджакс гоняется, то там утф.
 

Василий М.

Новичок
AmdY
ок. а как же это все работает вместе в аксом? Я шлю json в windows-1251 и это все корректно работает. Магия на стороне клиента или что?
 

AmdY

Пью пиво
Команда форума
Василий М.
ты через котеровскую либу или как? я не специалист в неутф кодировках при аджаксе.
самое смешное, что это может быть двойная ошибка, которая складывается и даёт правильный результат.
 

A1x

Новичок
я конвертировал на сервере 1251 в УТФ-8, кодировал json_encode и отправлял
работало, как ни странно
 

pitbull0007

Новичок
json должен отправляться только в кодировке utf-8 даже если проект на windows-1251 иначе пойдут символы "\u0410\u043d\u0434\u0440\u0435\u0439" вместо нормальных
 

radioheaded

PHP нуб
Что значит, сам текст не кодируется? А как он должен кодироваться, если он в 1251? Вас удивляет, что в json-строке «а» это просто «а», а не слэш-икс-многоцифр или что?
 

damner2

Новичок
На скока я помню, JS хранит все данные ТОЛЬКО в UTF-16 (или типа того). И с DOM работает тож в этой кодировке.
Так что можно сделать что-нить из:
1. Использовать в php json_encode и отдавать с заголовком про utf-8
2. Использовать json_encode делать iconv в cp1251 и отдавать со старым заголовком

эээ... тоесть второй пункт можно сделать тока в php 5.4 с опцией JSON_UNESCAPED_UNICODE (думаю у тя там php 5.2 максимум, судя по тому, что проект в 1251 и ничё не делается для того, чтоб это изменить)
 

A1x

Новичок

weregod

unserializer
Василий М., переводите проект в UTF-8
задача решается один раз вместо многоразовых фиксов и костылей
однобайтовые кодировки в вебах уже неактуальны
 

radioheaded

PHP нуб
Столько нафлудили, а автор даже проблему не описал ) Или это и есть проблема — «В упор не могу понять как она работает.»?
 
Сверху