Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

символы utf (Fily)
Author Message
Fily
Заглянувший



Joined: 16 Jan 2013
Posts: 11
Карма: 0
   поощрить/наказать


PostPosted: Sun Jan 27, 2013 1:59 am (написано за 9 минут 25 секунд)
   Post subject: символы utf
Reply with quote

Можно ли получить в perl символ utf-8 по его коду со значением более 65536,
и как сделать обратное действие - получить код этого же символа?
(с учетом того, что в таком случае символ представлен парой вспомогательных псевдо-символов)
Back to top
View user's profile Send private message
heed
Участник форума



Joined: 03 Jan 2010
Posts: 97
Карма: 8
   поощрить/наказать


PostPosted: Sun Jan 27, 2013 7:52 pm (спустя 17 часов 53 минуты; написано за 7 минут 34 секунды)
   Post subject:
Reply with quote

можно, под mod_perl2 работает например так
Code (perl): скопировать код в буфер обмена
#!perl
# Древнегреческие цифры (0x10140..0x1018F)
for (0x10140..0x1018F) {
        my $xchr (www.perldoc.com/perl5.6/pod/func/chr.html)($_);
print (www.perldoc.com/perl5.6/pod/func/print.html) $x .' 'ord (www.perldoc.com/perl5.6/pod/func/ord.html)($x) . "\n";
}
без всякого включения модулей ...

но от этого толку немного, в виндовс нет ни одного шрифта, в котором были-бы символы с кодом больше 0xFEFC
, и насколько понял вообще в виндовс свой юникод, двухбайтный

//Apache/2.2.21 (Win64) mod_perl/2.0.7 Perl/v5.16.1
Back to top
View user's profile Send private message
Fily
Заглянувший



Joined: 16 Jan 2013
Posts: 11
Карма: 0
   поощрить/наказать


PostPosted: Sun Jan 27, 2013 9:25 pm (спустя 1 час 32 минуты; написано за 10 секунд)
   Post subject:
Reply with quote

heed спасибо!
Попробовал Ваш код, он сохраняет файл на диск с записанными символами длинной в 1 символ каждый, а js может оперировать с символами длиной в два псевдосимвола каждый.
Сам вопрос возник отсюда: javascript.ru/String/charCodeAt, т.е. с помощью js можно записать символ >65536 двумя псевдосимволами, но как соединить js и perl чтобы perl мог готовить полностью всю страницу html вместе с utf-8 >65536 и с этими символами мог оперировать js?
Back to top
View user's profile Send private message
Fily
Заглянувший



Joined: 16 Jan 2013
Posts: 11
Карма: 0
   поощрить/наказать


PostPosted: Sun Jan 27, 2013 9:34 pm (спустя 9 минут; написано за 3 минуты)
   Post subject:
Reply with quote

В сохраненном текстовом файле не совсем понятно, пишет что один символ, а курсор движется по четыре шага по каждому такому символу
(текстовый редактор AkePad).
Back to top
View user's profile Send private message
heed
Участник форума



Joined: 03 Jan 2010
Posts: 97
Карма: 8
   поощрить/наказать


PostPosted: Mon Jan 28, 2013 2:30 am (спустя 4 часа 56 минут; написано за 17 минут 49 секунд)
   Post subject:
Reply with quote

Насчёт js трудно сказать, perl делает всё правильно

В utf8 последовательности представляющие один символо не ограничены 2мя байтами
Code (perl): скопировать код в буфер обмена
Юникод                                UTF8
0x00000000 — 0x0000007F                0xxxxxxx
0x00000080 — 0x000007FF                110xxxxx 10xxxxxx
0x00000800 — 0x0000FFFF                1110xxxx 10xxxxxx 10xxxxxx
0x00010000 — 0x001FFFFF                11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

# теоретически возможны, но не включены в стандарты:
0x00200000 — 0x03FFFFFF                111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0x04000000 — 0x7FFFFFFF                1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
те первый символ из той последовательности как-раз перекодируется в 4 байта
Code (perl): скопировать код в буфер обмена
"\xf0\x90\x85\x80"                                11110000 10010000 10000101 10000000
В AkelPad и других программах поддерживающих utf8 , должен быть только одинг символ, просто нужно "Открыть как UTF-8 (без BOM)"

