VeshchiyOleg
25-12-2006, 17:42
при передаче данных в XMLHTTPRequest из javascript русские символы из кодировки 1251 приходят в php в некоей кодировке, которую называют iso8859-1 (в доках по php), хотя на самом деле русские символы присутствуют только в iso8859-5. может это и одно и то же, однако обратно они приходят в ней же, а нифига не в 1251. iconv и прочие конверторы использовать не имею ни желания ни возможности - на локальной машине их нет, а я добавлять чего-либо не умею и не надо меня этому учить. а на сервере и играться как-то кощунственно и туда тоже надо доставлять дополнительные расширения. потом... возможно ведь и использование пользователями других символов, которые не будут входить уже в iso8859-5. следовательно перед отправкой я делаю строке encode в javascript`е. все символы (русские) приходят в виде %u0... для их переконвертации я написал свой обработчик:
function global_decode(
$str
) {
return strtr($str, array(
'%u0401' => 'Ё',
'%u0410' => 'А',
'%u0411' => 'Б',
'%u0412' => 'В',
'%u0413' => 'Г',
'%u0414' => 'Д',
'%u0415' => 'Е',
'%u0416' => 'Ж',
'%u0417' => 'З',
'%u0418' => 'И',
'%u0419' => 'Й',
'%u041A' => 'К',
'%u041B' => 'Л',
'%u041C' => 'М',
'%u041D' => 'Н',
'%u041E' => 'О',
'%u041F' => 'П',
'%u0420' => 'Р',
'%u0421' => 'С',
'%u0422' => 'Т',
'%u0423' => 'У',
'%u0424' => 'Ф',
'%u0425' => 'Х',
'%u0426' => 'Ц',
'%u0427' => 'Ч',
'%u0428' => 'Ш',
'%u0429' => 'Щ',
'%u042A' => 'Ъ',
'%u042B' => 'Ы',
'%u042C' => 'Ь',
'%u042D' => 'Э',
'%u042E' => 'Ю',
'%u042F' => 'Я',
'%u0430' => 'а',
'%u0431' => 'б',
'%u0432' => 'в',
'%u0433' => 'г',
'%u0434' => 'д',
'%u0435' => 'е',
'%u0436' => 'ж',
'%u0437' => 'з',
'%u0438' => 'и',
'%u0439' => 'й',
'%u043A' => 'к',
'%u043B' => 'л',
'%u043C' => 'м',
'%u043D' => 'н',
'%u043E' => 'о',
'%u043F' => 'п',
'%u0440' => 'р',
'%u0441' => 'с',
'%u0442' => 'т',
'%u0443' => 'у',
'%u0444' => 'ф',
'%u0445' => 'х',
'%u0446' => 'ц',
'%u0447' => 'ч',
'%u0448' => 'ш',
'%u0449' => 'щ',
'%u044A' => 'ъ',
'%u044B' => 'ы',
'%u044C' => 'ь',
'%u044D' => 'э',
'%u044E' => 'ю',
'%u044F' => 'я',
'%u0451' => 'ё',
'%u2116' => '№',
# а этим я конвертил из iso8859
chr(208).chr(129) => 'Ё',
chr(208).chr(144) => 'А',
chr(208).chr(145) => 'Б',
chr(208).chr(146) => 'В',
chr(208).chr(147) => 'Г',
chr(208).chr(148) => 'Д',
chr(208).chr(149) => 'Е',
chr(208).chr(150) => 'Ж',
chr(208).chr(151) => 'З',
chr(208).chr(152) => 'И',
chr(208).chr(153) => 'Й',
chr(208).chr(154) => 'К',
chr(208).chr(155) => 'Л',
chr(208).chr(156) => 'М',
chr(208).chr(157) => 'Н',
chr(208).chr(158) => 'О',
chr(208).chr(159) => 'П',
chr(208).chr(160) => 'Р',
chr(208).chr(161) => 'С',
chr(208).chr(162) => 'Т',
chr(208).chr(163) => 'У',
chr(208).chr(164) => 'Ф',
chr(208).chr(165) => 'Х',
chr(208).chr(166) => 'Ц',
chr(208).chr(167) => 'Ч',
chr(208).chr(168) => 'Ш',
chr(208).chr(169) => 'Щ',
chr(208).chr(170) => 'Ъ',
chr(208).chr(171) => 'Ы',
chr(208).chr(172) => 'Ь',
chr(208).chr(173) => 'Э',
chr(208).chr(174) => 'Ю',
chr(208).chr(175) => 'Я',
chr(208).chr(176) => 'а',
chr(208).chr(177) => 'б',
chr(208).chr(178) => 'в',
chr(208).chr(179) => 'г',
chr(208).chr(180) => 'д',
chr(208).chr(181) => 'е',
chr(208).chr(182) => 'ж',
chr(208).chr(183) => 'з',
chr(208).chr(184) => 'и',
chr(208).chr(185) => 'й',
chr(208).chr(186) => 'к',
chr(208).chr(187) => 'л',
chr(208).chr(188) => 'м',
chr(208).chr(189) => 'н',
chr(208).chr(190) => 'о',
chr(208).chr(191) => 'п',
chr(209).chr(128) => 'р',
chr(209).chr(129) => 'с',
chr(209).chr(130) => 'т',
chr(209).chr(131) => 'у',
chr(209).chr(132) => 'ф',
chr(209).chr(133) => 'х',
chr(209).chr(134) => 'ц',
chr(209).chr(135) => 'ч',
chr(209).chr(136) => 'ш',
chr(209).chr(137) => 'щ',
chr(209).chr(138) => 'ъ',
chr(209).chr(139) => 'ы',
chr(209).chr(140) => 'ь',
chr(209).chr(141) => 'э',
chr(209).chr(142) => 'ю',
chr(209).chr(143) => 'я',
chr(209).chr(145) => 'ё',
'в„–' => '№',
# '&' => '&',
));
}
всё бы ничего, но
- пропадает символ '+' (плюс) - передается в виде пробела :(
- все-таки хотелось бы нечто универсальное для любого юникода - не только кирилистического - вычислять разницу в кодах символов разных кодировок, я так понял, глупо... этим уменьшится только количество строк php, а не логика
зы
без encode не могу - всё после символа & пропадает как новая переменная - как при методе get
function global_decode(
$str
) {
return strtr($str, array(
'%u0401' => 'Ё',
'%u0410' => 'А',
'%u0411' => 'Б',
'%u0412' => 'В',
'%u0413' => 'Г',
'%u0414' => 'Д',
'%u0415' => 'Е',
'%u0416' => 'Ж',
'%u0417' => 'З',
'%u0418' => 'И',
'%u0419' => 'Й',
'%u041A' => 'К',
'%u041B' => 'Л',
'%u041C' => 'М',
'%u041D' => 'Н',
'%u041E' => 'О',
'%u041F' => 'П',
'%u0420' => 'Р',
'%u0421' => 'С',
'%u0422' => 'Т',
'%u0423' => 'У',
'%u0424' => 'Ф',
'%u0425' => 'Х',
'%u0426' => 'Ц',
'%u0427' => 'Ч',
'%u0428' => 'Ш',
'%u0429' => 'Щ',
'%u042A' => 'Ъ',
'%u042B' => 'Ы',
'%u042C' => 'Ь',
'%u042D' => 'Э',
'%u042E' => 'Ю',
'%u042F' => 'Я',
'%u0430' => 'а',
'%u0431' => 'б',
'%u0432' => 'в',
'%u0433' => 'г',
'%u0434' => 'д',
'%u0435' => 'е',
'%u0436' => 'ж',
'%u0437' => 'з',
'%u0438' => 'и',
'%u0439' => 'й',
'%u043A' => 'к',
'%u043B' => 'л',
'%u043C' => 'м',
'%u043D' => 'н',
'%u043E' => 'о',
'%u043F' => 'п',
'%u0440' => 'р',
'%u0441' => 'с',
'%u0442' => 'т',
'%u0443' => 'у',
'%u0444' => 'ф',
'%u0445' => 'х',
'%u0446' => 'ц',
'%u0447' => 'ч',
'%u0448' => 'ш',
'%u0449' => 'щ',
'%u044A' => 'ъ',
'%u044B' => 'ы',
'%u044C' => 'ь',
'%u044D' => 'э',
'%u044E' => 'ю',
'%u044F' => 'я',
'%u0451' => 'ё',
'%u2116' => '№',
# а этим я конвертил из iso8859
chr(208).chr(129) => 'Ё',
chr(208).chr(144) => 'А',
chr(208).chr(145) => 'Б',
chr(208).chr(146) => 'В',
chr(208).chr(147) => 'Г',
chr(208).chr(148) => 'Д',
chr(208).chr(149) => 'Е',
chr(208).chr(150) => 'Ж',
chr(208).chr(151) => 'З',
chr(208).chr(152) => 'И',
chr(208).chr(153) => 'Й',
chr(208).chr(154) => 'К',
chr(208).chr(155) => 'Л',
chr(208).chr(156) => 'М',
chr(208).chr(157) => 'Н',
chr(208).chr(158) => 'О',
chr(208).chr(159) => 'П',
chr(208).chr(160) => 'Р',
chr(208).chr(161) => 'С',
chr(208).chr(162) => 'Т',
chr(208).chr(163) => 'У',
chr(208).chr(164) => 'Ф',
chr(208).chr(165) => 'Х',
chr(208).chr(166) => 'Ц',
chr(208).chr(167) => 'Ч',
chr(208).chr(168) => 'Ш',
chr(208).chr(169) => 'Щ',
chr(208).chr(170) => 'Ъ',
chr(208).chr(171) => 'Ы',
chr(208).chr(172) => 'Ь',
chr(208).chr(173) => 'Э',
chr(208).chr(174) => 'Ю',
chr(208).chr(175) => 'Я',
chr(208).chr(176) => 'а',
chr(208).chr(177) => 'б',
chr(208).chr(178) => 'в',
chr(208).chr(179) => 'г',
chr(208).chr(180) => 'д',
chr(208).chr(181) => 'е',
chr(208).chr(182) => 'ж',
chr(208).chr(183) => 'з',
chr(208).chr(184) => 'и',
chr(208).chr(185) => 'й',
chr(208).chr(186) => 'к',
chr(208).chr(187) => 'л',
chr(208).chr(188) => 'м',
chr(208).chr(189) => 'н',
chr(208).chr(190) => 'о',
chr(208).chr(191) => 'п',
chr(209).chr(128) => 'р',
chr(209).chr(129) => 'с',
chr(209).chr(130) => 'т',
chr(209).chr(131) => 'у',
chr(209).chr(132) => 'ф',
chr(209).chr(133) => 'х',
chr(209).chr(134) => 'ц',
chr(209).chr(135) => 'ч',
chr(209).chr(136) => 'ш',
chr(209).chr(137) => 'щ',
chr(209).chr(138) => 'ъ',
chr(209).chr(139) => 'ы',
chr(209).chr(140) => 'ь',
chr(209).chr(141) => 'э',
chr(209).chr(142) => 'ю',
chr(209).chr(143) => 'я',
chr(209).chr(145) => 'ё',
'в„–' => '№',
# '&' => '&',
));
}
всё бы ничего, но
- пропадает символ '+' (плюс) - передается в виде пробела :(
- все-таки хотелось бы нечто универсальное для любого юникода - не только кирилистического - вычислять разницу в кодах символов разных кодировок, я так понял, глупо... этим уменьшится только количество строк php, а не логика
зы
без encode не могу - всё после символа & пропадает как новая переменная - как при методе get