diff --git a/corpus/generated/ASCII/en/validation/ascii.bin b/corpus/generated/ASCII/en/validation/ascii.bin new file mode 100644 index 0000000..d86e6b0 --- /dev/null +++ b/corpus/generated/ASCII/en/validation/ascii.bin @@ -0,0 +1 @@ + !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ \ No newline at end of file diff --git a/corpus/generated/Big5/zh/validation/big5.bin b/corpus/generated/Big5/zh/validation/big5.bin new file mode 100644 index 0000000..d6089ae --- /dev/null +++ b/corpus/generated/Big5/zh/validation/big5.bin @@ -0,0 +1,2 @@ +現┎戈癟м羆菏快そ㎝キ单诀穦〆穦快礚毁锚呼古砛璸购辨硓筁裹蹦ノ礚毁锚呼砞璸呼崩笆穨㎝诀篶ㄤ呼蹦ノ礚毁锚呼砞璸琵穦顶糷珹摧痚よ獽莉呼戈癟㎝ㄏノ呼狝叭礚毁锚呼古砛璸购箋贱ㄥ搂盢20134る15ら羭︽Ω羭快瓣悔IT蹲弘眒笆ぇΤ闽冈薄叫聅凝硂柑 +現┎璓崩笆ネ約獂莱ノ戈癟м現┎戈癟м羆菏快そ秨甶兜翠┦古砛璸购醇眶古砛璸购喘ら盽ネい縩伐ㄏノ戈癟の硄癟м躬纘膥尿ㄏノ戈癟の硄癟м古砛璸购砞Τ蝗簧贱疭﹚戳丁ЧΘ﹚璶―莉箋秘古砛靡の贱礟Τ闽冈薄叫聅凝硂柑 \ No newline at end of file diff --git a/corpus/generated/EUC-JP/ja/validation/euc-jp.bin b/corpus/generated/EUC-JP/ja/validation/euc-jp.bin new file mode 100644 index 0000000..b433417 --- /dev/null +++ b/corpus/generated/EUC-JP/ja/validation/euc-jp.bin @@ -0,0 +1,10 @@ +毖胳は戮の驴くのヨ〖ロッパ咐胳が积っている叹混の呈恃步や瓢混の客疚恃步のほとんどを己ったため、矢面の呈簇犯∈茂が茂に部をどうするか∷を胳界に巴赂しており、したがって胳界が盖年弄であり≈矢房∽がはっきりしている。 +泣塑の毖胳兜伴ではCˇTˇオニオンズの捏晶した5矢房という雇え数が毖胳の答塑矢房として弓く蝗われている∈悸狠には、5つの矢房ではうまく棱汤できない矢も赂哼するとし、5矢房を动拇しすぎることが笛って池浆の烁げになる、という肩磨も牧しくない∷。 +5矢房は、毖矢の面看をなす肩胳揭胳婶尸において、涟弥混痰しに胳を事べただけで矢ができあがっている湿を尸梧したものと咐える。そこで蝗われている胳は肩胳としての叹混、赂哼を咐う揭胳としてのbe瓢混、侯脱を咐う揭胳としての办忍瓢混、肩胳の拉剂や觉轮を咐う妨推混、办忍瓢混の誊弄胳になる叹混、その誊弄胳に滦する柒推弄な揭胳になる瓢混の付妨や叹混や妨推混である。このように5矢房は肩胳と瓢混と、涟弥混痰しで事ぶ叹混とその叹混に滦して柒推弄な揭胳として事ぶ帽姐な妨という嘎られた婶尸において、事んだ胳の硷梧によって尸梧し5つの妨にまとめた湿と咐える。ここには矢の络答塑である肩胳と揭胳に崔まれている罢蹋への雇弧がなされていない。そのため罢蹋に答づいて咐驼を蝗脱しようとしている池浆荚にはかえって烁げとなっているのである。 +これまでは布淡の矢房が肩妥かつ脚妥なものであるとして胺われてきた。毖矢の菇陇の尸梧恕としての5矢房は泣塑笆嘲の柜ではあまり办忍弄ではないが、瓢混の胳恕を棱汤する惧では、≈答塑5矢房∽をベ〖スとした瓢混房の尸梧が坤肠弄に减け掐れられていて、ジ〖ニアス毖下辑诺、Oxford Advanced Leaner's Dictionary 霹の驴くの涪耙ある辑今において姥端弄に何脱されている。 +奶撅、渴乖妨の矢は妈2矢房とは斧なさず、瓢混婶尸を话帽附など肩胳に圭わせた妨にして矢房を雇える。また窗位妨も票屯である。また减瓢轮の矢も5矢房に碰てはまらない。凡瓢混を崔む矢は凡瓢混链挛を1つの瓢混と雇えることが驴い。また、凡瓢混は锦瓢混と塑瓢混が突圭したものであるので、泼侍な妨の锦瓢混として胺えばよい。 そもそも5矢房は锦瓢混を近殿した肩胳と揭胳の婶尸において胳の事びだけによって尸梧した湿なのである。 +ランドルフˇクァ〖クは烧裁胳A (Adverbial) を裁えた雇え数を捏晶している。烧裁胳Aは饯峻胳Mとは佰なり臼维することができない。この雇えでは骄丸の5矢房にSVAとSVOAという矢房が裁わる。また妈2矢房のうちVがbe瓢混の眷圭を泼侍に胺う雇えもある∈つまりS be C∷。また AˇSˇホ〖ンビ〖は妈3矢房、妈4矢房、妈5矢房のOやCが稍年混や尸混や瓢叹混やthat泪の眷圭などで嘿かく尸梧した矢房を捏晶している。 + +ゲルマン废の帽胳のほかに、ラテン废の帽胳も寒掐しているが、これは、ノルマンˇコンクエスト笆惯、フランスから丸た诞虏超甸がロマンス紧胳のオイル胳废のノルマン胳を厦していたことの逼读である∈箕袋弄には 11坤氮笆惯で、面毖胳∷。毖胳の叹混に拉や呈がほぼ久糖して、胳萨恃步もほかのヨ〖ロッパ胳と孺べてとても警ないのはこのノルマンˇコンクエストによってである。それ笆涟は剩花であったイギリスの咐胳が、イギリスの诞虏超甸や阑喀荚や兜徽がノルマン客になり毖胳を厦さなくなった冯蔡、筋瘫の粗で词帽に厦せるように词燎步されていった。それとともに诞虏超甸やジェントリ〖がフランス胳にも夺いノルマン胳を厦し、阑喀荚がラテン胳を厦すようになりその冯蔡として驴くのラテン胳やフランス胳も稼脱されることになった。 + +カナダは傅毖挝竣瘫孟であった孟拌だが、その毖挝竣瘫孟にそれ笆涟はヌ〖ベルフランスであり、海でもフランス胳が蝗われ鲁けているケベック剑があることから、カナダ链挛の给脱胳として毖胳とフランス胳の尉数が扩年されており、息水蜡绍のサイトや措度の睛墒棱汤などは链て毖施尉咐胳で乖われている。奠毖挝の柜としては、链客庚の柒、毖胳を熟胳とする客の充圭は58%と你く、フランス胳が22%を狸める。これは、败瘫が润撅に驴いため妈企咐胳として毖胳を蝗脱している客庚が润撅に驴いからである。また、アメリカ圭桨柜が钨に疤弥していることから、奠毖挝であるとはいえ、オ〖ストラリアやインドなどほかの奠毖挝竣瘫孟とは般い、孺べるとカナダの毖胳はイギリス毖胳よりもアメリカ毖胳に夺いが、帽胳の闹りとしてはイギリス毖胳及を何脱することが驴い。ケベック剑ではフランス胳が给脱胳であることから、毖胳を熟胳とせず毖胳笨脱墙蜗が光くない客も警なくないが、ケベック剑とニュ〖ブランズウィック剑、オンタリオ剑笆嘲ではほとんどフランス胳が蝗われないこともあり、カナダ毖胳におけるフランス胳の逼读は厂痰に夺い。 \ No newline at end of file diff --git a/corpus/generated/EUC-KR/ko/validation/euc-kr.bin b/corpus/generated/EUC-KR/ko/validation/euc-kr.bin new file mode 100644 index 0000000..fb3cf07 --- /dev/null +++ b/corpus/generated/EUC-KR/ko/validation/euc-kr.bin @@ -0,0 +1,13 @@ +扁夯利栏肺 哪腔磐绰 箭磊父 贸府钦聪促. 臂磊唱 促弗 巩磊俊档 箭磊甫 瘤沥窍咯 历厘钦聪促. 蜡聪内靛啊 俺惯登扁 傈俊绰 捞矾茄 箭磊甫 瘤沥窍扁 困秦 荐归 啊瘤狼 促弗 扁龋拳 矫胶袍阑 荤侩沁嚼聪促. 窜老 扁龋拳 规过栏肺绰 葛电 巩磊甫 器窃且 荐 绝菌嚼聪促. 抗甫 甸绢 蜡反 楷钦俊辑父 焊歹扼档 葛电 阿 唱扼喊 攫绢甫 贸府窍妨搁 咯矾 俺狼 促弗 扁龋拳 规过捞 鞘夸钦聪促. 康绢客 鞍篮 窜老 攫绢狼 版快档 傍烹利栏肺 荤侩登绰 葛电 臂磊, 巩厘 何龋 棺 抛农聪拿 扁龋俊 嘎绰 窜老 扁龋拳 规过阑 爱绊 乐瘤 给窍看嚼聪促. + +捞矾茄 扁龋拳 矫胶袍篮 肚茄 促弗 扁龋拳 矫胶袍苞 面倒钦聪促. 溜 滴 啊瘤 扁龋拳 规过捞 滴 俺狼 促弗 巩磊俊 措秦 鞍篮 锅龋甫 荤侩窍芭唱 鞍篮 巩磊俊 措秦 促弗 锅龋甫 荤侩且 荐 乐嚼聪促. 林绢柳 葛电 哪腔磐(漂洒 辑滚)绰 辑肺 促弗 咯矾 啊瘤 扁龋拳 规过阑 瘤盔秦具 钦聪促. 弊矾唱, 单捞磐甫 辑肺 促弗 扁龋拳 规过捞唱 敲阀汽 埃俊 傈崔且 锭付促 弊 单捞磐绰 亲惑 颊惑狼 困氰阑 稗霸 邓聪促. +蜡聪内靛肺 葛电 巴阑 秦搬且 荐 乐嚼聪促! + +蜡聪内靛绰 荤侩 吝牢 敲阀汽, 橇肺弊伐, 攫绢俊 包拌绝捞 巩磊付促 绊蜡茄 箭磊甫 力傍钦聪促. 蜡聪内靛 钎霖篮 Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, Sun, Sybase, Unisys 棺 扁鸥 咯矾 雀荤客 鞍篮 诀拌 急滴林磊俊 狼秦 盲琶登菌嚼聪促. 蜡聪内靛绰 XML, Java, ECMAScript(JavaScript), LDAP, CORBA 3.0, WML 殿苞 鞍捞 泅犁 澄府 荤侩登绰 钎霖俊辑 鞘夸窍哥 捞绰 ISO/IEC 10646阑 备泅窍绰 傍侥利牢 规过涝聪促. 捞绰 腹篮 款康 眉力, 夸硫 荤侩登绰 葛电 宏扼快历 棺 扁鸥 腹篮 力前俊辑 瘤盔邓聪促. 蜡聪内靛 钎霖狼 何惑苞 捞甫 瘤盔窍绰 档备狼 啊侩己篮 弥辟 傈 技拌俊 阂绊 乐绰 扁贱 版氢俊辑 啊厘 吝夸茄 何盒阑 瞒瘤窍绊 乐嚼聪促. + +蜡聪内靛甫 努扼捞攫飘-辑滚 肚绰 促吝-楷搬 览侩 橇肺弊伐苞 昆 荤捞飘俊 烹钦窍搁 饭芭矫 巩磊 技飘 荤侩俊 乐绢辑 惑寸茄 厚侩 例皑 瓤苞啊 唱鸥吵聪促. 蜡聪内靛甫 烹秦 府浚瘤聪绢傅 绝捞 促吝 敲阀汽, 攫绢 棺 惫啊 埃俊 窜老 家橇飘傀绢 敲阀汽 肚绰 窜老 昆 荤捞飘甫 格钎肺 伙阑 荐 乐嚼聪促. 捞甫 荤侩窍搁 单捞磐甫 颊惑 绝捞 咯矾 矫胶袍阑 烹秦 傈价且 荐 乐嚼聪促. +蜡聪内靛 能家矫决俊 措秦 + +蜡聪内靛 能家矫决篮 厚康府 炼流栏肺辑 泅措 家橇飘傀绢 力前苞 钎霖俊辑 咆胶飘狼 钎泅阑 瘤沥窍绰 蜡聪内靛 钎霖狼 荤侩阑 俺惯窍绊 犬厘窍哥 厘妨窍扁 困秦 技况脸嚼聪促. 能家矫决 糕滚奖篮 哪腔磐客 沥焊 贸府 魂诀俊 辆荤窍绊 乐绰 堡裹困茄 雀荤 棺 炼流狼 裹困甫 唱鸥忱聪促. 能家矫决狼 犁沥篮 傈利栏肺 雀厚俊 狼秦 面寸邓聪促. 蜡聪内靛 牧家矫决俊辑狼 糕滚奖篮 傈 技拌 绢蠢 镑俊辑唱 蜡聪内靛 钎霖阑 瘤盔窍绊 弊 犬厘苞 备泅阑 瘤盔窍绊磊窍绰 炼流苞 俺牢俊霸 俺规登绢 乐嚼聪促. + +歹 磊技茄 郴侩篮 侩绢笼, 抗力 蜡聪内靛 荤侩 啊瓷 力前, 扁贱 沥焊 棺 扁鸥 蜡侩茄 沥焊甫 曼炼窍绞矫坷. diff --git a/corpus/generated/GB18030/zh/validation/gb18030.bin b/corpus/generated/GB18030/zh/validation/gb18030.bin new file mode 100644 index 0000000..26534d6 --- /dev/null +++ b/corpus/generated/GB18030/zh/validation/gb18030.bin @@ -0,0 +1,13 @@ +基本上,计算机只是处理数字。它们指定一个数字,来储存字母或其他字符。在创造Unicode之前,有数百种指定这些数字的编码系统。没有一个编码可以包含足够的字符:例如,单单欧州共同体就需要好几种不同的编码来包括所有的语言。即使是单一种语言,例如英语,也没有哪一个编码可以适用于所有的字母,标点符号,和常用的技术符号。 + +这些编码系统也会互相冲突。也就是说,两种编码可能使用相同的数字代表两个不同的字符,或使用不同的数字代表相同的字符。任何一台特定的计算机(特别是服务器)都需要支持许多不同的编码,但是,不论什么时候数据通过不同的编码或平台之间,那些数据总会有损坏的危险。 +Unicode正在改变所有这一切! + +Unicode给每个字符提供了一个唯一的数字,不论是什么平台,不论是什么程序,不论什么语言。Unicode标准已经被这些工业界的领导们所采用,例如:Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, Sun, Sybase, Unisys和其它许多公司。最新的标准都需要Unicode,例如XML, Java, ECMAScript (JavaScript), LDAP, CORBA 3.0, WML等等,并且,Unicode是实现ISO/IEC 10646的正规方式。许多操作系统,所有最新的浏览器和许多其他产品都支持它。Unicode标准的出现和支持它工具的存在,是近来全球软件技术最重要的发展趋势。 + +将Unicode与客户服务器或多层应用程序和网站结合,比使用传统字符集节省费用。Unicode使单一软件产品或单一网站能够贯穿多个平台,语言和国家,而不需要重建。它可将数据传输到许多不同的系统,而无损坏。 +关于Unicode学术学会 + +Unicode学术学会是一个非盈利的组织,是为发展,扩展和推广使用Unicode标准而建立的,Unicode学术学会设立了现代软件产品和标准文本的表示法。学术学会的会员代表了广泛领域的计算机和资讯工业的公司和组织。学术学会只由会员提供资金。Unicode学术学会的会员资格开放给世界上任何支持Unicode标准和希望协助其扩展和执行的组织及个人。 + +欲知更多信息,请参阅术语词汇表,Unicode产品样本,技术简介和参考资料。 diff --git a/corpus/generated/ISO-2022-CN/zh/validation/iso2022cn.bin b/corpus/generated/ISO-2022-CN/zh/validation/iso2022cn.bin new file mode 100644 index 0000000..48f38a6 --- /dev/null +++ b/corpus/generated/ISO-2022-CN/zh/validation/iso2022cn.bin @@ -0,0 +1,13 @@ +$)A;y1>IO#,MPhR*:C<8VV2;M,5D1`Bk@40|@(KySP5DSoQT!#<4J9JG5%R;VVSoQT#,@}HgS"So#,R2C;SPDDR;8v1`Bk?IRTJJSCSZKySP5DWVD8#,1j5c7{:E#,:M3#SC5D<MJGK5#,A=VV1`Bk?ID\J9SCO`M,5DJ}WV4z1mA=8v2;M,5DWV7{#,;rJ9SC2;M,5DJ}WV4z1mO`M,5DWV7{!#HN:NR;L(LX6(5D]M(9}2;M,5D1`Bk;rF=L(V.]W\;aSPKp;55DN#OU!# +Unicode$)AU}TZ8D1dKySPUbR;GP#! + +Unicode$)A8xC?8vWV7{La9)AKR;8vN(R;5DJ}WV#,2;B[JGJ2C4F=L(#,2;B[JGJ2C43LPr#,2;B[J2C4SoQT!#Unicode1jW-1;UbP)9$R5=g5DAl5!#WnPB5D1jW<6_5D4fTZ#,JG=|@4H+GrHm<~<=a:O#,1HJ9SC4+M3WV7{D\9;9a4)6`8vF=L(#,SoQT:M9z]4+Jd5=Pm6`2;M,5DO5M3#,6xN^Kp;5!# +$)A9XSZUnicodeQ'JuQ';a + +Unicode$)AQ'JuQ';aJGR;8v7GS/@{5DWiV/#,JGN*7"U9#,@)U9:MMF9cJ9SCUnicode1jW<6x=(A"5D#,UnicodeQ'JuQ';aIhA"AKOV4zHm<~2zF7:M1jW5D1mJ>7(!#Q'JuQ';a5D;aT14z1mAK9c7:AlSr5D:MWiV/!#Q'JuQ';aV;SI;aT1La9)WJ=p!#UnicodeQ'JuQ';a5D;aT1WJ8q?*7E8xJ@=gIOHN:NV'3VUnicode1jW<:MO#M{P-VzFd@)U9:MV4PP5DWiV/<08vHK!# + +$)AS{V*8|6`PEO"#,Gk2NTDJuSo4J;c1m#,Unicode2zF7Qy1>#,<$l$KHV9f$r3d$j?6$k$3$H$K$h$C$F07$($k$h$&$K$7$^$9!#%f%K%3!<%I$,=PMh$k$^$G$O!"$3$l$i$NHV9f$r3d$j?6$k;EAH$_$,2?I4$NB?$/$N4k6H$K:NMQ$5$l$F$$$^$9!#%f%K%3!<%I$O!"(BXML$B!"(BJava$B!"(BECMAScript(JavaScript)$B!"(BLDAP$B!"(BCORBA 3.0$B$J$I$N:G@hC<$NI8=`$NA0Ds$H$J$C$F$*$j!"%f%K%3!<%I$r$NB?$/$N@=IJ$G%5%]!<%H$5$l$F$$$^$9!#%f%K%3!<%II8=`$N=P8=$H%f%K%3!<%I$r%5%]!<%H$9$k%D!<%kN`$O!":r:#82Cx$K$J$C$F$$$k%=%U%H%&%(%"5;=Q$N%0%m!<%P%k2=$NN.$l$KBP$7$F!"FC$KLr$KN)$C$F$$$^$9!#(B + +$B%f%K%3!<%I$r%/%i%$%"%s%H%5!<%P!<7?$N%"%W%j%1!<%7%g%s$d!"B?AX9=B$$r;}$D%"%W%j%1!<%7%g%s!"%&%'%V%5%$%H$J$I$K$KAH$_9~$`$3$H$G!"=>Mh$NJ8;z%3!<%I%;%C%H$rMQ$$$k$h$j$bL@$i$+$J%3%9%H:o8:$,2DG=$G$9!#%f%K%3!<%I$O!"C10l$N%=%U%H%&%(%"@=IJ!"C10l$N%&%'%V%5%$%H$K!"2?$iAw$9$k$3$H$r2DG=$H$9$k$N$G$9!#(B +$B%f%K%3!<%I%3%s%=!<%7%"%`$K$D$$$F(B + +$B%f%K%3!<%I%3%s%=!<%7%"%`$O!":G?7$N%=%U%H%&%(%"@=IJ$HI8=`$K$*$$$F%F%-%9%H$rI=8=$9$k$3$H$r0UL#$9$k!H%f%K%3!<%II8=`!I$N9=C[!"H/E8!"Ia5Z!"MxMQB%?J$rL\E*$H$7$F@_N)$5$l$?Hs1DMxAH?%$G$9!#F1%3%s%=!<%7%"%`$N2q0w$O!"%3%s%T%e!<%?!<$H>pJs=hM}$K78$o$k9-HF$J4k6H$dAH?%$+$i9=@.$5$l$F$$$^$9!#F1%3%s%=!<%7%"%`$O!":b@/E*$K$O!"=c?h$K2qHq$N$_$K$h$C$F1?1D$5$l$F$$$^$9!#%f%K%3!<%II8=`$r;Y;}$7!"$=$N3HD%$H\$7$$$3$H$r$*CN$j$K$J$j$?$$J}$O!"(BGlossary, Unicode-Enabled Products, Technical Introduction $B$*$h$S(B Useful Resources$B$r$4;2>H$/$@$5$$!#(B diff --git a/corpus/generated/ISO-2022-KR/ko/validation/iso2022kr.bin b/corpus/generated/ISO-2022-KR/ko/validation/iso2022kr.bin new file mode 100644 index 0000000..b630d41 --- /dev/null +++ b/corpus/generated/ISO-2022-KR/ko/validation/iso2022kr.bin @@ -0,0 +1,13 @@ +$)C1b:;@{@87N DDG;EM4B <}@Z88 C38.GU4O4Y. 1[@Z3* 4Y8% 9.@Z?!55 <}@Z8& AvA$GO?) @z@eGU4O4Y. @/4ODZ5e0! 039_5G1b @|?!4B @L7/GQ <}@Z8& AvA$GO1b @'GX x>z=@4O4Y. ?98& 5i>n @/74 ?,GU?!<-88 :84u6s55 8p5g 0" 3*6s:0 >p>n8& C38.GO7A8i ?)7/ 03@G 4Y8% 1bH#H- 9f9}@L GJ?dGU4O4Y. ?5>n?M 00@: 4\@O >p>n@G 0f?l55 0xEk@{@87N ;g?k5G4B 8p5g 1[@Z, 9.@e :NH# 9W EWE)4ODC 1bH#?! 8B4B 4\@O 1bH#H- 9f9}@; 0.0m @VAv 8xGO?4=@4O4Y. + +$)C@L7/GQ 1bH#H- =C=:E[@: 6GGQ 4Y8% 1bH#H- =C=:E[0z Cf59GU4O4Y. Ao 5N 0!Av 1bH#H- 9f9}@L 5N 03@G 4Y8% 9.@Z?! 4kGX 00@: 9xH#8& ;g?kGO0E3* 00@: 9.@Z?! 4kGX 4Y8% 9xH#8& ;g?kGR nAx 8p5g DDG;EM(F/Hw <-9v)4B <-7N 4Y8% ?)7/ 0!Av 1bH#H- 9f9}@; Av?xGX>_ GU4O4Y. 1W7/3*, 5%@LEM8& <-7N 4Y8% 1bH#H- 9f9}@L3* GC7'F{ 0#?! @|4^GR 6'864Y 1W 5%@LEM4B GW;s p>n?! 0|0h>x@L 9.@Z864Y 0m@/GQ <}@Z8& A&0xGU4O4Y. @/4ODZ5e G%AX@: Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, Sun, Sybase, Unisys 9W 1bE8 ?)7/ H8;g?M 00@: >w0h <15NAV@Z?! @GGX C$EC5G>z=@4O4Y. @/4ODZ5e4B XML, Java, ECMAScript(JavaScript), LDAP, CORBA 3.0, WML 5n0z 00@L Gv@g 3N8. ;g?k5G4B G%AX?!<- GJ?dGO8g @L4B ISO/IEC 10646@; 18GvGO4B 0x=D@{@N 9f9}@T4O4Y. @L4B 89@: ?n?5 CpF.-<-9v 6G4B 4YA_-?,0a @@?k GA7N1W7%0z @% ;g@LF.?! EkGUGO8i 790E=C 9.@Z <n<- ;s4gGQ :q?k @}0( H?0z0! 3*E8334O4Y. @/4ODZ5e8& EkGX 8.?#Av4O>n85 >x@L 4YA_ GC7'F{, >p>n 9W 190! 0#?! 4\@O n GC7'F{ 6G4B 4\@O @% ;g@LF.8& 8qG%7N ;o@; x@L ?)7/ =C=:E[@; EkGX @|<[GR v?! 4kGX + +$)C@/4ODZ5e D\v@: :q?58. A6Aw@87N<- Gv4k n A&G00z G%AX?!<- EX=:F.@G G%Gv@; AvA$GO4B @/4ODZ5e G%AX@G ;g?k@; 039_GO0m H.@eGO8g @e7AGO1b @'GX <v 8b9v=1@: DDG;EM?M A$:8 C38. ;j>w?! A>;gGO0m @V4B 1$9|@'GQ H8;g 9W A6Aw@G 9|@'8& 3*E83@4O4Y. D\v@G @gA$@: @|@{@87N H8:q?! @GGX Cf4g5K4O4Y. @/4ODZ5e DAv?!<-@G 8b9v=1@: @| <<0h >n4@ 0w?!<-3* @/4ODZ5e G%AX@; Av?xGO0m 1W H.@e0z 18Gv@; Av?xGO0m@ZGO4B A6Aw0z 03@N?!0T 039f5G>n @V=@4O4Y. + +$)C4u @Z<nA}, ?9A& @/4ODZ5e ;g?k 0!4I A&G0, 1b byte >= 0x80); + index.push({ + encoding: encoding.name, + iconv: encoding.iconv, + language: fixture.language, + split: fixture.split, + document: fixture.document, + path: relative(destination, outputPath), + bytes: encoded.length, + highBytes: highBytes.length, + uniqueHighBytes: new Set(highBytes).size, + sha256: sha256(encoded), + }); + } + continue; + } + for (const languageCode of encoding.languages) { const language = sourceByLanguage.get(languageCode); if (!language) @@ -182,7 +212,10 @@ export function buildCorpus(destination) { if (document.split === 'train') trainBuffers.push(encoded); } - if (modelHighByteCount < 10 || modelHighByteValues.size < 3) { + if ( + encoding.name !== 'ASCII' && + (modelHighByteCount < 10 || modelHighByteValues.size < 3) + ) { throw new Error( `${encoding.name}/${languageCode} has insufficient high-byte coverage`, ); diff --git a/scripts/model-utils.mjs b/scripts/model-utils.mjs index 7c66d93..5583f77 100644 --- a/scripts/model-utils.mjs +++ b/scripts/model-utils.mjs @@ -200,6 +200,7 @@ function statisticallyCompetitive(best, candidate) { function compileSingleByteModels() { const models = []; for (const encoding of manifest.encodings) { + if (encoding.model === false || encoding.fixtures) continue; if (encoding.name === 'CP949') continue; const byteMap = byteMapFor(encoding.iconv); diff --git a/scripts/validate.mjs b/scripts/validate.mjs index 80c2aeb..5886441 100644 --- a/scripts/validate.mjs +++ b/scripts/validate.mjs @@ -15,15 +15,7 @@ function option(name, fallback) { return arg ? arg.slice(prefix.length) : fallback; } -function percent(value, total) { - return total === 0 ? '0.00%' : `${((value / total) * 100).toFixed(2)}%`; -} - -function increment(object, key) { - object[key] = (object[key] ?? 0) + 1; -} - -const split = option('split', 'all'); +const split = option('split', 'validation'); const rows = corpusIndex.filter( (row) => split === 'all' || row.split === split, ); @@ -49,107 +41,52 @@ const results = rows.map((row) => { }; }); +function ok(value) { + return value ? '鉁' : '鉂'; +} + +function percent(value, total) { + return total === 0 ? '0.00%' : `${((value / total) * 100).toFixed(2)}%`; +} + const summary = { files: results.length, + predicted: results.filter((result) => result.predicted !== null).length, encodingCorrect: results.filter((result) => result.encodingCorrect).length, languageCorrect: results.filter((result) => result.languageCorrect).length, - noPrediction: results.filter((result) => result.predicted === null).length, }; -const bySplit = {}; -const byExpectedEncoding = {}; -const topPredictions = {}; - -for (const result of results) { - const splitSummary = (bySplit[result.expected.split] ??= { - files: 0, - encodingCorrect: 0, - languageCorrect: 0, - }); - splitSummary.files += 1; - if (result.encodingCorrect) splitSummary.encodingCorrect += 1; - if (result.languageCorrect) splitSummary.languageCorrect += 1; - - const encodingSummary = (byExpectedEncoding[result.expected.encoding] ??= { - files: 0, - encodingCorrect: 0, - languageCorrect: 0, - predictions: {}, - }); - encodingSummary.files += 1; - if (result.encodingCorrect) encodingSummary.encodingCorrect += 1; - if (result.languageCorrect) encodingSummary.languageCorrect += 1; - increment(encodingSummary.predictions, result.predicted?.name ?? ''); - increment(topPredictions, result.predicted?.name ?? ''); -} - console.log('Library corpus validation'); console.log('========================='); -console.log(`Split: ${split}`); -console.log(`Files: ${summary.files}`); -console.log( - `Encoding correct: ${summary.encodingCorrect}/${summary.files} (${percent( - summary.encodingCorrect, - summary.files, - )})`, -); -console.log( - `Language correct: ${summary.languageCorrect}/${summary.files} (${percent( - summary.languageCorrect, - summary.files, - )})`, -); -console.log(`No prediction: ${summary.noPrediction}`); - -console.log('\nBy split'); -console.table( - Object.entries(bySplit).map(([name, item]) => ({ - split: name, - files: item.files, - encodingCorrect: item.encodingCorrect, - encodingAccuracy: percent(item.encodingCorrect, item.files), - languageCorrect: item.languageCorrect, - languageAccuracy: percent(item.languageCorrect, item.files), - })), -); - -console.log('\nBy expected encoding'); -console.table( - Object.entries(byExpectedEncoding) - .sort(([left], [right]) => left.localeCompare(right)) - .map(([encoding, item]) => ({ - encoding, - files: item.files, - encodingCorrect: item.encodingCorrect, - encodingAccuracy: percent(item.encodingCorrect, item.files), - languageCorrect: item.languageCorrect, - mostCommonPrediction: Object.entries(item.predictions).sort( - ([leftName, leftCount], [rightName, rightCount]) => - rightCount - leftCount || leftName.localeCompare(rightName), - )[0][0], - })), -); - -console.log('\nTop predicted encodings'); +console.log(''); // empty line +const summaryRows = [ + ['Split', split], + ['Files', summary.files], + ['Coverage', percent(summary.predicted, summary.files)], + ['Encoding Accuracy', percent(summary.encodingCorrect, summary.files)], + ['Language Accuracy', percent(summary.languageCorrect, summary.files)], +]; +const summaryWidth = Math.max(...summaryRows.map(([label]) => label.length)); +for (const [label, value] of summaryRows) { + console.log(`${label.padEnd(summaryWidth)} ${value}`); +} +console.log(''); console.table( - Object.entries(topPredictions) + results .sort( - ([leftName, leftCount], [rightName, rightCount]) => - rightCount - leftCount || leftName.localeCompare(rightName), + (left, right) => + `${left.expected.encoding}/${left.expected.language}`.localeCompare( + `${right.expected.encoding}/${right.expected.language}`, + ) || left.expected.path.localeCompare(right.expected.path), ) - .map(([encoding, count]) => ({ encoding, count })), -); - -const failures = results.filter((result) => !result.encodingCorrect); -console.log('\nFirst 20 encoding mismatches'); -console.table( - failures.slice(0, 20).map((result) => ({ - expected: result.expected.encoding, - language: result.expected.language, - split: result.expected.split, - predicted: result.predicted?.name ?? '', - predictedLanguage: result.predicted?.lang ?? '', - confidence: result.predicted?.confidence ?? '', - path: result.expected.path, - })), + .map((result) => ({ + expected: result.expected.encoding, + lang: result.expected.language, + predicted: result.predicted?.name ?? '', + predictedLang: result.predicted?.lang ?? '', + confidence: result.predicted?.confidence ?? '', + encodingOk: ok(result.encodingCorrect), + languageOk: ok(result.languageCorrect), + path: result.expected.path, + })), ); diff --git a/src/encoding/iso2022.test.ts b/src/encoding/iso2022.test.ts index 15b611b..320e1e1 100644 --- a/src/encoding/iso2022.test.ts +++ b/src/encoding/iso2022.test.ts @@ -20,7 +20,7 @@ describe('ISO-2022', () => { it('should return ISO-2022-KR', () => { expect(analyse('iso2022kr')).toEqual({ confidence: 100, - lang: 'kr', + lang: 'ko', name: 'ISO-2022-KR', }); }); diff --git a/src/encoding/iso2022.ts b/src/encoding/iso2022.ts index 6252639..4ef85fa 100644 --- a/src/encoding/iso2022.ts +++ b/src/encoding/iso2022.ts @@ -114,7 +114,7 @@ export class ISO_2022_KR extends ISO_2022 { return 'ISO-2022-KR'; } language() { - return 'kr'; + return 'ko'; } escapeSequences = [[0x1b, 0x24, 0x29, 0x43]]; }