// с JS редко сталкивался, вообще башню сносит как подумаю сколько разных браузеров с разными реализациями JS, и ещё разные OS :)
документация такая-же
Quote:
fromCharCode
Возвращает строку, созданную путём использования специфицированной последовательности из значений Unicode.
Метод из
String

Static

Реализован в
JavaScript 1.2, NES 3.0
JavaScript 1.3: используется значение Unicode, а не значение ISO-Latin-1.

Версия ECMA
 ECMA-262
Синтаксис
fromCharCode(num1, ..., numN)

Параметрыnum1, ..., numN
 Последовательность чисел - значений Unicode.
Описание
Этот метод возвращает строку, а не String-объект.

Поскольку fromCharCode это static-метод объекта String, Вы всегда используете его как String.fromCharCode(), а не как метод String-объекта, созданного Вами.

Обратная Совместимость
JavaScript 1.2.
Метод fromCharCode возвращает строку, созданную путем использования специфицированной последовательности значений из набора кодов ISO-Latin-1.
какое 1.2, NES 3.0 , где 1.3, какое ECMA-262 ??? я вообще в панике от такого :)
Back to top
View user's profile Send private message
Fily
Заглянувший



Joined: 16 Jan 2013
Posts: 11
Карма: 0
   поощрить/наказать


PostPosted: Mon Jan 28, 2013 8:18 pm (спустя 17 часов 48 минут; написано за 4 минуты 22 секунды)
   Post subject:
Reply with quote

Похоже вопрос мой попадает в категорию "отставить на потом, до лучших времен, когда может что нибудь прояснится или изменится" :)

---
Чаще всего выход там, где был вход - символ то один "в виндовс нет ни одного шрифта, в котором были-бы символы с кодом больше..."
Back to top
View user's profile Send private message
heed
Участник форума



Joined: 03 Jan 2010
Posts: 97
Карма: 8
   поощрить/наказать


PostPosted: Tue Jan 29, 2013 12:55 am (спустя 4 часа 36 минут; написано за 26 минут 16 секунд)
   Post subject:
Reply with quote

Quote:
символы с кодом больше..."
это да, ошибка получилась :) хотел сразу сделать 0xFFFF, но потом почему-то заглянул в какой-то случайный шрифт, и оттуда не совсем то значение получилось

Например
Code (JavaScript): скопировать код в буфер обмена
alert('test '+'\u042b')
//
 
Похоже что эскейп-последовательности \uXXXX это юникод UCS-2
, однако если присутствует возможность расширять при помощи суррогатов/суррогатных пар
, то это всё-таки UTF-16. UTF-16 ? или я чего-то недопонимаю

Сам по себе utf-8 должен неплохо поддерживаться javascript, ajax на utf-8... и в html на utf-8 добрая половина знаков будут однобайтными, поэтому его и юзают.
Но если возможно в каких-нибудь реализациях js возможности урезали до двухбайтного utf-8 , то их трудно в этом винить :)) Что-то, после того как не смог поставить не один такой шрифт, у меня тоже возникла мысль
, о возможности ещё больше символов отфильтровывать из данных.
Back to top
View user's profile Send private message
Fily
Заглянувший



Joined: 16 Jan 2013
Posts: 11
Карма: 0
   поощрить/наказать


PostPosted: Tue Jan 29, 2013 12:56 pm (спустя 12 часов 1 минуту; написано за 3 минуты 3 секунды)
   Post subject:
Reply with quote

Винить естественно нельзя, наоборот пользоваться надо, пока не переделали :)
Code (JavaScript): скопировать код в буфер обмена
alert('\u042b\u003C\u0054\u0079\u0054'+' '+'\uD800\uD801\uD802\uD803\uD804\uD805\uD806\uDC00\uFF00\uFFF0\uFFFF');

