↑对,这就是正片↑(同步自敝知乎专栏,不定期更新)(可能有点小,可以按Ctrl + "+"放大整个网页)
高清(确信)版:http://farter.cn/zzdm/latest.png
不用任何教程,试试对着表解码一下:
43 295 817 146 140 113 773 723 04 331 129 217 105 883 401 185 821 14 321 471 0268 742 495 04 903 02 75 0302 674
(分区内,先行后列,02是“亻*”,20是“女*”,0-02是“虫*”,00-02是“亼/”)
尚未定稿,表与细则仍在调整,暂勿直接用于存储。
~从甲骨文出发的汉字编码~
众所周知,汉字中的大多数是由偏旁部首(统称为部件)组合出来的。
字理组字,就是按照汉字字理,组合构造出来的字,可以用表里的部件组出任何“讲道理”的字。
“这字是啥加啥,咋拼的,怎么表示的这个意思,我们古老的象形文字画的究竟是啥,以前是怎么写的,中间流传传抄演变的过程会不会写错了?”
字有字理,但字也会变化。有分,有合,也总有些字变得不是很讲理,看不出它是啥加啥。
本表把每个部件从甲骨文金文(若有)的源流到楷体印刷正体在中日朝韩越新马各国家地区的演化发展全流程纳入考虑,每个部件对应着尽量源头的写法,有理有据有根。(用的时候,你也需要考虑)
本编码期望为古籍规范数字化填坑加速,为人名地名生僻字文化保留铺平道路,为汉字发展释放造字活力扫除障碍。
本表酌情把常用而又变妈不认或者学术上仍不确定(统称有坑)的整体安排进码位,视作单体,不是一个“完全拆分到头”的字根树部件树。
本编码理论上可以用作输入法(比五笔郑码等26键形码是要硬核得多,但比电报码区位码JIS码Unicode还是更友好的,并且它由字理实现统一)。
本表也可以用作业余无线电电报码,一两张纸精炼信息搞定,而不需要整一本电码本字符集来翻。
本编码期望做字体、做输入法(尤其大字集、多地区)的开发者使用作为内码,不需要等Unicode收了你才有地方放生僻字。
本编码可以用于按规则生成相当大一部分结合时“没有不规则变化”的字的形码码表,还可以省去跟现行码表里的讹字对字形搞特殊区分码的绝大部分功夫。(重码高了不讨好,但无意义的同理异码在本编码里就不该存在)
本表实际上也是一个部件统合表、简繁类推表,力求达到异体写法(在多个层次上)分分合合的一个合理自洽的状态。
本编码甚至可能用作手写识别、机器学习古文字识别的直接目标编码,也可以作为智能动态组字的源编码。你感受到了么?
但总的来说,要把本表全部掌握牢固,可能还是算半个学汉语言文字砖业的big学生了(?)
但是通读一遍,也能入个门了吧(??)
此处真情实感建议,放大全图,逐区逐字浏览一遍,再回来继续看说明。
如果遇到一个生僻字,组得出来(表里找到,拼就完事了,但是注意字理,里面有“!”就是有坑要小心),成了,你就用规范的组字码串表示这个字。
只需要有做字人在字型(字体文件)里以这个码串为题,添加一个对应矢量图或像素字,你用这个字型(如果有生之年我做出了这套渲染系统的文本框),输入这个码串,便可显示。
到别的地方如果用的字体文件里没有这个码串,那确实暂时不能显示,但至少可以回退显示一串部件,表示这个字是由哪些部件组成的。
如果未来智能动态组字普及了,那就不成问题了,只是显示可能暂时丑点,随着技术进步终将修好。
常见类推简化部件简繁同码,若以本编码作简体字型,自然应该是统一简体部件。(细节后述)
这样,姓名地名“常见生僻字”、方言字、民间合字、道教讳秘字、天地会秘文、减字谱、合音字、网友新造字、喃字壮字、日月干戈心zuibiang……绝大部分,都不需等待任何批准收录,就可有理有据地编码表示。(遵守一些细节规则,下述)
比如最近最火的“鸟/甲”,代码就是“024 10 150”,简繁同码(或者就是简体)。
如果组不出来,八成是你这字有问题。如果你认为是另外两成,欢迎留言讨论【比如实在异形的方言字地名字
能编码出多少字呢?理论上那就是无限的,用已收录部件讲字理的前提下完全自由,你可以用你认为对的字根与部件按规则粘成一个码串,就固定代表那个字了。
只是这个码串可能不符合“最短最简洁”常规需要纠正,可能合规但由于没被字型收录等原因,显示不出拼好的样子而已,毕竟目前动态组字还没那么成熟。做好这个平台,推动技术成熟吧。
但是,即使码串是合法的,合不合字理另说。可以就从你在画甲骨文的角度去想象。你当然可以画一对月亮,但朋友的“朋”实际上是大鹏尾巴的一大把羽毛;你还可以画一根禾苗,两边有两个人背对着(北),但“乘椉”实际上是一个大脚人站在一棵大树顶上……
这些就是字理了,是学科专业知识,可以去网上查古文字写法,可以去书里学,慢慢积累。
类似的“有坑”部件,本表多是收为单体,直接就用的,不需要去组。需要拼的生僻字古字如果有坑,就需要专业选手来辨认鉴别了。当然,做好字表词表对接上各种现有输入法后,一般用户就不需要拼字这一步。除非,遇到了输入法字表里没收的生 僻 字,或者你想造字了。
坑本身确实对应着字理,理解记忆这些坑,就对应着真正古文字演变的知识了。
相对的,五笔郑码等实用输入法形码,其中也总会有很多例外边角特殊规则,但它们是为输入法的实用性与性能参数(重码率)而人为规定的。
完全掌握本编码方案,确实也意味着要掌握这些“例外、讹变”,但它们是有古籍古文字来源依据的,可以说是“要背也是背了真的、有意义的东西”。
本编码只编码汉字(包括壮字喃字等基于汉字部件的),标点符号目前都还没有【可以用独立的(空)代替着先
本编码的码位是数字串不是数字,00 000 0000,98 098 0098分别都是不同的码位,变长是因为适应汉字部件本身的频率分布。
每个码位分别有是否粘左、是否粘右的属性,这里的左右粘指码串位置的退和进(粘退粘进粘前粘后,太怪了……)。码串内相邻两码位之间若左不粘右、右不粘左,则是两字的分界。
“+”为包围杂合(即,任何复杂例外结合),“*”左右,“/”上下,“^”为优先级最高的修饰符,类似数学的符号便于理解优先级。
01<⿰> 10<⿱> 11<⿴⿻> 为“结合符”(等于是“*、/、+”二元中缀运算符)左右都粘,优先级与对应的粘法(“自带结合符”)一样。两边不粘需要焊接,或者明确改组合方式时才用它,多数时候不需要用。
(组字举例可能是强拆的,只为示意,如果码表里已经收录为单体,则实际编码应该直接用单体)
包围(以及杂合)关系相对严格要求,只有在“如果强行不包就空一大块丑得报警”的情况才算包。其余情况多如只有一笔伸过去的,都算左右或上下。(只在需要插结合符的情况考虑。表内预置粘右还是按照常识,如“走”标为包围结合)。例如“麻磨 䧹鹰 辰唇 石席 鹿麋”等等普遍适用本条,算上下。不然“鼠 麦”不同地区全分成两种炸了。
具体长笔画伸不伸过去随字型实现。此处插播一个“屎女屡”,就根本不是按字理拆分的。本是“尸娄”(84 536)。但如果你真想用甲骨文画一个有人在女上拉屎【那编码还是上下(0296 070)
“辶 廴 凵”还是都算包围,但是本编码选择强调规律性,牺牲今文字笔顺,编码上还是包围部在先,粘右。顺便“廴”有大坑,“凵”还真是坑,“辶”还在“徒從”等字里。
“宀 皿”算上下,虽然古时候是包围,这里还是向今文字妥协了,“齐”也统一算上下(?)。
“颖 颣 嗀 啟”形的“包围”算上下,这是最需要注意的;“戈口→戓 ?口→哉”拿不出去的算包围(“戈止→武”才是上下,“则戈→贼”算左右)。
“疆聽”这种太怪了还在纠结,目前算左右……“乙凵”如“氹凼”也尚在纠结,目前算包围。
变体选择修饰符(VS,变选符),000 001 010 011四个,用于选部件的变体异体,这里的变体更关注实际多了少了零件的情况,也可能有性质变化,但倾向于无视太细节的笔形变化(交给字体字型去选择)。
无变选符视作“默认智能自动选”,具体选择哪个变体依然由字体字型决定。
期望是简繁日韩越各自《基本/常用/规范》字集(里面讲道理的部分)不需要用到变体选择。
变选符可以堆叠视作四进制串扩展选择。(?)
变选符可以加在运算符上表降低优先级。(??)
部件内变体具体列举与顺序,目前尚 未 定 义。目前码位的安排只供参考,先把码位定好再看这下一步吧。
变选符是绝大多数时候(常人写常文)不用的。仅在强行研究变体、高还原古籍时使用,需要搭配特制支持变体选择的字型。
期望是无脑去掉字符串里的变选符后,仍能表示一段同意义的文字,“不添错”。
异写分化字另论,如“气乞 巳已 牙互与”,确已分化的大概率另开码位在01xx区,可能罕用版需要拼字而常见分化字有码位(如“奈柰 粤雩”)。
略微特殊(摆烂)地,传统娱乐项目超级合字就用如“招+财+进+宝”(中间都用“11杂合”)表示,中间有些可能需要拼,可能有些细节问题。减字谱也用类似方法实现,后面详述。
没有组合字的整字变体选择,目前设计如此。这个口子一开没完。
唯一一个此用处的是“#疑”,粘左,只用于一字最后,表示按形记录而不确定字理。也许你也可以对这个码使用变选符罢(摇头
右“#”表示纯粹代表今文字字面形状,可能用于五笔郑码等形码输入法等的非字理字根表示。目前状态是极不确定的。
像 zi.tools 字統网 这里面“同声旁”带字理尚不明确部件的,录入时遇到更离谱的不认识的,就可以用后接“#疑”。可以用这个标记表示需要持续关注与校对。
半拉括号“(”左边为本码位能够直接代表的字形举例,第一个通常为单字典型。右边为需要改动(添加部件)才能组出的字例。字例同样可能是强拆示意,也要检查是否已被收录为单体。
(双)括号右边有时只是一种提示,如果右边是空的大概率是有对应未隶定的甲金初文。
字形举例有多个时,代表的是本部件“自 动 选 择 合 适 的”(实际上还可能有例字之外的)。后面详述。
由于制表便利,表中文字都以unicode今文字国标宋体为参考了,也许以后会画点甲骨文上去。
有时只有两个组出的字例,那就是这个部件Unicode没收或者在太新的区一般设备都显示不出来,看共性就知道了,你懂的。
如果不懂可以去查汉典国学大师字统网【但也不可全信哦【【【
目前带“?”的有多种情况,可能是字理还存疑,可能是摇摆要不要收录占一位还是适合手动拼(易拆、无疑,但较为常用,又需要结合符焊接)。换句话说,没带“?”的部件,默认有坑(“基本上不是你看起来那样组成的”),带了的,可能是没坑,可能是巨 大 坑……
组字,应该用尽量短的表示、尽量用字理上对的粘法、尽量用已有的粘左右。
有一些单字没有不粘形式,后缀了“~”符号提示。让它粘上一个00(空)表示单字,粘上别的就是合字,如“艹(00)→艸,禾(00)→禾”。
有些字只有粘左版(如“斤 攵 力 瓦”),想表示单体就只能先(空)再粘左。两者都有时,表示单字优先用粘右和(空)。
注意同字可能有粘左版,可能有粘右版。当作为字的右、下、内部时,若有粘左版就必用,除非需要结合符改结合方式,让码长变长,而又有不粘的单体可用,比如“女”在右时,不用只能在下的“/女”。
粘左版普遍可在下可在右,若能通过其左旁自带的组法决定就决定(甚至可以是被左旁“包围杂合”成“在内”,在组合方法意义上,包围杂合最优先)。
很多部件自带粘左粘右的方式是两可,且都有组法优先顺序(*/表示优先左右,对面不同意再上下)。若难以决定(X对Y、XY对YX)或者能确定但不对,则插入结合符可作强制修改,如“翦”等。(有时候也不需要完全死板,默认给字体自由选择的空间,如“男 界畍 略畧 勇”等目前计划为默认不需严格指定)
剩下少数情况,如两码互相都不粘,就只能用相应结合符焊起来了。
粘右版设计时倾向确定粘法,利于熟记后直接写字抄收的潜力。但仍有可能被强行修改,还需脑内缓冲。
本编码用作输入法时,实际上没什么处理,就类似区位码。需要实现的就是一些纠错、常见错拆(其实就是看起来像什么但实际不是什么,因为字形讹变了;或者表里有合体而输入者去拼了,即使拼对了)的提醒修正。
绝大多数情况,部件只看位置不分声意符,但“/*寸又彐”“/*口曰甘”是特殊,只在不作声符时才用。
用本编码做字型,需要预设好是做的简体,或某标繁体,或甲金文,或篆书,或某时期某地隶书等等,确定默认用来显示不带变体选择的普通文本时采用什么字形为第一要务。简体的话,部件应该参照表内允许形态酌情尽量类推。
不期望同一字型同时显示简繁(虽然理论能做),但类似TTC,可以有共享矢量图的多字形字体包。
期望,甲金文变体和今文字变体能对应上的,就安排在同一变选符里。甲金文字型中后起字形没有对应甲金文的部件,可以编一个【或者摆烂用今文
本表将绝大多数类推简化偏旁部首都合一了,并且酌情收录一些规范上不可类推的,使其繁体版“能表示”简体部件。这部分仍待考虑调整。
但这远没有达到直接等于进行简繁转换的地步。非一一对应的特殊字,仍需要复杂对应关系的精确简繁转换特制规则,分词甚至看词性等。这是另外的事,已有许多努力(如OpenCC等软件)但难臻完美,本编码改变不了这一现状。同往常一样,要结合上下文特别判断处理。
只是最大部分的类推替换工作,在本编码下消失了。但如果不加最后这复杂的处理,只切换字体,是一种“能看、不出错(不添错)”的转换。
关于各地各国的简化字,为方便使用,02xx收录了一些难以分类的单字,仍需逐个考虑调整。
这里有很多特别细节,如这里的“发髮”就只代表髮,用于头发,“发發”在前面别的区,用于组“拨泼”等字。在简体字字型中,可能显示为一样,但是编码上不一样,在别的地区字型中也显示不一样。
总体思想是,依据字形行书简化草书楷化的而又有一定类推例子的统合,另选声符简化的区分(此处有纠结,类推较多的,可能归于繁体部件,允许简体字型逐字选择显示换声符简化),单体代表增部件版分化字但实际两者区别不可忽视的分,局部记号字未被收录单字的,就用今文字笔形符号(05xx区后带#的)。表内搜不到的,就说明完全分开了,自己拼。
这一点,我觉得需要接受,不然永远脱离不了按“整体今文字形”编码,“宁”永远同时是㝉的繁体和寧的简体,另外如国标的“月、肉”碰上再分,收录顺序不同的时候也就尴尬了。
如果发电报,人给人抄收译码,那字理上有点错也没问题,都会简体字都能懂。但输入计算机的最好是统一的。
以此码渲染文本的系统,理想地,应该在渲染时醒目(不要太醒【)标记不常用字、可能错误、可能异常编码(但可能是汉字研究文章一个刻意体现不同字形的编码,可能是带变体选择)、可能最后带着“#疑”(说人话就是8105∩6763之外全标黄),最好是统一提供鼠标移上去后显示“字理组字码串显示和解释”工具提示。(这个深入UI框架去了,算是做梦,但在web上还真不是大问题了?)
(此处举例均略去了具体组合方式)
部件顺序,比较显然的是,包围杂合的大的先,上下左右先上和左,特别难决定时,按第一笔所在部件先。
部件一旦稍多,结构树不是严格能够确定的,但多数时候(加上一点点书法考量)可以确定。
这种组合不确定性本就经常发生(如“荆荊 㽔蕤 邃莲 黙勲 憩簸㓹”……)。初学拆字时也要多往这方面想,被扭歪的多数是声符。
本编码认为这种差异(即本字理码规范编码相同)不可能认为两个字(“字位”),如有反例请不吝赐教。
包围的结合优先级最低,但:
当包围部件有左旁或上旁时,如“俯蔗槌笝”等,结合优先级的理解上可以不严格,不必在这种情况认为违反字理,强行调优先级。
当包围的右侧或下侧是开放的时,如“郾劂励”,那方向上又有左右上下结合,同样不必(甚至多数时候就有此类变形如“取最㓹罽”)。需要强分的情况,也就是那方向也封闭,“慁恩爴剛鹇”等极少数情况。
但是上下和左右都是分的。如“鵝鵞䳘䳗、㲻氽汄氼”四个码串都不同。(然而也有少数如“融稣略”有坑,想避免混乱,如果收录为单码位,就顺便把不同结构统了)
有一些特别组合方式导致合体字书写顺序被拆开,但如果那个合体字明显自成字理层级而不是散开的,此时部件的顺序,按字理层级,而不是笔顺。假设把“顷禾→颖”中的顷强拆开,就也应按“匕页禾”而不是“匕禾页”;“须此→頿、(嗀)禾→穀”等同理。(其实阴谋过“阝土”“酉皿”等合体作为包围部件,但忍住了,所以还是按书写顺序了)(这里也欢迎边缘例子,我觉得会有)
某个部件兼容少了零件多了零件的情况时,如果单字(在当前字型的目标字形风格中)默认是少零件的,手动加零件表示一定要用多零件版(这里其实有点纠结)。相反情况如果默认是多零件版而想用少零件的,用变选符指定。
单字和被用于组字的时候,默认选择不一定是一样的,如“睿叡”在繁体环境,单字选“叡”,“氵”黏上它还是可以实现为“濬”,毕竟繁体常常也有从X省的。
总的来说,也是理解为“智能自动选择合适的那种”,除非加了变选符表示意图。
默认选多零件版但又被加一次的情况,字型实现不加两次,只理解为“要用加了的”,明显不该重复加的就不加。一个怪点的例子,U+31F63 应该编码“艹华”,简体可以显示成“艹华”,繁体还是显示“華”。
虽然但是,就算除开“鑫森淼焱垚”这样的叠字,我们确实还是已经有很多类似“曝呵圆樑溢燃墅擧捧暮”的重复偏旁(曾被评为“叠床架屋”)的字,这些贴的方向不一样不同质,所以码串里表达出来了还是要照样加的。
如果多零件的出现在括号右边提示中,那说明这个码位只能代表少零件版,是必须要手动加上对应零件才代表多零件的字。
若按本表定义制作简体字型,则常见部件都应该(按本表定义)类推,自然都应该是“一致的简体”;若做日本新字体,也进行类似类推;港澳台韩标旧旧旧隶篆金甲骨文字型,都是可以实现的,只是一些后起字形可能需要造一个甲骨文【
一些在类推与否边缘的部件,可能是分码的(也就是不类推),可能是一个部件码位定义上两者都允许(也就是同码,“可选类推”),可以在不同目标地区的字型中逐字作不同选择。此时多半那个简体版也单独有码,两者配上部分偏旁,简体环境看上去就完全一样。相当于“用繁体的码”。如“兒”简体显示儿、繁体显示兒,“亻兒”简繁都显示倪。码位形如“兒!儿”表示,需要注意。(换声符、记号字情况都有,情况较复杂,多数时候简体版另有码位,如“菐!卜 劦!办 阑!兰 堇 ? 爯!尔 奥!夭 聽!听……”实际上如果按前面说的大原则,可能最终有很多会被删(也就是简繁分码),但一些不类推有群众基础,有一点纠结)这个边缘也是整理调整重点,一些部件的处理可能不完全符合相关国家标准。讨论字形时可以用变选符指定一种,前提是字型要支持加了变选的。
要表示叠字,用后接101(吅)110(吕)111(品)这几个“叠字修饰符”,它们都可表示简体以“双”、两点、四点代替重复部件的情况。重复三次如“三川”形的,用两次(吅)或(吕)。横纵先后不明的“㗊”形或更多不定形重复,用两次(品)(已在80x的三叠字,只用一次,如各种四田“雷壨”用畾+(品))。
200(旋转翻转),以及周围的几个,极少使用,暂定:单用为“智能选择最常见的一种翻法”,200 001横翻,200 002纵翻,200 003旋转180°,200 000“最常见旋法”,200 000 001顺90°,200 000 002逆90°。
为了程序处理(判断字与字的边界)简洁,表内标记了粘右的部件加上变选符或者各种叠字符后,都失去向右粘的属性。若要接一个不粘左的部件,中间需要再插对应的结合符。
汉堡包形,左右或上下部件相同或对称(字理上)时,一律认作包围,从头拼的话用“[半边][叠字符][包围][中间]”。“^^(北)”叠字符表示两者相反(相向/相背?),用于“修饰”叠字修饰符(就是跟在它后面),此处细则待定。
其实有很多,少零件版,从X省,但省前的X没有收录为码位的情况。这里的坑在于,有些复杂部件省后也还是一个完整的字。这里规定,如果这个被省的整体“省后成字”,且字理对得上是“完整的一部分”,则用省后的字(也可能得拼)作此部件,这里其实对应很多声符错配丢失现象,如“玉册→珊(删),劦肉→脋(协)、木㐬→梳(疏)、酉禾→酥(稣)”;否则要完整使用未省的字,如“革匊言(鞠言)→鞫;差鱼→鲝”(单纯羊在上留出一撇的极少)。
如果含变选符的码串在字型中未收录,则试着去掉串内所有(部分?)变选符再查找字库并渲染。如果此时成功,可以渲染但也作视觉提示区别。再失败,就渲染为部件序列好了。
实际上对于组出来的字整体,依然适用“智能决定”,不排除做上一些微小缩合处理(也对应着“杂合”)而不需要变选符,甚至会有一些特殊约定,讲理就行。
必须有的例子也不少,如“土弓畺→疆;彖矢→彘;亻侯→候;凡鸟→鳳(!);卧品→临臨;贤忠→贒”(能分析为上下/左右就尽量,若不明确的组合方式、严重变形丢部件融合时,再用包围杂合;边缘情况欢迎讨论)。本编码无意编码所有精确变化,若你想表现,那你用unicode private variation selector area去呀【【【【本编码拟允许部件接连续三个及以上的变选作为私用定义变体?
汉字部件的分分合合,从细微笔形差异到各种演化简化,在形式上几乎是连续的(数分爷别杠球球嘞),立出一个标准就是要在中间砍一刀分两半,可以说砍哪里都有问题。
本方案仍将继续改进,尽量做到足够合理再定稿。
048x两怪字的词,为了占用码位少,暂用一码表示两个字,变选符选单字,方案仍在纠结,是否要一个“有意义的不应删除的选字符”。
我当然是希望方便查找、方便记忆的,如果真的浏览了一遍,还是看得出一些“规律”吧。
但汉字就是这么博大精深,没有一个严谨的死规则全局好用。甚至就连分区的方式也是,一旦想贯彻一种,都总有刺头会出来让这个规则显得很蠢。
从古至今已有意符部首、声符韵部、四角号码、拼音注音序等多种尝试,依然是各有各的局限与不便,达不到理想的境界。况且本方案的目标还略微远大一点,想要包揽古今。所以如果从像数学一样严谨的意义上说,就是没有规律,只有熟悉整张表。
本表顺序甚至考虑了字频与摩尔斯电码(屁牌TIANSMURDH码欢迎食用)长度【目前顺序位置没有冻结,欢迎提出调序建议
实际最一致的方面的大概还是局部按偏旁共性、字频、组字能力排列。
猜错不是你的错,尽管本编码已经努力隐藏很多坑,但汉字字理就是还有这么多的坑。
我同时致力收集这些坑作为附录,以及放进将来的直接组字码输入法,如果用户输入匹配上错的串,就提示改正就好了(同样,如果输入了收为单码字的合体字正确组合,也提示改为单码字;但这样的组合串是合法码流,可能用于表示“没有缩合变化的简单确定组合”,对一些分化的特殊情况还必须用,如“柰邪党杰”等),这也算最直球的字理普及、增量学习方式吧。标准数据整理好了,功能实现真不是什么难事。
有单体代表字尽量使用代表字(用连不用车,用进進不用隹佳,用次软不用欠,用食不用亻,用打不用丁,用起不用巳,用勾不用勹,用散不用艹,用急不用刍及,用外不用卜),无单体代表字时,可以比实际部件完整(“按掐挑撞摘”用“安臽兆童啇”,泛用乏,吟用今,落用各,劈用辟,等等),但不能比实际部件少(捻拼出念,荡用艹氵?改用昜?),可以比代表字少(抹用末不用木,徽用微不用山),特殊情况(省从俗?)还待确认,中间用+连接(全部?),最后“#减字谱”。
176种古琴减字谱常用指法图览
其实已经有很多个阴谋(在4bit半字节流上的、8bit字节流上的、跟ascii共生的DCBS、寄生在utf8、utf16的、直接电码的、兼容摩尔斯电码的、26个英文字母的,自同步、子串查找无压力的,梦里都有【
简单起见,最通行、最易识的明码方式,还是数字串加空格吧。
一个类似utf8思想的,用字母数字作为码字编码(约等于36进制)方法:
2码开头用A-J,3码开头用K-T,4码0xxx开头用U-Z(感觉不会超过1+10+6个区,超了再分大小写【),分别后接1-2个数字。就自同步,子串不泄漏,不用分隔符。甚至可以用在网址上类似punycode,中文域名你怕不怕。
E3M95S17L46L40L13R73R23A4N31L29M17L05S83O01L85S21B4N21O71W68R42O95A4T03A2H5X02Q74
4bit码字编码方法,不出现码字0(约等于15进制):
[1-7][1-F]105个码位编2码“00~99”,[8-F][1-F][1-F]1800个码位3码4码塞进去即可。如果想避免大数除法让4bit处理器也能用的话,还可以第二码的低三位和第三码的四位合起来仿照2码,第一码低3位和第二码最高位合起来为分区号,1600个码位也刚好。仅前缀码,无其他优良性质。
3e976c238c28bb89ebdeba9159b28af923896c69a128ebc271f9a7a5ce59bbda7615c941361e93b5f
7bit码字编码方(伪·DBCS),兼容ASCII:
[80-FF]有128个码位,拿100个表示2码,再拿16个表示3码4码的分区号(后接一个2码),完事,还有至少10个码元可以霍霍。变长1-2字节每码位,某种程度上自同步。
比较难展示,但规则算最简单的,省略了。
实践上,在嵌入式设备等性能捉急的地方,可以要求用至多N个码位拼,比如可能最低要求,8个码位(实际上设计理念就是关注最长码串,“非怪字”5码应该是最多了,当然减字谱以及合字就不止了)。但最好还是变长索引结构,可以用上面写的4bit编码法作16叉树,供参考。
一个字,拼;四个字,查表拼字,见啥拼啥,虽然有坑,但是别怕【
你可以用它当上课传小纸条、写情书、写日记的密码【
你可以给你的网站做个防爬字体,把汉字换成用这个编码的连字【
你可以用[-/../.-/-./.../--/..-/.-./-../....](同莫尔斯电码的TIANSMURDH)分别代表0123456789然后用来发CW电报。不用最短的E避免节奏太不稳,留出了99[.... ....]作为纠错,表明编码方式的prosign拍个脑袋就是<ZZ>或者<ZZDM>(组字电码)?其他多数prosign甚至可以换成就用中文字词,数字都用长码也就不打架了,如果大量数字还可以全单码【然后参考wabun code,<SN>表示返回标准摩尔斯电码吧
如果按国际英文莫尔斯电码来解释,就是:SN AHM DIR ISU IST IIN RRN RAN TS NNI IAH AIR ITM DDN STI IDM DAI IS NAI SRI TAUD RSA SHM TS HTN TA RM TNTA URS
美签要填电报码,我们的身份证银行系统也记录一个字理码,这样一来保证姓名生僻字有理,二来就算字体没支持,不管谁收不收,至少信息系统判个等没问题。
其实,一般用户不需要操心,本编码主要是替换内码,上面完全可以接已有的输入法,拼音五笔注音仓颉该咋打咋打,只是从输出Unicode(或者GB码)变成输出本编码。具体用哪个码串,都是输入法的字表词表内部机制要操心的,就像一般人不需要操心Unicode的4E00是“一”一样。
除非,是字表词表没收的生僻字,这时你可以手动拼字,无人能挡。本编码就是没有“字符集”这个概念的,只有部件表,真没见过的部件再叫我加进去。
尚未定稿,表与细则仍在调整,可以先玩着,暂勿直接用于存储。
最终还是要讲理的。
Unihan,GB18030,都能用,但是如果你觉得它坑了,你就来看看我这个。
有IDS为啥不用?首先俺这个更短。并且,现有这些一字一码的主要问题就是实际上还是在以今文字具体字形收字去重(很多时候去了个寂寞),用它表现字理、组字有更多的坑,尽管“Unicode不指定字形”。啊对对对。语义?不妨去感受下 CJK Radicals Supplement 区。兼容区用不用?兼容区撞了隶定卡不卡?来点“月、宁、享、巿”?看看00xx、04xx、05xx区吧,古文字考虑过么?小篆区据说要开了,甲骨文准备等多久?
这部分的确很难,本方案与理想也还差得远。
字理需要的部件大量在扩BCDEFGH,大字集字体都得开天窗,知乎还能给你吃了;要么有匹配上放在PUA里的部件,不符合标准不认;单字隶定避这避那字形又怪,也没有文档说明是什么字里的什么。我们自己的字符集其实也都没做好,某种意义上,方正甲骨文算是干了一些事。
以及历史包袱,真就是一包袱九万个好东西,但是国标还是已经把整坨咽下去了。
导致做汉字处理门槛太高,一涉及细节,必然拦在面前。做6763别人看不起,做20902里面就已经有很多答辩了,做8105国内好了,想显示繁体字日语又开天窗了还是成问题。日韩汉字并没有多出“很多东西”,pan一下cjk咋就那么难呢?为什么还是经常无奈得用含有繁体部件的字呢?确实还是需要一个更《科学》(人话:人干事)的字符集,但这个字符集建立在什么之上呢?用什么来表示呢?
是有问题,但是为了兼容性,改是不可能改的,这辈子不可能改的,就是这样。等猴年马月它改了你再等做字人越过9万个好东西的包袱继续接受更新罢。
你字体字全吗?你输入法码表全吗?大字集覆盖多少?做字人、做输入法人、做动态组字人,对着那一大坨有动力做吗?
但是磕字理不容易,感谢所有汉语言文学文字学研究者的辛勤劳作,感谢所有我用过的网络字典工具无私分享。
难还难在确实还有些东西确实没有定论,还有些字可能还在地下没挖出来。同样,这个理可能也不唯一(不同时代不同层次),理还可能是被群众重新创作的(理据重构),理有些时候也是坑。留有一些余量,但只要下刀一定还是会有错的。
但至少,不再需要“值値晚晩”这种破事了。
所以本编码的理念依然是,填小坑,明大坑,排除障碍,加速向前。虽然讲理,但还是一定程度的能用就行。至少,你懂的。
Unihan漫谈【4】同字乎?异字乎?
西东:十个汉字数字化谜团
eisoch:CJK统一汉字区块认同问题存疑处收集(未竟)
金融业生僻字信息平台-北京金融科技产业联盟 这网页标题图上的常见生僻字,只有一对“㬎显”在本编码里统合,需要变选区分,别的全部直接组(简繁同码)就完事。
Group:sinzengo_U外字集01 - GlyphWiki
字統网 叶典网 汉典网 汉字全息资源应用系统
ZZDMCodec 几种表现形式的转换器,用于转换文中的示例(待补全
说文妙妙篆、异形方言字等等待收集整理,码位可选变体表、以本编码表示的CJK通行推荐字集,都还有待确定码表后进行(不过总的来说,所有单码字+8105+少量“常用生僻字”、你关注的独有的字,就接近可用了)
字库格式、渲染器、排版器、文本框,从通规、gb2312、unicode但带有地区模式选择(应对“㝉宁寧么幺”等)加坑码警告的转码表转码器,词库,输入法对接,适应本编码的简繁互转,都是后续任务,还得慢慢来……
也就是至少还有这么多坑,从浅到深的
尚未定稿,表与细则仍在调整,欢迎查漏补缺,欢迎各种建议!
欢迎分享你身边的地名人名生僻字,作为参考,也是为本编码码表字表贡献力量!
提建议时,可以查查它(各个部件)的甲骨文怎么写的。甲骨文好玩。方正甲骨文字体是免费使用的哦。
如果有什么地方觉得本文没有说清楚,欢迎提问,我会参考完善本文。
屁牌字理组字编码QQ裙:435296404,如果你坚持看到了这里,欢迎加入咨询与讨论!
【虽然有个《编码的汉字与汉字编码》裙是符合本话题的,但想了想还是避免打扰分开吧】
大家好,又见面了,我是你们的朋友全栈君。trycatch的作用:当程序发生错误时,能够保证程序继续执行下去。用一个简单例子说明:1:无trycatchpublicstaticvoidmain(String[]args){ inti; i=2/0; System.out.println(i); System.out.println(1111111111);}运行结果:不会输出1111111112:有trycatchpublicstaticvoidmain(String[]args){ inti; try{ i=1/0; System.out.println(i); }catch(Exceptione){ e.printStackTrace(); } System.out.println(1111111111); }运行结果:会输出1111111发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147750.html原文链接:https://javaforall.cn
今天无意在网上看到一个记录,说是可以通过浏览器登陆SAP系统,跟客户端有极大相似。我试用了一下,感觉还不错,不过还是有一些遗憾。 步骤如下: 1、输入:SMICM 检查一下ICM状态是否是绿灯,服务是否在运行 2、发布IntergratedITS导航到菜单Utilities----setting选择InternetTransactionServer--Publish选择IntergratedITS 3、CompleteServices 执行SE80,选择Internet服务,输入SYSTEM,按回车 右键选择SYSTEM,Publish—CompleteServices选择Internet服务,输入WEBGUI,回车。右键选择WEBGUI,Publish—CompleteServices 4、输入TCODE:SICF,执行 default--sap--public--bc default--sap--public—bsp导航到default---sap--bc--gui--sap--its—webgui激活并测试服务 5、弹出IE
预测函数逻辑函数我们知道,它是一种常见的S型函数,本来是用于研究人口增长模式的。它的公式和对应的形状也很简单: 而线性方程: 把线性方程代入逻辑函数,得到的就是我们逻辑回归算法的预测函数: 相当于线性函数是逻辑回归的核函数。至于能不能用其他的函数作为核函数,我想也是可以的吧,只要定义合理,不过线性函数肯定是最简单的。 损失函数有了预测函数还不行,机器学习关键在于学习,而学习的关键就是损失函数,一个定义良好的损失函数是非常重要的。 既然逻辑函数对应是一个曲线,那我们首先想到的就是类似线性回归一样,直接将损失定义为所有样本的模型误差的平方和,类似如下:这个定义很简单,很容易理解,可是这个并不是一个非凸函数(关于凸函数,有机会再讲),存在很多局部极小值,很难应用类似梯度下降的算法求解。因此,我们需要一个更好的定义。 实际上,逻辑回归预测函数的损失通常是如下定义的:看图形就更加清楚了: 横轴是预测值(取值在0和1之间),纵轴是损失。当实际值y=1时,我们看左图,预测值越接近1(就是越接近真实值),则损失自然越小,反之损失越大。当实际值y=0时,也是一样解读。可见这个定义是符合损失的定义的。我们
一。Go包管理历程大部分语言都有版本管理工具,比如nodejs的npm,python中的pip,java里的maven,但是go语言的版本管理经历了漫长的演进历程:Go1.5以前,golang使用GOPATH方式管理代码。代码开发必须在gopathsrc目录下。依赖包没有版本可言,都是指master最新代码。这个阶段只能手动管理依赖。开始Golang这么设计是有原因的,因为Google是一个实践MonoRepo(把所有的相关项目都放在一个仓库中)的公司。但更多的公司和组织更多的是用MultiRepo(按模块分为多个仓库),GOPATH至少解决了第三方源码依赖的问题,虽然它还不够完美。Go1.5后,有人提出了externalpackages的概念,于是就有了GoVendor解决了包依赖,用一个配置文件来管理依赖包全都下载到项目vendor下,每个项目都把有一份,不能夸项目共享公共依赖。依赖包查找路径变成了src/vendor===>GOPATH。在这种模式下,会将第三方依赖的源码下载到本地,不同项目下可以有自己不同的vendor,依然没有解决版本化问题。默认是忽略vendor的,如
原始时代1969年11月,为了便于高校间共享资源,美国国防部高级研究计划管理局建立一个名为阿帕网络ARPAnet,起初只有四个节点。阿帕网起源 一年后阿帕网的节点数量增至15个,此后平均每隔二十天就有一台大型计算机接入。随着网络在世界范围不断扩大,不同国家不同地区各自形成了一个网络,操着不同方言彼此间互不相通,诸侯割据格局已经形成。隔离的阿帕网 这个时候机器与机器之间通信是靠彼此约定的方式进行。计算机靠方言通信 机器需要自行处理网络通信过程中遇到的丢包、乱序、重试等问题。青铜时代为了解决各国家各地区网络不能互通的问题,1973年两位年轻的小伙子开始发力了,致力于研究一种通讯方法,能够解决不同机器型号的计算机互相通信,简单说就是用普通话替代方言,这就是大家熟知的“TCP/IP”协议。鲍勃·卡恩(左)与温顿·瑟夫(右)随着TCP/IP协议逐渐普及后,一张大的Internet网络由此形成。Internet 这个时候机器与机器之间通信的问题已经解决,TCP/IP可以保证信息可靠性传输,我们只用关系业务逻辑即可。依赖TCP/IP协议实现机器间传输黄金时代在TCP/IP协议刚兴起时,计算机上的应用
前言小伙伴们好久不见,最近刚入职新公司,需求排的很满,平常是实在没时间写文章了,更新频率会变得比较慢。周末在家闲着无聊,突然小弟过来紧急求助,说是面试腾讯的时候,对方给了个Vue的递归菜单要求实现,回来找我复盘。正好这周是小周,没想着出去玩,就在家写写代码吧,我看了一下需求,确实是比较复杂,需要利用好递归组件,正好趁着这个机会总结一篇Vue3+TS实现递归组件的文章。需求可以先在GithubPages中预览一下效果。需求是这样的,后端会返回一串可能有无限层级的菜单,格式如下:[ { id:1, father_id:0, status:1, name:'生命科学竞赛', _child:[ { id:2, father_id:1, status:1, name:'野外实习类', _child:[{id:3,father_id:2,status:1,name:'植物学'}], }, { id:7, father_id:1, status:1, name:'科学研究类', _child:[ {id:8,father
transfer_file.sh#!/usr/bin/expect ############################################### #Author:PedroQin #Date:2020-04-2620:26:20 #Description: #Version:1.0.0 ############################################### settimeout-1 setscript_name$argv0 #sendorrecivefile setsend_receive[lindex$argv0] setdir_name[lindex$argv1] setfile_name[lindex$argv2] setserver_offset[lindex$argv3] setserver_id[lindex$argv4] setusername[lindex$argv5] sethost[lindex$argv6] setpasswd[lindex$argv7] sethostname[lindex$argv8] setrem
爬取京东商品和评论的分布式爬虫来进行数据分析。完整代码下载地址:1、转发本文至朋友圈 2、关注微信公众号datayx然后回复京东即可获取。爬取策略众所周知,爬虫比较难爬取的就是动态生成的网页,因为需要解析JS,其中比较典型的例子就是淘宝,天猫,京东,QQ空间等。所以在我爬取京东网站的时候,首先需要确定的就是爬取策略。因为我想要爬取的是商品的信息以及相应的评论,并没有爬取特定的商品的需求。所以在分析京东的网页的url的时候,决定使用类似全站爬取的策略。分析如图:可以看出,京东不同的商品类别是对应不同的子域名的,例如book对应的是图书,mvd对应的是音像,shouji对应的是手机等。因为我使用的是获取<ahref>标签里面的url值,然后迭代爬取的策略。所以要把爬取的url限定在域名为jd.com范围内,不然就有可能会出现无限广度。此外,有相当多的页面是不会包含商品信息的;例如:help.jd.com,doc.jd.com等,因此使用jd.com这个域名范围实在太大了,所以把所需的子域名都添加到一个list: 提取数据在确定了爬取策略之后,爬虫就可以不断地进行工作了。那么爬虫
liunx上部署netcore 服务,数据库采用了sqlserver2014在运行服务时候无法启动遇到了错误 ERROR2026(HY000):SSLconnectionerror:error:1425F102:SSLroutines:ssl_choose_client_version:unsupportedprotocol复制 在docker中部署遇到了类似的错误 System.Data.SqlClient.SqlException(0x80131904):Aconnectionwassuccessfullyestablishedwiththeserver,butthenanerroroccurredduringthepre-loginhandshake.(provider:TCPProvider,error:35-Aninternalexceptionwascaught)复制 问题的原因是ubuntu20.04将openssl连接时,可接纳的ssl协议版本提高了,之前的版本不存在此问题 导致与对方建立ssl连接时,如果对方使用的不是TLS
publicclassSupport { publicintSupportId{get;set;} [Required(ErrorMessage="pleaseenteryourName")] [Display(Name="Name")] [MaxLength(100)] publicstringName { get; set; } [Required(ErrorMessage="pleseentersummary")] [Display(Name="Summary")] [MaxLength(500)] publicstringSummary{get;set;} publicvirtualICollection<FileDetail>FileDetail{get;set;} } publicclassFileDetail { publicGuidId{get;set;} &
这篇博文,我们对WebService进行一个简单的介绍和认识,作为WebService的入门。在学习之前,你需要对HTML和XML有基本的了解,WebService并不难,而且非常的简单。 什么是WebService? Webservice是应用程序组件,可以被其他应用程序使用,不是框架,甚至不是一种技术,而只是一种跨平台、跨语言的规范。 为什么要用WebService? 几年前,WebService并不流行。由于所有主要的平台均可通过Web浏览器访问web,不同的平台可以借助Web应用程序进行交互,平台之间协同工作。 Web应用程序是运行在Web上的简易应用程序。它们围绕Web浏览器标准被进行构建,几乎可被任何平台之上的任何浏览器来使用。 Webservices把Web应用程序提升到了另外一个层面: WebServices平台需支持XML+HTTP,HTTP协议是最常用的因特网协议,XML提供了一种可用于不同平台和编程语言之间的语言。 WebServices能够解决不同平台、不同语言编写的应用之间如何相互调用问题 使用WebServices,我们的应用程序可以向全世界发布信息,或提
js的Array对象有map、some、every、filter几个方法都能对数组中的每个对象进行处理,但是他们之间的功能又各有差别,所以在记下。 map():通过指定函数处理数组的每个元素,并返回处理后的数组。 varnumbers=[4,9,16,25]; functionmyFunction(){ console.log(numbers.map(Math.sqrt)); } 复制 输出结果为: 2,3,4,5 map()方法会将数组中元素依次传入方法中,并将方法的返回结果组成新数组返回。 传入的function可以有自己的三个形参,currentValue,index,arr分别代表当前元素,元素索引,元素所属数组对象;其中currentValue是必须的。 注意:map不会改变原数组,map不会检查空数组 some():用于检测数组中的元素是否满足指定条件(函数提供) varages=[3,10,18,20]; functioncheckAdult(age){ returnage>=18; } functionmyFunction(){ console.log(age
记录于2013/7/4 加入框架: MobileCoreServices.framework MediaPlayer.framework 导入头文件: #import<MediaPlayer/MediaPlayer.h> #import<MobileCoreServices/UTCoreTypes.h> 代码: if(![UIImagePickerControllerisSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]){ takePictureButton.hidden=YES;//无摄像头隐藏改按钮 } imageFrame=imageView.frame;复制 实现: -(IBAction)shootPictureOrVideo:(id)sender{ [selfgetMediaFromSource:UIImagePickerControllerSourceTypeCamera];
字典序的第K小数字 字典树 对于给定的最大数n和剩余数字k,维护一个当前的字典树前缀cur,先让k减去最小的数字1,然后计算以cur为开头的字典树的容量。计算得出的字典树的容量大于k,说明k无法容纳整棵字典树,那么就仅仅取一个数(即cur10),更新cur=cur10,缩小字典树的范围,继续以cur为开头的字典树;如果字典树的容量小于等于cur,说明剩余的数字可以容纳以cur为开头的整棵字典树,那么更新剩余的数字k并更新cur=cur+1(当前前缀已经计算完成,需要计算更大的前缀内容)。 计算以cur为开头并小于等于最大数字n的字典树容量的思路如下:维护一个最小范围first和最大范围last,这两个数字的初始值都是等于cur。进行一个循环,直到first的数量大于n跳出,循环内先将first添加Math.min(n,last)和first的差值,然后将first取最小值(first=first*10),last取最大值(last=last*10+9)。 classSolution{ publicintfindKthNumber(intn,intk){ intcur=1; k--;
MVC与MTV模型 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示: MTV Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值: M代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。 T代表模板(Template):负责如何把页面展示给用户(html)。 V代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。 除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示: 一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请
HingeLoss 解释 SVM求解使通过建立二次规划原始问题,引入拉格朗日乘子法,然后转换成对偶的形式去求解,这是一种理论非常充实的解法。这里换一种角度来思考,在机器学习领域,一般的做法是经验风险最小化ERM,即构建假设函数为输入输出间的映射,然后采用损失函数来衡量模型的优劣。求得使损失最小化的模型即为最优的假设函数,采用不同的损失函数也会得到不同的机器学习算法,比如这里的主题SVM采用的是HingeLoss,LogisticRegression采用的则是负$\log$损失, \[L(Y,P(Y|X))=-\logP(Y|X)\] 从二项分布的角度来考虑Logistic回归: \begin{aligned}P(Y=1|X)&=\frac{1}{1+e^{-\thetax}}\\P(Y=0|X)&=1-P(Y=1|X)\end{aligned} 这里另$z=\theta^Tx$, $\delta$为sigmod映射,则: \[E(z)=-\log(\delta(z))\] $E(z)$的图形如
介绍:整理的两种设置播放器播放静音的方法 一、MPVolumeView-设置音量值为0 1.获取到当前系统音量值(恢复音量时有用) volumeFloat=[selfgetVolume]; -(float)getVolume { //获取系统系统音量视图 MPVolumeView*volumeView=[[MPVolumeViewalloc]initWithFrame:CGRectMake(-1000,-100,100,100)]; volumeView.hidden=NO;//不显示系统音量调节视图 [selfaddSubview:volumeView]; volumeViewSlider=nil; for(UIView*viewin[volumeViewsubviews]) { if([[[viewclass]description]isEqualToString:@"MPVolumeSlider"]) { volumeViewSlider=(UISlider*)view; break; } } floatval=[volumeViewSlidervalue]; returnv
前言 最近把一设备(wky)刷成armbian系统折腾了一翻,下面就整理一下这些天所折腾的内容,做个记录。 armbian介绍 Armbian是轻量级的Debian系统和为ARM开发板专门发行并重新编译的Debian系统(Ubuntu也派生自Debian)。root密码是1234。它支持的芯片主要有全志A10,A20,A31,H2+,H3,H5,A64,AmlogicS805,AmlogicS905,ActionsemiS500,飞思卡尔/NXPiMx6,MarvellArmadaA380,三星Exynos5422,RK3288等。如今大部分网络机顶盒及所谓的那些挖矿设备大都是基于上述这些cpu设计的板子,所以自己可以将这些设备刷机为armbian系统,就成了一个很小型的Linux主机,不但可玩性提高,而且和可实现的功能就更高了。不过配置有高有低。刷机过程请自行去论坛等地方搜索,这里不做介绍。armbian也分为带桌面版本和不带桌面版本,根据自己的需要和机器的配置进行选择。 armbian国内源替换 执照如下步骤先将国外源改为国内源后,以后安装和更新软件时下载速度就会快一些,这里
看了好多博客,最终还是觉得认真跟随flask的官方教程思路比较好。 首先要创建一个appfactory,大概意思是这个应用中运行的逻辑都放在一个函数里 这个函数中,首先要创建一个Flask的实例,其后要有一系列的配置文件,目前这些 配置都hardcode在函数里了。 写好这个文件后就可以创建一个数据库来保存运行时的数据 教程中使用的是sqlite3,建表的逻辑都单独写在了一个sql文件中 运行数据库的Python文件中,主要有3个函数 1.获得数据库的函数 向app的对话询问是否链接了数据库,如果是,则返回这个数据库 否则的话,主动根据配置中数据库的位置连接数据库。 2.关闭数据库的函数 3.初始化数据库 首先主动找到数据库(使用第一步的获得数据的函数),运行建表逻辑。 除了这三个函数之外,为了方便调试,还可以使用flask命令行命令调用上述的三个函数 但是需要click装饰器。 写好db文件以后,要把这些逻辑放到appfactory里 为了方便调用,把上述的函数封装在了init_app这个函数里 在app工厂中调用这个函数就可以了。