
Unicode Code Conversion
|
747
sub DoConv ($) {
if ($i == 8) {
if ($o == 16) {
printf STDOUT "%s¥n",
uc unpack("H*",&UTF32toUTF16(&UTF8toUTF32(pack("H*",$line))));
} elsif ($o == 32) {
printf STDOUT "%s¥n",uc unpack("H*",&UTF8toUTF32(pack("H*",$line)));
}
} elsif ($i == 16) {
if ($o == 8) {
printf STDOUT "%s¥n",
uc unpack("H*",&UTF32toUTF8(&UTF16toUTF32(pack("H*",$line))));
} elsif ($o == 32) {
printf STDOUT "%s¥n",uc unpack("H*",&UTF16toUTF32(pack("H*",$line)));
}
} elsif ($i == 32) {
if ($o == 8) {
printf STDOUT "%s¥n",uc unpack("H*",&UTF32toUTF8(pack("H*",$line)));
} elsif ($o == 16) {
printf STDOUT "%s¥n",uc unpack("H*",&UTF32toUTF16(pack("H*",$line)));
}
}
}
sub UTF16toUTF32 ($) {
my ($bytes) = @_;
if ($bytes =~ /^([¥x00-¥xD7¥xE0-¥xFF][¥x00-¥xFF])$/) {
pack("N",unpack("n",$bytes));
} elsif ($bytes =~ /^([¥xD8-¥xDB][¥x00-¥xFF])([¥xDC-¥xDF][¥x00-¥xFF])$/) {
pack("N",((unpack("n",$1) - 55296) * 1024) + (unpack("n",$2) - 56320) + 65536);
} else {
die "Whoah! Bad UTF-16 data!¥n";
}
}
sub UTF8toUTF32 ($) {
my ($bytes) = @_;
if ($bytes =~ /^([¥x00-¥x7F])$/) {
pack("N",ord($1));
} elsif ($bytes =~ /^([¥xC0-¥xDF])([¥x80-¥xBF])$/) {
pack("N",((ord($1) & 31) << 6) | (ord($2) & 63));
} elsif ($bytes =~ /^([¥xE0-¥xEF])([¥x80-¥xBF])([¥x80-¥xBF])/) {
pack("N",((ord($1) & 15) << 12) | ((ord($2) & 63) << 6) | (ord($3) & 63));
} elsif ($bytes =~ /^([¥xF0-¥xF7])([¥x80-¥xBF])([¥x80-¥xBF])([¥x80-¥xBF])/) ...