Преобразование строки из (%uXXXX)* в (русские буквы)

Altex

Новичок
Преобразование строки из (%uXXXX)* в (русские буквы)

Помогите, пожалуйста, не могу преобразовать строку из такого формата ->
%u0421%u0430%u043C%u0430%u0440%u0435
в обычную русскую кодировку, например в win-cp1251
?
 

Bloody

Guest
Это во-первых urldecode(), во-вторых utf8_decode()...
 

Altex

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

Bloody

Guest
Действительно... Где?..
Ваще-то если это UTF8, то можно сделать так:

$string='(%uXXXX)*';
$str2=preg_replace("/%u([0-9A-Z][0-9A-Z])([0-9A-Z][0-9A-Z])/ie","pack('HH','\\1','\\2')",$string);
echo utf8_decode($str2);

С другими строками это выходит, но с приведенной тобой - нет...
 

Profic

just Profic (PHP5 BetaTeam)
это не utf8 это usc2 или unicode в чистом (почти) виде %)
1) в начале преобразуешь это в юникод нормальный
2) [m]iconv[/m]
 

Bloody

Guest
Ну, юникод нормальный это вот вторая строка в моем примере... Ну, а потом, значит не utf8_decode, а iconv... Я правильно понял, profic?..
 

Profic

just Profic (PHP5 BetaTeam)
Что-то в районе такого:
PHP:
$str = '%u0421%u0430%u043C%u0430%u0440%u0435';
$str2 = preg_replace ('~%u([0-9A-F]{2})([0-9A-F]{2})~ie', 'chr (dechex ("\1")) . chr (dechex ("\2"))', $str);
echo iconv ('UCS-2', 'UTF-8', $str2);
Но, у меня из этого получается каша полная: ЏЁЃЁМЗ :(
 

Bloody

Guest
-------------------------------
Сорри, здесь была глупость...
-------------------------------
 

Bloody

Guest
Все, люди - вот это заработало:

$string='%u0421%u0430%u043C%u0430%u0440%u0435';
$str2=preg_replace("/%u([0-9A-Z][0-9A-Z])([0-9A-Z][0-9A-Z])/ie","chr(hexdec('\\1')).chr(hexdec('\\2'))",$string);
echo iconv("UCS-2","WINDOWS-1251",$str2);

Искомая строка: "Самаре"
 

Altex

Новичок
Спасибо люди, я в вас не сомневался!
Большое спасибо!
 

vano

Guest
Автор оригинала: Net Dog
А где ты эту строку то выкопал?
Обычный GET запрос, например из поисковой формы, передаваемый в уникоде. wap поиск на русском - самый обычный пример.


Автор оригинала: Bloody
Все, люди - вот это заработало:

$string='%u0421%u0430%u043C%u0430%u0440%u0435';
$str2=preg_replace("/%u([0-9A-Z][0-9A-Z])([0-9A-Z][0-9A-Z])/ie","chr(hexdec('\\1')).chr(hexdec('\\2'))",$string);
echo iconv("UCS-2","WINDOWS-1251",$str2);

Искомая строка: "Самаре"
Хм, у меня иконв результаты этого пример превращает в пустые строки. Перекодирование в UTF-8 дайт кракозябли...
 

Profic

just Profic (PHP5 BetaTeam)
Хм, у меня иконв результаты этого пример превращает в пустые строки. Перекодирование в UTF-8 дайт кракозябли...
значит где-то фраузер перекодирует не туда или кто-то еще
PHP:
error_reporting (E_ALL);
$str = '%u0421%u0430%u043C%u0430%u0440%u0435';
$str2 = preg_replace ('~%u([\dA-F]{2})([\dA-F]{2})~ie', 'chr (hexdec ("\1")) . chr (hexdec ("\2"))', $str);
echo iconv ('UCS-2', 'WINDOWS-1251', $str2);
Вот это отдает в cp1251 "Самаре", если сменить WINDOWS-1251 на UTF-8, то отдаст в UTF-8. Проверено, мин нет %)
 

Exil

Guest
мне это напомнило один жуткий баг форумного движка phpBB2.... там при включении gzip все записи в майскул БД летели в виде юника...#&1025 и.т.п поидее-то должно и показываться ан-нет... и причем. стоило мне отлабать там htmlspecialchars - все заработало.. - он делал это два раза, в результе свой же резуль конвертил в #&amp&1025 (может че и путаю, но типа того :)) ).. а оказалось, что форма записи в БД(поста топика) просто была в кодировке iso :)) я 4ре дня бился, пока вдруг не пришло озарение... только одного понять немогу.. почему буг появлялся только при включенном gzip'е ?


короче, че хочу сказать... первым делом надо смореть, вдруг ошибка на самом корню(например страница извлечения этого дела без указания кодировки... а он её в юникод для надежности... )
хотя, если ВАП.. тода незна. во всяком случае, рульный конвертер кодира, утаскиваю с урчанием и респектом Bloody
 

nagash

Guest
я уже писал на этом форуме функцию... =)
в поиск!
 
Сверху