-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkr.pl
executable file
·124 lines (120 loc) · 4.85 KB
/
kr.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/usr/bin/perl
use LWP::Simple;
#$content = get("http://www.wonkwang.ac.kr/college/college-main1_1.htm");
$content = get("$ARGV[0]");
$content =~ s/\s+/ /sg;
$content =~ s/<(head|style|script)[^>]*>.*?<\/\1>//ig;
$content =~ s/<!--.*?-->//g;
$content =~ s/<.*?>//g;
$content =~ s/ / /g;
$content =~ s/\s+/ /g;
$content = dekodovat_utf8($content);
# 59393 prvni dalsi (zacina "oblast osobniho pouziti")
# ga gga na da dda ra ma ba bba sa ssa a ja jja cha ka ta pa ha
# ga gae gya gyae geo ge gyeo gye go gwa gwae goe gyo gu gweo gwe gwi gyu geu gyi gi
# ga gag gagg gags gan ganj ganh gad gar garg garm garb gars gart garp garh gam gab gabs gas gass gang gaj gach gak gat gap gah
@init = ("g", "gg", "n", "d", "dd", "r", "m", "b", "bb", "s", "ss", "", "j", "jj", "ch", "k", "t", "p", "h");
@vowl = ("a", "ae", "ya", "yae", "eo", "e", "yeo", "ye", "o", "wa", "wae", "oe", "yo", "u", "weo", "we", "wi", "yu", "eu", "yi", "i");
@stop = ("", "g", "gg", "gs", "n", "nj", "nh", "d", "r", "rg", "rm", "rb", "rs", "rt", "rp", "rh", "m", "b", "bs", "s", "ss", "ng", "j", "ch", "k", "t", "p", "h");
for($i=0; $i<length($content); $i++)
{
my $kod = ord(substr($content, $i, 1));
# Slabiky hangul (AC00-D7A3) = (44032-55203)
if($kod>=44032 && $kod<55204)
{
$init = int(($kod-44032)/588);
$vowl = int(($kod-(44032+588*$init))/28);
$stop = $kod-(44032+588*$init+28*$vowl);
# print(" $init-$vowl-$stop");
print(".$init[$init]$vowl[$vowl]$stop[$stop]");
}
else
{
print(chr($kod));
}
}
# Dekóduje UTF-8. Potřebuju tuhle proceduru, protože Perl 5.6.1 ještě neposkytuje způsob, jak říct, že text čtený ze
# souboru je kódován v UTF-8. Vnitřní kódování řetězců už ale je unikódové, takže stačí přečtené znaky zase zapsat.
sub dekodovat_utf8
{
my $bsingle = 0; # 0....... samostatný bajt odpovídající jedinému (ASCII) znaku (0000-007F)
my $bslave = 128; # 10...... druhý až čtvrtý bajt znaku
my $bmaster2 = 192; # 110..... první ze dvou (0080-07FF)
my $bmaster3 = 224; # 1110.... první ze tří (0800-FFFF)
my $bmaster4 = 240; # 11110... první ze čtyř (10000-FFFFF)
my @intext = split(//, $_[0]);
my @unicodes;
my $nexl = 0; # number of expected slave bytes
my $i;
for($i = 0; $i<=$#intext; $i++)
{
my $byte = ord($intext[$i]);
# Zjistit, zda je to ASCII.
if(($byte & 128) == 0) # $byte & 10000000
{
$nexl = 0;
# Uložit bajt.
$unicodes[++$#unicodes] = $byte;
}
# Není-li to ASCII, zjistit, zda je to začátek dvoubajtového znaku.
elsif(($byte & 224) == $bmaster2) # $byte & 11100000 == 11000000
{
# Odstranit z bajtu hlavičku 110.
$byte = $byte & 31; # $byte & 00011111
# Udělat místo na bity, které ještě očekáváme.
$byte = $byte << 6;
$nexl = 1;
# Uložit již načtenou část bajtu.
$unicodes[++$#unicodes] = $byte;
}
# Není-li to ani dvoubajtové, zjistit, zda je to začátek tříbajtového znaku.
elsif(($byte & 240) == $bmaster3) # $byte & 11110000 == 11100000
{
# Odstranit z bajtu hlavičku 1110.
$byte = $byte & 15; # $byte & 00001111
# Udělat místo na bity, které ještě očekáváme.
$byte = $byte << 12;
$nexl = 2;
# Uložit již načtenou část bajtu.
$unicodes[++$#unicodes] = $byte;
}
# Není-li to ani tříbajtové, zjistit, zda je to začátek čtyřbajtového znaku.
elsif(($byte & 248) == $bmaster4) # $byte & 11111000 == 11110000
{
# Odstranit z bajtu hlavičku 11110.
$byte = $byte & 7; # $byte & 00000111
# Udělat místo na bity, které ještě očekáváme.
$byte = $byte << 18;
$nexl = 3;
# Uložit již načtenou část bajtu.
$unicodes[++$#unicodes] = $byte;
}
# Není-li to začátek vícebajtové sekvence, zjistit, zda je to její pokračování.
elsif(($byte & 192) == $bslave) # $byte & 11000000 == 10000000
{
if($nexl<1)
{
die("Neocekavany slave byte v UTF-8 je divny.\n");
}
# Odstranit z bajtu hlavičku 10.
$byte = $byte & 63; # $byte & 00111111
# Pokud ještě očekáváme další bity, udělat na ně místo.
$nexl--;
$byte = $byte << ($nexl*6);
# Přiorovat právě načtenou část znaku k částem načteným dříve.
$unicodes[$#unicodes] = $unicodes[$#unicodes] | $byte;
}
# Není-li to nic z výše uvedeného, je to asi chyba.
else
{
die("Vice nez 4-bytovy kod v UTF-8 je divny.\n");
}
}
# Udělat z unikódů text.
my $outext;
for($i = 0; $i<=$#unicodes; $i++)
{
$outext .= chr($unicodes[$i]);
}
return $outext;
}