m= 65637+10;  document.write( String.fromCharCode(m)+' :'+String.fromCharCode(m).length+'<br>');
m= 65637+20;  document.write( String.fromCharCode(m)+' :'+String.fromCharCode(m).length+'<br>');
m= 65637+50;  document.write( String.fromCharCode(m)+' :'+String.fromCharCode(m).length+'<br><br>');
//
//
m= 65637+10; n= 65637+20;
document.write( String.fromCharCode(m,n)+' :'+String.fromCharCode(m,n).length+'<br>');
m= 65637+20; n= 65637+30;
document.write( String.fromCharCode(m,n)+' :'+String.fromCharCode(m,n).length+'<br><br>');
//
m= 65637+50; n= 65637+100;
document.write( String.fromCharCode(m,n)+' :'+String.fromCharCode(m.n).length+'<br>');
m= 65637+50; n= 65637+500;
document.write( String.fromCharCode(m,n)+' :'+String.fromCharCode(m.n).length+'<br>');
В js можно найти прекрасное применение таким символам, если конечно на сервере perl что либо полезное сможет сделать для html в этом направлении.
Back to top
View user's profile Send private message
heed
Участник форума



Joined: 03 Jan 2010
Posts: 97
Карма: 8
   поощрить/наказать


PostPosted: Wed Jan 30, 2013 12:29 am (спустя 11 часов 33 минуты; написано за 15 минут 6 секунд)
   Post subject:
Reply with quote

что-то не то, символы в диапазоне от 0x10000 до 0x10FFFF ,если это utf-16, вроде такими парами должны быть представлены
Code (JavaScript): скопировать код в буфер обмена
//m        в диапазоне 55296 - 56319 (0xD800..0xDBFF )
//n        в диапазоне 56320 - 57343 (0xDC00..0xDFFF )
// максимально и минимально
m= 55296; n= 56320;
document.write( String.fromCharCode(m,n)+' символов:'+String.fromCharCode(m,n).length+'<br>');
m= 56319; n= 57343;
document.write( String.fromCharCode(m,n)+' символов:'+String.fromCharCode(m.n).length+'<br>');
// причём  максимальный символ это один из 66-и символов
//, которые считаются "nonchar" каким-то  "незаконным для открытого взаимообмена" ,
// и типа  perl не принимает из из потоков типа потоков ввода
//какие-то от FDD0 до FDEF и дальше все кончающиеся на U+FFFE и U+FFFF
 
Печатает уже в обоих случаях один символ, а с length как-будто лажа какая-то, может он всётаки байты считает, и сбивается на \0x00 ?

// Почитал и вообще запутался. Например если могут один-за другим идти два одиночных utf-16 знака,из которых можно составить суррогатную пару, то откуда машина знает что это именно пара , а не просто два знака? :)
То что если текст файла в какой-нибудь кодировке cp1251 начинается именно с букв юя, то его редактор откроет как utf-16 тоже редкость, но всётаки может случиться.

//// только сейчас заметил, всётаки один из браузеров показывает древнегреческие цифры
, только нарисованы простые цифры числа и дроби :) даже в скобках, зато всего одним символом
// шрифт даже не понял какой.
Back to top
View user's profile Send private message
Fily
Заглянувший



Joined: 16 Jan 2013
Posts: 11
Карма: 0
   поощрить/наказать


PostPosted: Wed Jan 30, 2013 3:48 pm (спустя 15 часов 19 минут; написано за 8 минут 33 секунды)
   Post subject:
Reply with quote

Пишет два символа, рисует один:
m= 55296; n= 56320; �� - символов:2
m= 56319; n= 57343; �� - символов:1
в разных браузерах и не зависит от charset выставленных на странице utf-8 или windows-1251.
Пробую изменить/уточнить/переформулировать/дополнить вопрос: как в perl получить символ из m и n одновременно? пусть может и с кодами меньше 65536? и как такой символ потом обратно прочитать перлом чтобы получить правильно оба эти значения кодов?
Может таблица перевода какая нужна?
Back to top
View user's profile Send private message
heed
Участник форума



Joined: 03 Jan 2010
Posts: 97
Карма: 8
   поощрить/наказать


