Нечитаемый текст приходит на почту

allmoney

Новичок
Нечитаемый текст приходит на почту

Страница в кодировке UTF-8
В отправляемом письме кодировку тоже указываю:
'Content-Type: text/plain; charset=utf-8'."\r\n" .

Добавляемый скриптом текст отображается на русском, а вот вводимый пользователем в форму - некорректно, вместо русских букв белиберда:

ТЕКСТ СООБЩЕНИЯ:

Это сообщение было отправлено с сайта 23/11/2006 в 12:55

--------- Начало сообщения пользователя ---------

%u041F%u0440%u0438%u0432%u0435%u0442! %u041A%u0430%u043A %u0434%u0435%u043B%u0430?

--------- Конец сообщения пользователя ---------

Подскажите, пожалуйста, что не так?
 

WP

^_^
Это UCS-2BE. Форма очевидно отправляется Javascript'ом, который преобразует всё в эту разновидность Unicode. PHP-скрипт должен искать такие последовательности и декодировать используя, например, [m]iconv[/m].

-~{}~ 23.11.06 14:36:

Советую покурить http://phpclub.ru/faq/wakka.php?wakka=encodings/encodings4&v=336
А именно,
PHP:
$body = '%u041F%u0440%u0438%u0432%u0435%u0442! %u041A%u0430%u043A %u0434%u0435%u043B%u0430';
echo preg_replace('#%u([0-9A-F]{4})#se','iconv("UTF-16BE","UTF-8",pack("H4","$1"))',$body);
// Привет! Как дела
 

allmoney

Новичок
Спасибо! Супер! Помогло :) Ужас,.. сам бы никогда не догадался :)

-~{}~ 23.11.06 15:36:

WP,
Теперь только осталась проблема в поле отправитель. Сделал так:

$name = preg_replace('#%u([0-9A-F]{4})#se','iconv("UTF-16BE","UTF-8",pack("H4","$1"))',stripslashes($name));
$headers = "From: $name <$email_from1>\r\n";

Отправитель пишется так:
РРјРёССРёР№ [[email protected]]

Почему не распозналась кодировка? В самом сообщении всё ОК!
 

WP

^_^
А это поле имеет кодировку?

> $name = preg_replace('#%u([0-9A-F]{4})#se','iconv("UTF-16BE","UTF-8",pack("H4","$1"))',stripslashes($name));
Фу! Во-первых stripslashes (в случае magic_quotes_gpc = On) нужно делать сразу всем параметрам в начале скрипта.
Во-вторых %uXXXX надо обрабатывать тоже во всех переменных. Т.е. делаешь
PHP:
function unicode_urldecode_callback($m)
{
 $dec = hexdec($m[1]);
 $utf = '';
 if ($dec < 128) {$utf = chr($dec);}
 elseif ($dec < 2048)
 {
  $utf = chr(192 + (($dec - ($dec % 64)) / 64));
  $utf .= chr(128 + ($dec % 64));
 }
 else
 {
  $utf = chr(224 + (($dec - ($dec % 4096)) / 4096)).
		 chr(128 + ((($dec % 4096) - ($dec % 64)) / 64)).
		 chr(128 + ($dec % 64));
 }
 return $utf;
}
function unicode_urldecode($string)
{
 return preg_replace_callback('~%u([a-f\d]{4})~i','unicode_urldecode_callback',$string);
}
function unicode_urldecode_mixed($mixed)
{
 if (is_array($mixed)) {return array_map('unicode_urldecode_mixed',$mixed);}
 return unicode_urldecode($mixed);
}
$_GET = unicode_urldecode_mixed($_GET);
$_POST 	= unicode_urldecode_mixed($_POST);
 

allmoney

Новичок
WP
Не понял, что сделать, чтобы отправитель стал по-русски :(

-~{}~ 24.11.06 12:51:

WP,
Как указать кодировку для поля "отправитель"?
 

WP

^_^
Прогони поле отправитель через эту функцию.
PHP:
function utf8_win1251($a)
{
 static $_utf8win1251 = array(
"\xD0\x90"=>"\xC0","\xD0\x91"=>"\xC1","\xD0\x92"=>"\xC2","\xD0\x93"=>"\xC3","\xD0\x94"=>"\xC4",
"\xD0\x95"=>"\xC5","\xD0\x81"=>"\xA8","\xD0\x96"=>"\xC6","\xD0\x97"=>"\xC7","\xD0\x98"=>"\xC8",
"\xD0\x99"=>"\xC9","\xD0\x9A"=>"\xCA","\xD0\x9B"=>"\xCB","\xD0\x9C"=>"\xCC","\xD0\x9D"=>"\xCD",
"\xD0\x9E"=>"\xCE","\xD0\x9F"=>"\xCF","\xD0\xA0"=>"\xD0","\xD0\xA1"=>"\xD1","\xD0\xA2"=>"\xD2",
"\xD0\xA3"=>"\xD3","\xD0\xA4"=>"\xD4","\xD0\xA5"=>"\xD5","\xD0\xA6"=>"\xD6","\xD0\xA7"=>"\xD7",
"\xD0\xA8"=>"\xD8","\xD0\xA9"=>"\xD9","\xD0\xAA"=>"\xDA","\xD0\xAB"=>"\xDB","\xD0\xAC"=>"\xDC",
"\xD0\xAD"=>"\xDD","\xD0\xAE"=>"\xDE","\xD0\xAF"=>"\xDF","\xD0\x87"=>"\xAF","\xD0\x86"=>"\xB2",
"\xD0\x84"=>"\xAA","\xD0\x8E"=>"\xA1","\xD0\xB0"=>"\xE0","\xD0\xB1"=>"\xE1","\xD0\xB2"=>"\xE2",
"\xD0\xB3"=>"\xE3","\xD0\xB4"=>"\xE4","\xD0\xB5"=>"\xE5","\xD1\x91"=>"\xB8","\xD0\xB6"=>"\xE6",
"\xD0\xB7"=>"\xE7","\xD0\xB8"=>"\xE8","\xD0\xB9"=>"\xE9","\xD0\xBA"=>"\xEA","\xD0\xBB"=>"\xEB",
"\xD0\xBC"=>"\xEC","\xD0\xBD"=>"\xED","\xD0\xBE"=>"\xEE","\xD0\xBF"=>"\xEF","\xD1\x80"=>"\xF0",
"\xD1\x81"=>"\xF1","\xD1\x82"=>"\xF2","\xD1\x83"=>"\xF3","\xD1\x84"=>"\xF4","\xD1\x85"=>"\xF5",
"\xD1\x86"=>"\xF6","\xD1\x87"=>"\xF7","\xD1\x88"=>"\xF8","\xD1\x89"=>"\xF9","\xD1\x8A"=>"\xFA",
"\xD1\x8B"=>"\xFB","\xD1\x8C"=>"\xFC","\xD1\x8D"=>"\xFD","\xD1\x8E"=>"\xFE","\xD1\x8F"=>"\xFF",
"\xD1\x96"=>"\xB3","\xD1\x97"=>"\xBF","\xD1\x94"=>"\xBA","\xD1\x9E"=>"\xA2");
 if (is_array($a))
 {
  foreach ($a as $k => $v)
  {
   if (is_array($v)) {$a[$k] = utf8_win1251($v);}
   else {$a[$k] = strtr($v,$_utf8win1251);}
  }
  return $a;
 }
 else {return strtr($a,$_utf8win1251);}
}
 
Сверху