#! /usr/local/bin/perl -w
BEGIN {
plan
tests
=> 5;
}
sub
int2utf8;
my
$codes
= {};
foreach
(0 .. 0xcfff
) {
$codes
->{
$_
} = int2utf8
$_
;
}
my
$cd_int
= Locale::Recode->new (
from
=>
'UTF-8'
,
to
=>
'INTERNAL'
);
ok !
$cd_int
->getError;
my
$cd_rev
= Locale::Recode->new (
from
=>
'INTERNAL'
,
to
=>
'UTF-8'
);
ok !
$cd_rev
->getError;
my
$result_int
= 1;
while
(
my
(
$ucs4
,
$outbuf
) =
each
%$codes
) {
my
$result
=
$cd_int
->recode (
$outbuf
);
unless
(
$result
&&
$outbuf
->[0] ==
$ucs4
) {
$result_int
= 0;
last
;
}
}
ok
$result_int
;
my
$result_rev
= 1;
if
(1) {
while
(
my
(
$ucs4
,
$code
) =
each
%$codes
) {
my
$outbuf
= [
$ucs4
];
my
$result
=
$cd_rev
->recode (
$outbuf
);
unless
(
$result
&&
$code
eq
$outbuf
) {
$result_rev
= 0;
last
;
}
}
}
ok
$result_rev
;
my
$test_string1
=
"\xffSupergirl\xff"
;
$cd_rev
= Locale::Recode->new (
from
=>
'ASCII'
,
to
=>
'UTF-8'
,
);
$result_rev
=
$cd_rev
->recode (
$test_string1
);
ok
$result_rev
&&
$test_string1
eq
"�Supergirl�"
;
sub
int2utf8
{
my
$ucs4
=
shift
;
if
(
$ucs4
<= 0x7f) {
return
chr
$ucs4
;
}
elsif
(
$ucs4
<= 0x7ff) {
return
pack
(
"C2"
,
(0xc0 | ((
$ucs4
>> 6) & 0x1f)),
(0x80 | (
$ucs4
& 0x3f)));
}
elsif
(
$ucs4
<= 0xffff) {
return
pack
(
"C3"
,
(0xe0 | ((
$ucs4
>> 12) & 0xf)),
(0x80 | ((
$ucs4
>> 6) & 0x3f)),
(0x80 | (
$ucs4
& 0x3f)));
}
elsif
(
$ucs4
<= 0x1fffff) {
return
pack
(
"C4"
,
(0xf0 | ((
$ucs4
>> 18) & 0x7)),
(0x80 | ((
$ucs4
>> 12) & 0x3f)),
(0x80 | ((
$ucs4
>> 6) & 0x3f)),
(0x80 | (
$ucs4
& 0x3f)));
}
elsif
(
$ucs4
<= 0x3ffffff) {
return
pack
(
"C5"
,
(0xf0 | ((
$ucs4
>> 24) & 0x3)),
(0x80 | ((
$ucs4
>> 18) & 0x3f)),
(0x80 | ((
$ucs4
>> 12) & 0x3f)),
(0x80 | ((
$ucs4
>> 6) & 0x3f)),
(0x80 | (
$ucs4
& 0x3f)));
}
else
{
return
pack
(
"C6"
,
(0xf0 | ((
$ucs4
>> 30) & 0x3)),
(0x80 | ((
$ucs4
>> 24) & 0x1)),
(0x80 | ((
$ucs4
>> 18) & 0x3f)),
(0x80 | ((
$ucs4
>> 12) & 0x3f)),
(0x80 | ((
$ucs4
>> 6) & 0x3f)),
(0x80 | (
$ucs4
& 0x3f)));
}
}