PostPosted: Wed Jan 30, 2013 9:25 pm (спустя 5 часов 36 минут; написано за 6 минут 8 секунд)
   Post subject:
Reply with quote

Первое что приходит на ум, это pack/unpack, с Encode, и получается ещё и какое-нибудь sprintf
Code (perl): скопировать код в буфер обмена
#!perl
# Apache/2.2.20 (Win32) DAV/2 mod_ftp/0.9.6 PHP/5.2.17 SVN/1.6.6 mod_perl/2.0.5 Perl/v5.14.2
#
print (www.perldoc.com/perl5.6/pod/func/print.html) 'Content-type: text/plain; charset=utf-8'."\n\n";
binmode (www.perldoc.com/perl5.6/pod/func/binmode.html) STDOUT, ':utf8';

use Encode;

#
my $i=0;
for (0x10140..0x1018F) {
        my $x = encode("UTF-16LE", chr (www.perldoc.com/perl5.6/pod/func/chr.html)($_));
        print (www.perldoc.com/perl5.6/pod/func/print.html) decode("UTF-16LE", $x) ."\t";
        printf (www.perldoc.com/perl5.6/pod/func/printf.html)("\\u%04X ", $_) for unpack (www.perldoc.com/perl5.6/pod/func/unpack.html)("S*", $x);
        print (www.perldoc.com/perl5.6/pod/func/print.html) "\t";
        printf (www.perldoc.com/perl5.6/pod/func/printf.html)("%i ", $_) for unpack (www.perldoc.com/perl5.6/pod/func/unpack.html)("S*", $x);
        print (www.perldoc.com/perl5.6/pod/func/print.html) "\n";
}
#
        print (www.perldoc.com/perl5.6/pod/func/print.html) "\t". decode("UTF-16LE", pack (www.perldoc.com/perl5.6/pod/func/pack.html)('SS', 55296, 56640));
Наверное есть более изящные решения

//upd проверил, вроде оно
Code (JavaScript): скопировать код в буфер обмена
<script>
document.write( String.fromCharCode(55296, 56640)+' :'+String.fromCharCode(55296, 56640).length+'<br>');
</script>
Back to top
View user's profile Send private message
Fily
Заглянувший



Joined: 16 Jan 2013
Posts: 11
Карма: 0
   поощрить/наказать


PostPosted: Wed Jan 30, 2013 11:27 pm (спустя 2 часа 2 минуты; написано за 2 минуты 42 секунды)
   Post subject:
Reply with quote

Может я что не так записал:
Code (perl): скопировать код в буфер обмена
#!/usr/bin/perl
binmode (www.perldoc.com/perl5.6/pod/func/binmode.html) STDOUT, ':utf8';
use Encode;
my $a = pack (www.perldoc.com/perl5.6/pod/func/pack.html)('SS', 55296, 56640);
my $b = decode("UTF-16LE", $a);
my $y = ord (www.perldoc.com/perl5.6/pod/func/ord.html)($b);
print (www.perldoc.com/perl5.6/pod/func/print.html) "Content-type: text/html\n\n";
print (www.perldoc.com/perl5.6/pod/func/print.html) qq (www.perldoc.com/perl5.6/pod/func/qq.html)~
<html>
<h1>Hello!</h1>
<script>
var a = String.fromCharCode(55296, 56640),b=String.fromCharCode(55296, 56640).length;
document.write( a+' simvols : '+b+' : : : 55296, 56640<br>')
alert(a+' == '+ "$y"+' =====> '+(a== "$y")+'    ?')
</script>
<br>$b   ----->  !== $y </html>
~;
но выдает false в DzSoft PerlEditor, т.е. символ записанный перлом не равен символу полученному от js
Back to top
View user's profile Send private message
heed
Участник форума



Joined: 03 Jan 2010
Posts: 97
Карма: 8
   поощрить/наказать


PostPosted: Thu Jan 31, 2013 3:45 am (спустя 4 часа 18 минут; написано за 12 минут 30 секунд)
   Post subject:
Reply with quote

ord наверное лишнее.
вроде (a== "$b") показывает true

