Liu 板


LINE

看板 Liu  RSS
虽然 liu-uni*.tab 的格式早已不是什麽秘密, 许多程式都能直接读写, 也有像 boshcvterv21 [1] 的工具程式. 但公开的文件似乎只有 liubig5.tab 的说明 (也许只是我找不到) 由於我在 FreeBSD 也需要类似 boshcvterv21 的工具, 所以我观察了一下 liu-uni*.tab 的格式, 简单说明如下, 让有兴趣的朋友也能自己写程式处理. 我只简要介绍, 请参照 liubig5.tab 的格式说明会比较清楚. 表格大致可分五部份, 依序是 1. 32*32 的 index, 每个 2byte, 基本上跟 big5 版一样, 0~31 表示 " abcdefghijklmnopqrstuvwxyz,.'[]" 差别在於 big5 版记的是档案中的位址, unicode 版记的是字的个数 (因为档案超过 64k 了) 接着有 2byte, 其值表示总共有 n 个字 2. 接下来 2n 个 bit, 每字 2bit, 表示每个字的最高位 2bit 最後不足 1byte 的部份补零 3. 接下来 n 个 bit, 每字 1bit, 我还不清楚用途为何 这就是 boshcvterv21 输出的 + 号, 还望板上各位解说 最後不足 1byte 的部份补零 4. 接下来 n 个 bit, 每字 1bit, 表示是否最简码, 0b=最简码, 1b=非最简码 这就是 boshcvterv21 输出的 * 号 最後不足 1byte 的部份补零 5. 接下来 3n 个 byte, 每字 3byte, 跟 big5 版的格式相同, 前 10bit 分别表示第 3,4 按键, 之後的 14bit 是该字的低位元 这 14bit 与第 2 部份的 2bit 组成一个完整的字, 采用 unicode 值. 由於不会有空白开头的拆法, 所以 .tab 的前 64byte 其实可以挪作其他用途. 观察发现 0~1 byte 刚好是第 2 部分开始的位址, 2~3 byte 刚好是 2n bit 所需的 byte 数, 也就是第 2 部分的长度 4~5 byte 刚好是字数, 也就是 n 6~7 byte 刚好是 n bit 所需的 byte 数, 也就是第 3,4 部分的长度 其他看起来都是 0 [1] http://liu.twbbs.org/liuftp/tools/ 由於还不至於太长, 以下附上我写的 perl 程式, 可将 liu-uni*.tab 转成文字档 文字档转 tab 则留给有兴趣的人当习题 ;) #!/usr/bin/perl use encoding 'utf8'; use integer; my $filename = shift || 'liu-uni.tab'; open F, '<:raw', $filename or die $!; { use bytes; local $/; @b = map ord, split //,<F>; } close F; $i1 = getint16(0); $words = getint16(4); $i2 = $i1 + getint16(2); # or + ($words*2+7)/8 $i3 = $i2 + getint16(6); # or + ($words*1+7)/8 $i4 = $i3 + getint16(6); # or + ($words*1+7)/8 #printf "words %d 0x%x\n", $words, $words; #printf "i1=0x%x, i2=0x%x, i3=0x%x, i4=0x%x\n", $i1, $i2, $i3, $i4; my @rootkey = (split //," abcdefghijklmnopqrstuvwxyz,.'[]"); for my$i(0 .. 1023) { my @key; $key[0] = $rootkey[$i/32]; $key[1] = $rootkey[$i%32]; next if $key[0] eq ' '; for $ci(getint16($i*2) .. getint16($i*2+2)-1) { my $bit24 = getbits($i4, 24, $ci); my $hi = getbits($i1, 2, $ci); my $lo = $bit24 & 0x3fff; #printf "%x %04x\t", $hi, $lo; $key[2] = $rootkey[$bit24>>19]; $key[3] = $rootkey[$bit24>>14 & 0x1f]; my $flag_unknown = getbits($i2, 1, $ci); my $flag_sp = getbits($i3, 1, $ci); print join '', @key; $char = chr($hi<<14 | $lo); printf "\t%s", $char; printf "\t%s", $flag_sp?' ':'*'; printf "%s", $flag_unknown?' ':'+'; print "\n"; } } sub getint16 { my($addr)=@_; return $b[$addr] | $b[$addr+1]<<8; } sub getbits { my($start, $nbit, $i) = @_; if($nbit==1 || $nbit==2 || $nbit==4) { my($byte)=$b[$start+$i*$nbit /8]; my $ovalue = $byte>>(8-$nbit - $i*$nbit %8); return $ovalue & ((1<<$nbit)-1); } elsif($nbit>0 && $nbit%8==0) { my $nbyte = $nbit / 8; my $value = 0; my $a = $start + $i * $nbyte; while($nbyte--) { $value = $value<<8 | $b[$a++]; } return $value; } else { die; } } --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.204.141.15
1F:推 Fenikso:liu-uni1.tab後面还有同音字对照表和一段垃圾 11/25 03:28
2F:→ Fenikso:不过那好像有没有都没差.. 11/25 03:28







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP