win1251->utf-16 unicode

nifus

Guest
win1251->utf-16 unicode

Подскажите, мне нужно преобразовать текст в UTF-16 unicode, а потом каждый символ перевести в шестнадцатеричное число. Эту требования шлюза для рассылки sms сообщений, текст которых отличен от английского.
Я на вашем же сайте нашёл такой исходник для перевода в Unicode
function win2uni($s)
{
$s = convert_cyr_string($s,'w','i');
for ($result='', $i=0; $i<strlen($s); $i++) {
$charcode = ord($s[$i]);
$result .= ($charcode>175)?"&#".(1040+($charcode-176)).";":$s[$i];
}
return $result;
}
а для преобразования в шестнадцатеричное число использовал функцию bin2hex, но ничего из этого не вышло, в пришедшем sms были одно вопросы. Подскажите что я сделал не так
 

SiMM

Новичок
> а чем iconv не подходит?
тем, что не умеет преобразовывать в 16ричное число ;)
Честно говоря, вопроса не понял. Что на входе искомой функции - понятно, строка в CP1251, а вот как должен выглядеть выход?

> а для преобразования в шестнадцатеричное число использовал функцию bin2hex, но ничего из этого не вышло
А с какой кстати ты её использовал, если на входе - десятичное, а не строка? [m]bin2hex[/m] vs [m]dechex[/m]
 

phprus

Moderator
Команда форума
nifus
Если я правильно тебя понял то тее нужна функция типа этой:
PHP:
function convert($text) {
	$text = iconv('WINDOWS-1251','utf-16',$text);
	for ($i=0; $i<strlen($text); $i++) {
		$text[$i] = dechex(ord($text[$i]));
	}
	return $text;
}
Правда я не помню поддреживает ли iconv кодировку utf-16.
 

nifus

Guest
>Что на входе искомой функции - понятно, строка в CP1251
на входе строка из текстового поля, когда писал вопрос я был уверен что если страничка на которой расположено это текстовое поле win-1251 то и переводить нужно из
win1251->utf16
сейчас я уже настолько запутался в этих кодировках что неуверен ни вчём

на выходе должна быть строка перекодированная в unicode, каждый символ которой нужно перевести в шестнадцатиричный формат, я сначала подумал что нужно применить функцию urlencode(), но потом увидел в примере что отправляемый текст должен быть в таком формате:
"&#8486;&#936;&#920; becomes:"-> "03A903A8039"
 

SiMM

Новичок
Ну тогда всё правильно - bin2hex. Просто лишнее из кода надо убрать. Либо же (если в тексте может быть не только кириллица, как было продемонстрировано выше) воспользоваться [m]iconv[/m] + bin2hex

> Подскажите что я сделал не так
Для этого надо видеть, что же ты вообще делаешь.
 

nifus

Guest
>Для этого надо видеть, что же ты вообще делаешь.
$text = bin2hex(win2uni($_POST['text']));
//получаю текст сообщения
function win2uni($s)
{
$s = convert_cyr_string($s,'w','i');
for ($result='', $i=0; $i<strlen($s); $i++) {
$charcode = ord($s[$i]);
$result .= ($charcode>175)?"&#".(1040+($charcode-176)).";":$s[$i];
}
return $result;
}
//полсе этого отправляю полученный результат на шлюз
//и получаю sms с вопросиками вместо слов
//iconv - нет в наличии
 

SiMM

Новичок
Не подходит вам функция win2uni
Дорабатывайте ЕЁ напильником, а не то, что она возвращает.
Кода-то на три строчки - неужели трудно понять, что этот код делает, и убрать лишнее, исправив на то, что нужно? Одну строчку всего изменить.
 

nifus

Guest
>Дорабатывайте ЕЁ напильником, а не то, что она >возвращает.
Дело в том что функцию писал не я, оня взята с этого сайта
> неужели трудно понять, что этот код делает
впринципи я понемаю что этот код делает, я не знаю подходит ли мне, то что он делает.
>Не подходит вам функция win2uni
если я правельно понимаю то эта функция на выходе выдаёт символы в формате понятном для браузера т.е. &#...; , скорее всего символы нужно записывать в другом формате
но в каком??
 

SiMM

Новичок
> Дело в том что функцию писал не я, оня взята с этого сайта
Это вас нисколько не оправдывает.
PHP:
function CP1251toUTF16BEdump($str){
  return preg_replace('#.#se','sprintf("%04x","$0" < "\x80" ? ord("$0") : ord("$0")+848)',$str);
}
Всё. Идите с миром. Программист, блин.
 

nifus

Guest
>Всё. Идите с миром. Программист, блин.
да, действительно блин :)
я долго смотрел на пример приведённый господами которые предоставляют сервис по отправки sms
"&#8486;&#936;&#920; becomes"-> "03A903A8039"
и немогу понять
в исходном примере 11 символов и в конечгом результате тоже 11 символов
как можно получить такое преобразование??
SiMM ваш код возвращает такое значение
006200650063006f006d00650073
 

SiMM

Новичок
> SiMM ваш код возвращает такое значение
Читать умеете?

> Либо же (если в тексте может быть не только кириллица, как было продемонстрировано выше) воспользоваться iconv + bin2hex

> function CP1251...
Если бы вы всё же прочли ссылку, которую я вам уже давал - то обнаружили бы, что таких символов в CP1251 нет. Соответственно единственное, что умеет приведённая выше функция - это работать с ASCII + АЯая. Остальное, если оно вам нужно, делайте сами, а мне делать это без iconv'а, извините, влом (не мне ведь это нужно, правда?).

> в исходном примере 11 символов и в конечгом результате тоже 11 символов как можно получить такое преобразование??
А почему вы у меня спрашиваете? Спросите у ваших "господ,которые предоставляют сервис" - я же не виноват, что они не удосужились написать нормальный ман и ограничились лишь частью выходной строки.
 
Сверху