PDA

Просмотр полной версии : Unicode


Solker
19.07.2009, 15:05
"\u041d\u0430 \u043c\u043e\u043b\u043e\u0434\u043e\u0433\u043e"

Как средствами PHP преобразовать эту строку в обычную кодировку cp1251 например.

На выходе должно получится
"На молодого"

Я посмотрел в мануле, там есть функции для работы с unicode, но они появятся только в 6 версии.
А как сделать поддержу в 5, этих функций, я не знаю.

Надеюсь на помощь, спасибо.

mailbrush
19.07.2009, 15:17
РНР5 и Юникод - это песнь, что стону подобна. Потому что эти два понятия несовместимы...

Forcer
19.07.2009, 15:42
РНР5 и Юникод - это песнь, что стону подобна. Потому что эти два понятия несовместимы...
это такой неслабый easter egg в php :D

Pashkela
19.07.2009, 15:46
Почему несовместимы? А как это по вашему сделано?:)

http://2cyr.com/decode/?lang=ru

Forcer
19.07.2009, 16:10
Почему несовместимы? А как это по вашему сделано?:)

http://2cyr.com/decode/?lang=ru
есть тысяча и один способ это сделать без php.

Pashkela
19.07.2009, 17:22
Вот статья:

http://www.linkexchanger.su/2008/41.html

вот пример к статье:

http://www.linkexchanger.su/example_json/json2.zip

там два файла:

1. JSON.php - класс
2. json2.php - пример работы с классом

Замените содержимое json2.php на вот это:


<pre>
<?php
error_reporting(E_ALL);
// динамическая корректировка путей к PEAR
$PEAR_PATH_LOCAL = $_SERVER['DOCUMENT_ROOT'].'/PEAR';

set_include_path(
get_include_path() . PATH_SEPARATOR . $PEAR_PATH_LOCAL
);

class Auto {
public $firm;
public $model;
public $year;
public $price;
public $sellers;

function Auto($firm,$model,$year,$price) {
$this->firm = $firm;
$this->model = $model;
$this->year = $year;
$this->price = $price;
$this->sellers = array();
}
}

?>

<?php

$oAuto = new Auto("Audi", "A6", 2008, 78000);
$oAuto->sellers[0] = "Фирма А";
$oAuto->sellers[1] = "Фирма Б";
$oAuto->sellers[2] = "Фирма В";

require_once('JSON.php');

$json = new Services_JSON();

$kod = '\u041d\u0430 \u043c\u043e\u043b\u043e\u0434\u043e\u0433\u043e';
echo "Coded string: $kod \n";

$sJSONText = '{"firm":"Audi","model":"A6","year":2008,"price":78000,"sellers":["' . $kod . '","",""]}';

$value = $json->decode($sJSONText);

echo "Decoded string: {$value->sellers[0]}\n";

?>
</pre>


и наслаждайтесь расшифровкой UNICODE даже под PHP5, без ограничения в 50 кb как, например, здесь:

http://2cyr.com/decode/?lang=ru

PS: В красивый вид приводить и оптимизировать не стал, просто сделал работоспособным. Зашифрованный текст храниться в переменной $kod (меняйте прямо в скрипте)

Forcer
19.07.2009, 17:48
такая вещь на unicode должна поставляться из коробки. json требует отдельной библиотеки. наверняка существуют еще либы для работы с юникодом в php. но как разработчики дожили до 5 версии своего продукта и не обеспечели поддержку юникода на уровне языка как минимум странно и говорит лишь о том, что php все еще не далеко ушел в своем развитии от первоначальной расшифровки своей абревиатуры.

Pashkela
19.07.2009, 18:01
а вот вам фактически аналог http://2cyr.com/decode/?lang=ru :D :D :D (только без выбора языка, кодировок и прочего - сами додумкаете, это уже легко) Без ограничений на размер вводимого закодированного текста (практически)::


<?php
error_reporting(E_ALL);
// динамическая корректировка путей к PEAR
$PEAR_PATH_LOCAL = $_SERVER['DOCUMENT_ROOT'].'/PEAR';

set_include_path(
get_include_path() . PATH_SEPARATOR . $PEAR_PATH_LOCAL
);

class Auto {
public $firm;
public $model;
public $year;
public $price;
public $sellers;

function Auto($firm,$model,$year,$price) {
$this->firm = $firm;
$this->model = $model;
$this->year = $year;
$this->price = $price;
$this->sellers = array();
}
}


$oAuto = new Auto("Audi", "A6", 2008, 78000);
$oAuto->sellers[0] = "Фирма А";
$oAuto->sellers[1] = "Фирма Б";
$oAuto->sellers[2] = "Фирма В";

require_once('JSON.php');

$json = new Services_JSON();

$u_text = $_POST['text'];
$submit = $_POST['decode'];
if(isset($submit)) {
$kod = $u_text;
$sJSONText = '{"firm":"Audi","model":"A6","year":2008,"price":78000,"sellers":["' . $kod . '","",""]}';
$value = $json->decode($sJSONText);
$a = $value->sellers[0];
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text; charset=UTF-8">
<title>Unicode decoder</title>
</head>
<bоdу>
<form method="post">
Unicode decoder<br>
Coded text:
<table>
<tr><td><textarea rows="10" cols="30" name="text"><?php echo $kod;?></textarea></td></tr>
</table>
<input type="submit" name="decode" value="Decode" />
<br>Decoded text:
<table>
<tr><td><textarea rows="10" cols="30"><?php echo $a;?></textarea></td></tr>
</table>
</form>
</bоdу>
</html>

Solker
19.07.2009, 18:28
Вообщем всем спасибо, пока ждал ответа уже накатал простенький скрипт, т.к. переводить мне надо было только в Русскую раскладку.


$array_b_uni = array('\u0410','\u0411','\u0412','\u0413','\u0414' ,'\u0415','\u0416','\u0417','\u0418','\u0419','\u0 41a','\u041b','\u041c','\u041d','\u041e','\u041f', '\u0420','\u0421','\u0422','\u0423','\u0424','\u04 25','\u0426','\u0427','\u0428','\u0429','\u042a',' \u042b','\u042c','\u042d','\u042e','\u042f');

$array_b_win = array('A','Б','В','Г','Д','Е','Ж','З','И', 'Й','К','Л','М','Н','О','П','Р','С','Т', 'У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь', 'Э','Ю','Я');

$array_m_uni = array('\u0430','\u0431','\u0432','\u0433','\u0434' ,'\u0435','\u0436','\u0437','\u0438','\u0439','\u0 43a','\u043b','\u043c','\u043d','\u043e','\u043f', '\u0440','\u0441','\u0442','\u0443','\u0444','\u04 45','\u0446','\u0447','\u0448','\u0449','\u044a',' \u044b','\u044c','\u044d','\u044e','\u044f');

$array_m_win = array('а','б','в','г','д','е','ж','з','и' ,'й','к','л','м','н','о','п','р','с','т' ,'у','ф','х','ц','ч','ш','щ','ъ','ы','ь' ,'э','ю','я');

$str = str_replace($array_m_uni, $array_m_win, $str);
$str = str_replace($array_b_uni, $array_b_win, $str);