# unicode.pl - Unicode translation library for perl # Copyright (C) 1998,1999 Masanao Izumo # # This program is free software. You can redistribute it and/or modify # it without any warranty. This library convert unicode to/from EUC-jp. # # This file contains binary. Please be careful if you edit this file. # # Usage: # require 'unicode.pl'; # # @unicodeList = &unicode::e2u($eucString); # $eucString = &unicode::u2e(@unicodeList); # # $utf8 = &unicode::UTF16toUTF8(@unicodeList); # @unicodeList = &unicode::UTF8toUTF16($utf8); # # ChangeLog: # 1998-07-09 # * Version 1.1 is released # * Add binmode(DATA); # # 1998-12-07 # * Version 1.0 is released package unicode; $version = '1.1'; binmode(DATA); $table_start = tell(DATA); $e2u_size = 32768; $u2e_size = 131072; $cache = 1; read(DATA, $e2u_table, $e2u_size); read(DATA, $u2e_table, $u2e_size); sub e2u { my($str) = @_; my($c, $c1, $c2, $i, @u, $x); while($str =~ /[\000-\177]|[\200-\377][\200-\377]/g) { $c = $&; if(exists $e2u{$c}) { push(@u, $e2u{$c}); next; } if(length($c) == 1) { $c1 = 0; ($c2) = unpack('C', $c); } else { ($c1, $c2) = unpack('C2', $c); } $i = (($c1 & 0x7f) << 7) | ($c2 & 0x7f); $x = unpack('n', substr($e2u_table, 2*$i, 2)); $e2u{$c} = $x if $cache; push(@u, $x); } @u; } sub u2e { join('', map { if(exists $u2e{$_}) { $u2e{$_}; } else { if($cache) { $u2e{$_} = substr($u2e_table, 2 * $_, 2); } else { substr($u2e_table, 2 * $_, 2); } } } @_); } sub UTF16toUTF8 { my($res); for(@_) { if(($_ & 0xff80) == 0) { $res .= chr($_); } elsif(($_ & 0xf800) == 0) { $res .= chr(0xc0 | ($_ >> 6)); $res .= chr(0x80 | ($_ & 0x3f)); } else { $res .= chr(0xe0 | ($_ >> 12)); $res .= chr(0x80 | (($_ >> 6) & 0x3f)); $res .= chr(0x80 | ($_ & 0x3f)); } } $res; } sub UTF8toUTF16 { my($utf8) = @_; my($c1, $c2, $c3, $len, $at); my(@u); $len = length($utf8); $at = 0; while($at < $len) { $c1 = ord(substr($utf8, $at, 1)); $at++; if(($c1 & 0x80) == 0) { # 0xxxxxxx push(@u, $c1); } elsif(($c1 & 0xe0) == 0xc0) { # 110x xxxx 10xx xxxx $c2 = ord(substr($utf8, $at, 1)); $at++; push(@u, (($c1 & 0x1f) << 6) | ($c2 & 0x3f)); } else { # 1110 xxxx 10xx xxxx 10xx xxxx $c2 = ord(substr($utf8, $at, 1)); $at++; $c3 = ord(substr($utf8, $at, 1)); $at++; push(@u, (($c1 & 0x0f) << 12) | (($c2 & 0x3f) << 6) | (($c3 & 0x3f) << 0)); } } @u; } # # Cache control functions # sub cache { ($cache, $cache = 1)[$[]; } sub nocache { ($cache, $cache = 0)[$[]; } sub flushcache { undef %e2u; undef %u2e; } ## update_table() for deveroppers. #sub update_table { # require 'unicodeDef.pl'; # local(*F); # my($f, $u, $e, $i); # # $f = __FILE__; # open(F, "+<$f") || die "$f: $!"; # seek(F, $table_start, 0); # print F "\0" x ($e2u_size + $u2e_size); # # # ascii # for(0..127) { # seek(F, $table_start + 2*$_, 0); # print F pack('n', $_); # seek(F, $table_start + $e2u_size + 2*$_, 0); # print F pack('n', $_); # } # # # Japanese # for(@unicodeTable) { # $e = $_->[0]; # # $i = (($e & 0x7f00)>>1) | ($e & 0x7f); # $u = $_->[1]; # # printf("## %02x %02x\n", $i, $u); # # seek(F, $table_start + 2*$i, 0); # print F pack('n', $u); # seek(F, $table_start + $e2u_size + 2*$u, 0); # print F pack('n', $e); # } # # # for yen sign # seek(F, $table_start + $e2u_size + 2*0x00A5, 0); # print F pack('n', 0x5C); # # # for overline # seek(F, $table_start + $e2u_size + 2*0x203E, 0); # print F pack('n', 0x7E); # # truncate F, $table_start + $e2u_size + $u2e_size; # # close(F); #} 1; __DATA__   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~abcdefghijklmnopqrstuvwxyz{|}~000 000@>?00000N0000  \0 \ & %     00;=[]00 0 0 0 0 0000 ""`"f"g""4&B&@ 2 3! &&%%%%%%%%%%% ;0!!!!0"" """""*")"'"(!!""" "#"""a"R"j"k""=""5"+",!+ 0&o&m&j !%!"#$%&'()*+,-./0123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZ0A0B0C0D0E0F0G0H0I0J0K0L0M0N0O0P0Q0R0S0T0U0V0W0X0Y0Z0[0\0]0^0_0`0a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u0v0w0x0y0z0{0|0}0~00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !"#$%&'()*+,-./012345Q6789:;<=>?@ABCDEFGHIJKLMNO%%% %%%%%,%$%4%<%%%%%%%#%3%+%;%K% %/%(%7%?%%0%%%8%BNUZ?Tac(Y"uzP`cn%efhW'ebq[YІ{}b}b|[^c fhHǗgONO OMOPIVY7YZ\ `aapfipuOupy}}ÄcUzS;NNW߀xNXn8z2(/QASpTTVY_m-bpT S[p–So\zNxn&VUk;YSmftܕVBNKO SU[0_qf fhl8lm)t[vzN4[`muvʙ`iSQWX0YD[^`(cclopqqYqs?~vх`[XielZu%QY.Ye__bej*k'ksV,\l{Q\KahvraNYOSx`in)zON SNOUO=OOsRSV YZ[[yfggkLlpksyyz<{ۃwӇfV)NO\brYu;傽řNOVXJX^_`*``babbe9AffhmwppuLv}uQRYT[]ahimxˈWrmlWgΒRVT^bdhkSlWo"ooEtuvw z{|!}6f̌Qeә(N8T+\]svLw<\ TXOOSqUVhWYG[ [\^ ^~_cg:eeghhj_^0kll}uyH[cz}_w̏Z/__`hjtZxwN^NO|OPPQIQlRRRSSTTUWQWY}[T[][]]]^x^^^_`RaLbbce;ffCfgmh!hil_m*min/nu2vxlz?|}}}^}T*RLaʑuqx?M؝;R[RSTXboj_QKR;TJVz@w`sDo pu_`ښrۏkdNVWdXZZ`haffh9hmu}:nBNOPSU]o]]gltsxPWP^c+PPQgTX^Y[_ibMch=ksnp}rxx&yme}0܈ RdW(gPjQWB*X:iT]WxO\RJTd>f(ggz{V}"/h\{9SQR7[bddg-kvcLvfRN PS\q`dech_qsu#{~ۑxefkNNO:OR:SSUVXYYY[P\M^^+_`ce/[\eeegkbk{lsEyIy|}}+󉖊^ifnjܖ̘koNOtuxy: 3ꄔlP_X+z[NSWY1Z[`nou[{Prg\aJ~Q\chfeqny>}ʐnǐPR\:gSp|r5Lȓ+[_1`N;S[bKg1krsz.kRQSTj[cj9}VSTh[\1]Oabm2yy}B~MҁFrt/1KlƑNOOQESA_bglAn sc~&͒SY[my]~.|X~qQSO\f%wzQ_eiokmnodv}]uQRb@ffn^}rfRSYs^_`UdPQRS SGSTUFU1VYhYZ<[\\\\^^^_pbbbccwff f-fvg~hjj5lmn nXq d_xRbcdBb-z{}v INQHSCS`[\\]b&bGdhh4lmEmgo\qNq}ez{}~Jz9n΍xwRMUo8q6Qhy~U|VLXQ\cffiZruuyyVy|} }D4;a PRuSSP UXYOr=[\dS``c\cc?cdef]iioqNuvz|}}aIXlōpmPXaӅ5 OPtRGSs`ocIg_n,O\^e}SRQvc[X[k\ d gQ\NYY*lpQU>XY`bSg5iU@Ě(OSX[\^/_` aKb4flnހ΁Ԉ.ۛNSY'{,Lnp'SSUD[bXbblot"8o8QSSOFTYj1]zꏿhڌ7rHj=N9SXVWfbcekNmn[pwz{}=Ɔˊ[VX_>efjku7P$wW0_`efzl`uznE{u\z{QĐyz6Zw@N-N[_bft6x4ZFuO^bceWgovrL̀)MP WZhisqdrXjyw)O/ReSZbglv}{|6fo r~Q{xr{{Hj^auQu`QkbnvzOpb{OVzXY䖼O4R$SJSS^d,egl>lNrHrsuT~A,錩{đqic=fiujvxЅCS*SQT&Y^_|`bIbybekluvxy}w^j |8P\>_gkt5w ;gzS9u_f_<_ub{Feg llpx2~+ނ *JҘlNONPRVWJY^=__b?fgghQ}!~2T ,SPS\Xdg4rgwfzFRlkX^LYTg,QvdixTWYf'gkTi^UggRh]NOSbg+lO~mNabno+Tsg*E]{\[ƇnJzY|lw RY"q!r_wۗ'ai ZZQT T}fvߏYr]nQMh}}bdxj!Y[_ksv}Q2g(vgbR\$b;|~UO`} SN_QYr:6_%wS_y}3Vg󅮔Sa alvR8U/OQQ*RS[^}`acg gngms6s7u1yPՊJćYNOYN?P^|Y[^ccdfiJim nqu(zIɉ! e} a~bk2lmtmge}o#,TBojp2RZA^_gi|imjorbr{~KQmy2P-Tqkjā`gNNkhin~xU_ NNN*N1N6NzYUYPYNYZYXYbY`YgYlYiYxYYO^OYYYYYYYYZ%ZZZZ ZZ@ZlZIZ5Z6ZbZjZZZZZZZZZZZZZ[ [ [[2Z[*[6[>[C[E[@[Q[U[Z[[[e[i[p[s[u[xe[z[[[[[[[[[[[[[[[[[[\\\\ \\ \"\(\8\9\A\F\N\S\P\O[q\l\nNb\v\y\\\Y\\\\\\\\\\\\\]\] ]]]\]]]]]"]]]]L]R]N]K]l]s]v]]]]]]]]]]]]]]]]]]]]^ ^^^^^6^7^D^C^@^N^W^T^_^b^d^G^u^v^z^^^^^^^^^^^^^^^^^^^^^^^__ _]_\_ ___)_-_8_A_H_L_N_/_Q_V_W_Y_a_m_s_w____________________`_`!`````)``1```+`&``:`Z`A`j`w`_`J`F`M`c`C`d`B`l`k`Y`````````````````_````aMaa``a``aa!``a aaGa>a(a'aJa?acMdcOcccccvcccccckcicccccccccdd4ddd&d6edd(ddgdodvdNe*ddddddddddddddd ddbdde,ddddedeeee$e#e+e4e5e7e6e8uKeHeVeUeMeXe^e]erexeeeeeeeeeeeeeeeeegrf fegsf5f6f4ffOfDfIfAf^f]fdfgfhf_fbfpffffffffffffffffff?fffffgggg&g'8g.g?g6gAg8g7gFg^g`gYgcgdggpgg|gjgggggggggggggggggggggjhhFh)h@hMh2hNhh+hYhchwhhhhhhhhjhhthhhihh~ihihi"i&hi hhhhi6iihhi%hhhi(i*ii#i!hiyiwi\ixikiTi~ini9iti=iYi0iai^i]iijiiiiiiii[iiiiij.iiiiiiijjik iiijijijij jjj#jjDj jrj6jxjGjbjYjfjHj8j"jjjjjjjjjjjjjjjjjjjjkjkk1kk8k7vk9kGkCkIkPkYkTk[k_kakxkykkkkkkkkkkkkkkkkkkkkkkkkklllll$l#l^lUlbljllllll~lhlslllllllllllllllllmMm6m+m=m8mm5m3mm mcmmdmZmymYmmommnn mmmmmmmmmmmmmmmmmn-nnn.nnrn_n>n#nkn+nvnMnnCn:nNn$nnn8nnnnnnnnnnnnnnnnoAopLnnno?no1no2no>onoozoxooooo[oomoo|oXoooofooooooooooooooop p opppoppotpppp0p>p2pQpcppppppppppppq pqqqeqUqqfqbqLqVqlqqqqqqqqqqqqqqqqqqqqr rrr(r-r,r0r2r;rsNsOsWsjshspsxsus{szsssssssstttot%st2t:tUt?t_tYtAt\titptctjtvt~ttttttsttttttttttuuuu uu uuuu&u,uz7zCzWzIzazbzizpzyz}zzzzzzzzzzzzzzzzzzzzzzzzzz{{{ {{3{{{{5{({6{P{z{{M{ {L{E{u{e{t{g{p{q{l{n{{{{{{{{{{]{{{{{{{{{||{{|`|||{{|| {|#|'|*||7|+|=|L|C|T|O|@|P|X|_|d|V|e|l|u|||||||||||||||||||||;|||||}}}}} }E}K}.}2}?}5}F}s}V}N}r}h}n}O}c}}}[}}}}}}}}}}}~=}}}}}}}}}}}}}~~ ~#~!~~1~~ ~ ~"~F~f~;~5~9~C~7~2~:~g~]~V~^~Y~Z~y~j~i~|~{~}~}~~~~~~~~~~~~8:ELMNPQUTX_`higxq܀ !(?;JFRXZ_bhsrpvy}Qۀـ݀Āڀց )#/KF>SQqneft_Ɂ́сف؁ȁځ߁ )+83@YX]Z_dbhjk.qwx~߂҂ރ܃ 5421@9PE/+#|su΃؄  " 8m*(ALONIV[Zk_lot}:A?HLNPUblxz|bȌڌ  N͍gmqsύڍ֍̍ۍˍߍ B504JGILPHYd`*cUvr|ƎŎȎˎێ  &3;9EB>LIFNW\bcdڏ!  '659OPQRI>VX^hovr}bHۑ20JVXceisrɑˑБ֑ߑۑ,^WEIdH?KPZϒD."#:5;\`|nV֓דؓÓݓГȓ6+5!:ARD[`b^j)puw}Z|~oÕ͕̕Օԕ֕ܕ!(./BLOKw\^]_frlΖ˖ɖ͉Mܗ Ֆ$*09=>DFHBI\`dfhRҗkqy|z×Ɨȗ˗ܗOzߗ 8$!7=FOKkopqtsĘØƘ !$ ,.=>BIEPKQRLUߙۙݙؙљ+7EB@C>UM[W_bedikjϚњӚԚޚߚ"#%'()*./2DCOMNQXtʛƛϛћқԛ:   .%$!0G2F>Z`gvx *&#DA?>FH]^dQPYrozĝƝϝٝӝuy}a̞ΞϞОԞܞޞݞv!,>JRTc_`afgljwrvX/iǐYtdQq  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~\¦æĦŦƦǦȦɦʦ˦̦ͦΦϦЦҦӦԦզ֦צѧҧӧԧէ֧ا٧ڧۧܧݧާߧơȡš~ߢࢺʢˢҡӡԡա֡סء١ڡ̡ۢ¤äĤŤƤǤȤɤʤˤ̤ͤΤϤФѤҤӤԤդ֤פؤ٤ڤۤܤݤޤߤ¥åĥťƥǥȥɥʥ˥̥ͥΥϥХѥҥӥԥե֥ץإ٥ڥۥܥݥޥߥ滰岼ͿТУµʺξФХЦðЧШЩǵǷ˳ЪЫ֦ЬЭλͽЯвްгде˴жμзийомнлкʩƻ¾пǤİȲȼâ㽻ͤ;Ǻդʻϸեη¥¯ɶ¦˵ѣѤѡѢƯѥνѦѩѧѨѪѬѫѮѯѭѲѱѰѳѴͥѶѵѸѷѹѺѼѻѽѾȬϻʼ¶ŵǺƺ̾̽Ӻٽο೮ᶧ̱ȡʬڴȽɹ§˶έعҢңϫҥҤҦļͦҧưҨ̳ҩҭҪҫҮүҰұҲҳҵҷҶҸҹҺһҼҽҾɤƿҿȾ´ñȱ¨˲߱ͧȿѸŶáڲ漸˱ɳ߱Ʊ̾Ǹۿʭ߸Ϥ̣̿ӣӡӾ鳱ӥӤӢӦӯӧӨӭӬůӮӫөӪӴͣӺӹӰӱӶӳӷӸӵӻӲӽӿӼӵʶԧòԾʮȸǹϿԡԢԣԤԦԥԨԩԪԫԭԮ˷ԬԯԳó԰ԴԲԵԶԷԹԺԻԸԱԼԽԿԾǸݴƲʽȹŶʯοͼɽ¿̴ŷåʳաբǡǥի̯֬գզ˸էըլխժթɱղհ̼ճձկծշոմϬնչպյ̻ջɲռստվ¸ֻڹ׳¹֣״갸뼼ͨ㾬̩뻡ǫͿмºƳܿǢϲ֢֡Ÿ°˼ְֱֲֳִֵ̨֤֥֧֪֭֮֨֩֫֯ƽֶַָֹֻּֽ־ֺֿ̦çġӵĢ˹ȨʾʿǯͩģŹٺýϭספץףקצערשת׭׫׬׮ׯǶװױϮײ׵Сб׶Ĥ׷ʦ︹׸׹׿ĥ׺ɫ׻׼׽׾״׳ķɧɷĦʱȷΧ̽ҸħŰյɬǦֻ˺˻حǰ©ءاإأؤآͪئǺجذةخدثرتبؽظصضعؼطغشؾؿسػֹزųθӰٷͫʰƴ꺩Ĩ١٢٣٤٥٦٧˼٨٩ʧ٬٪٭٫ٮʱٯٲٰٷٱٳٴٸٵȴڭٻôپټٺٶٹ翡ϻٽͰĩ˰ªĽپDZΫõص·ͬȴ»ŦDzƵűŻڥڧڣڤڢٿڦڡګڬŧڮکگڨڳڲڱڴڶڵڹڷڸڻںڼڰڽھڿǶŨʸϼѻۿι²ܴöܰۦȰĪ˽ۣۢۡۤۥۧۨ۩ʱȹ۪۫غͭ۬Ŀۭϯ˾īۮۯ۰̤ܻ۲۴۷۶۳۵۸ɺ¼ۻ۹«ۺۼ۽ۿ۾̻ƿɢ˿ͮƺʱ۳˺ʺܷͷɰܲܡܣܧêܫܨܢܬܪܦ̺ܥܯܱܰܩܭܮܿܤܻܸܾܷܼܴܽܵܺܶܳϰܹóϱιɸîݡݬݨݧݦݣݥݤݪϦݭݩݫȧݮݲݯݰݳݴݶ缡ݸݷݺִݽݼݾ÷ݿĻ޼Ϳղ̱ɹ繾ʨޡˡޤޢˢȵťޥޣްޯެƶަ̹ީޮޭިޫުή޶޴ޱ޳ϲ޵޺Ͱ޷޲޸޾޿øͰʥ޻źѾ޽޼ҽ۵߰¬ѹ̫ùͯѼȮ︻ίŮũߣɺϳߢ̡ߡ߯ߪ߳߬Ĭߩߦߥ߮ߨߧ߭ߤ߰߱߶ߵ߷ߺߴ߸߲ǻ߹߾߼߿߻Ǩ޹߽߫޺ϧúˣʲ̵Ǯdz绸ּĭ౲̶ϴʪȶìϵǭͱͲѱΨΰֶɻżͳÿҴĮ³ȪαȫɭάɥտԼΡȯɴŪݹľǸÿ̲įƷ̷û䶺ֵֺˤβȣ㫷ʹ˿ǪɼɶϽʡǩٲŽ̭ɣʰ˲Է̹ƹѱϲҾֶݷΩεƸèüѿݼūɮȦȵϲ̧ýȢȤ϶ηʴ̰γǴ崡ʵǼɳӹɻʶºߺ娿Һ妷岷³ǹþ忰нԴ˥Ż歺ȳ溷Ϸμϼÿʹİ㿦ϸȥϾȩɪԻϰ˦ƹǽ̮æǾı礹IJʢɨǿ¡˱жڪҼа޴չ忧˧ݶسڸɩƺ˨̰ΪơǬ㳸̬˩ϡ̢¢ּƢ骻ŷƣݱݢȸκ׼ֳȺ˪̪ϹijͻާʽͰɽжµ΢͵Σʣ˫ʤ뫸믿보ƤˬɾηóǧͶظïĴĵ͡űڰƥɵ죵ëƦ˭ЮɿϲŴȵŽDzϨ±ϻҹ£մĶ­ϩķƧµžŷϵ͢ŲҡäԹéųƨƩ®¤Ϣɯۿͷײƻã½Ŭ͸ˮšϺ͹ŢĽȰкӼΤڶţ޳ն߳ŴȭƼĸ˯ϣϿŭƪĹ۳سչȶƮؽƫΦδ𦳬ݾȻͺΥ㼶ʷ̸Ϫ۱Գǣĺ´Ƭ۳鸲ſҬݻ˰Ẕ́ضζƭȱɦݵ̥ϥʫճ۰ͱíĻȷ˱ƾ򼲲̹˲ϼйԵŤɡζʡˡܡ䡩£ãģţƣǣȣɣʣˣ̣ͣΣϣУѣңӣԣգ֣ףأ٣ڡϡСáŽÎĎŎƎǎȎɎʎˎ͎̎ΎώЎюҎӎԎՎ֎׎؎َڎێ܎ݎގ