//upd(x32апач x64ось)
из под mod_cgi так работает #!/usr/_backup/local/perl-5.10/bin/perl5.10.1.exe
а так почему-то не захотело #!/usr/_backup/local/perl5.8.8/bin/perl5.8.8.exe
[Thu Jan 31 04:52:24 2013] [error] [client 127.0.0.1] Encode object version 2.12 does not match bootstrap parameter 0.00 at J:/usr/_backup/local/perl5.8.8/lib/XSLoader.pm line 94.\r
или возможно что не из-за версии perl

//upd
Не получилось почему-то c use Encode в perl 5.8.8
perl просто распаковывал из Denwer3_Perl_2008-01-13_5.8.8.exe

Но вобщем-то в лоб тоже решается
Code (perl): скопировать код в буфер обмена
#!/usr/_backup/local/perl5.8.8/bin/perl5.8.8.exe
print (www.perldoc.com/perl5.6/pod/func/print.html) 'Content-type: text/plain; charset=utf-8'."\n\n";
binmode (www.perldoc.com/perl5.6/pod/func/binmode.html) STDOUT, ':utf8';

# Древнегреческие цифры (0x10140..0x1018F)
my $i=0;
for (0x10140..0x1018F) {
        my $x = chr (www.perldoc.com/perl5.6/pod/func/chr.html)($_);
        print (www.perldoc.com/perl5.6/pod/func/print.html) $x ."\t";
=perldoc Encode::Unicode
Here is a formula to ensurrogate a Unicode character \x{10000} and above;

  $hi = ($uni - 0x10000) / 0x400 + 0xD800;
  $lo = ($uni - 0x10000) % 0x400 + 0xDC00;
=cut
        my $int = ord (www.perldoc.com/perl5.6/pod/func/ord.html)($x)-0x10000;
    my ($m, $n) = (int (www.perldoc.com/perl5.6/pod/func/int.html)($int / 0x400 + 0xD800), $int % 0x400 + 0xDC00 );
        print (www.perldoc.com/perl5.6/pod/func/print.html) $m .' '. $n ."\t";
=perldoc Encode::Unicode
And to desurrogate;

 $uni = 0x10000 + ($hi - 0xD800) * 0x400 + ($lo - 0xDC00);
=cut
                $int = 0x10000 + ($m - 0xD800) * 0x400 + ($n - 0xDC00);
        print (www.perldoc.com/perl5.6/pod/func/print.html) "\t". $int .' '. chr (www.perldoc.com/perl5.6/pod/func/chr.html)($int) ."\n";
}
Back to top
View user's profile Send private message
Fily
Заглянувший



Joined: 16 Jan 2013
Posts: 11
Карма: 0
   поощрить/наказать


PostPosted: Thu Jan 31, 2013 12:22 pm (спустя 8 часов 36 минут; написано за 8 минут 17 секунд)
   Post subject:
Reply with quote

heed спасибо!
С точки зрения perl вопрос решен. Из двух кодов есть символ.

А js то работает с двумя, а я пытался сравнить его, т.е. один символ с двумя символами, теми что производит js из тех же самых кодов.
Понял это вчера еще, и пока не придумал как можно с этим управиться,
 Легче найти ошибку, чем истину. Г°те
но если ошибка понятна, можно двигаться дальше.

---
perldoc - отличная вещь, оказывается :)) это как бы и раньше знал, но не практиковал, слабоват мой английский.
Back to top
View user's profile Send private message
Fily
Заглянувший



Joined: 16 Jan 2013
Posts: 11
Карма: 0
   поощрить/наказать


PostPosted: Thu Jan 31, 2013 3:59 pm (спустя 3 часа 37 минут; написано за 7 минут 1 секунду)
   Post subject:
Reply with quote

ord лишнее, и у меня (a== "$b") показало true:
Code (perl): скопировать код в буфер обмена
#!/usr/bin/perl
binmode (www.perldoc.com/perl5.6/pod/func/binmode.html) STDOUT, ':utf8'; use Encode;
my $a = pack (www.perldoc.com/perl5.6/pod/func/pack.html)('SS', 55296, 56640);
my $b = decode("UTF-16LE", $a);
print (www.perldoc.com/perl5.6/pod/func/print.html) qq (www.perldoc.com/perl5.6/pod/func/qq.html)~Content-type: text/html\n\n<html><script>
var a = String.fromCharCode(55296, 56640),b=String.fromCharCode(55296, 56640).length;
alert(a+' == '+ "$b"+' =====> '+(a== "$b")+'    ?')</script></html>~;
несколько раз, закрыл, еще раз открыл файл и все стало false.

Перебрал возможные варианты, везде false:
Code (perl): скопировать код в буфер обмена
use Encode;
binmode (www.perldoc.com/perl5.6/pod/func/binmode.html) STDOUT, ':utf8';
my $a = pack (www.perldoc.com/perl5.6/pod/func/pack.html)('SS', 55296, 56640);
my $b = decode("UTF-16LE", $a);

my $x = chr (www.perldoc.com/perl5.6/pod/func/chr.html)(65856);
my $int = ord (www.perldoc.com/perl5.6/pod/func/ord.html)($x)-0x10000;
my($m, $n) = (int (www.perldoc.com/perl5.6/pod/func/int.html)($int / 0x400 + 0xD800), $int % 0x400 + 0xDC00 );
$int = 0x10000 + ($m - 0xD800) * 0x400 + ($n - 0xDC00);

my $x1 = chr (www.perldoc.com/perl5.6/pod/func/chr.html)(55296);
my $x2 = chr (www.perldoc.com/perl5.6/pod/func/chr.html)(56640);

my $z = decode("UTF-16LE", pack (www.perldoc.com/perl5.6/pod/func/pack.html)('SS', 55296, 56640));
my $z1 =decode("UTF-16LE", pack (www.perldoc.com/perl5.6/pod/func/pack.html)('SS', 55296));
my $z2 =decode("UTF-16LE", pack (www.perldoc.com/perl5.6/pod/func/pack.html)('SS', 56640));
#print "$z2";
my $z5 =decode("UTF-16LE", pack (www.perldoc.com/perl5.6/pod/func/pack.html)('SS', 55296, 640));

print (www.perldoc.com/perl5.6/pod/func/print.html) qq (www.perldoc.com/perl5.6/pod/func/qq.html)~Content-type: text/html\n\n<html><head></head><body><script>
var a  = String.fromCharCode(55296, 56640);
var a1 = String.fromCharCode(55296),
    a2 = String.fromCharCode(56640),
    a5 = String.fromCharCode(55296, 640);
document.write(a +' == $b  '+' ?===> '+(a=="$b")  +' (a.length=' +a.length +' ; b.length=' +"$b".length +')<br>');
document.write(a +' == $x  '+' ?===> '+(a=="$x")  +' (a.length=' +a.length +' ; x.length=' +"$x".length +')<br><br>');
document.write(a1+' == $x1 '+' ?===> '+(a1=="$x1")+' (a1.length='+a1.length+' ; x1.length='+"$x1".length+')<br>');
document.write(a2+' == $x2 '+' ?===> '+(a2=="$x2")+' (a2.length='+a2.length+' ; x2.length='+"$x2".length+')<br><br>');
document.write(a +' == $z  '+' ?===> '+(a =="$z") +' (a.length=' +a.length +' ; z.length=' +"$z".length +')<br>');
document.write(a1+' == $z1 '+' ?===> '+(a1=="$z1")+' (a1.length='+a1.length+' ; z1.length='+"$z1".length+')<br><br>');
document.write(a5+' == $z5 '+' ?===> '+(a5=="$z5")+' (a5.length='+a5.length+' ; z5.length='+"$z5".length+')<br>');
</script></body></html>~;
а если раскоментировать строку #print "$z2"; то перемыкает полностью весь код - символ древнегреческий это "КХУМАН" ? :))
js не понимает ни два символа, ни один символ, из тех что готовит ему перл.
И правильно их perldoc называет surrogate.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You cannot download files in this forum.
XML