专利名称::产生未知字母之字模的方法与系统的制作方法随着计算机在世界各地使用的激增,绝大多数语言民族的人们目前经常性地使用计算机和工作站产生文件和进行国际间交流,这就使得使用不同语言的人们之间传递的信息能在再现这些语言的打印和显示系统内相互兼容变得日益重要,现在有一种国际标准,尽管还不是非常广泛,但已覆盖了世界上大多数书写字母表;这一标准就是统一码标准/国际字符编码(Addison—Wesley,ISBN0—201—56788—1),(此申请中所讨论的每一出版物在此均附作参考)统一码对其所覆盖语言的每一字母、发音符号、语调记号或其它特殊字符均赋与一个编码。欲获得有关统一码的更多信息,可参见G.Adams著《统一码介绍》(IntroductiontoUnicode),见由高等专业研究学院,剑桥,马萨诸塞(InstituteforAdvancedProfessionalStudies,Cambridge,Massachusetts)创立的“统一码实施者研讨会”(UnicodeImplementersWorkshop)(8月6日,1992年)及“统一码联盟”,(UnicodeConsortium)/统一码实施者研讨会(Unicode,Inc.和Taligent)的会议录,尤其是下列研究室的会议录《无间隔记号》,2号统一码实施者研讨会(Merrimack,新罕布什尔州,3月12—13日,1993年);M.Davis的《处理无间隔记号的策略》(StrategiesforHandlingNon—spacingMarks)以及T.Yamasaki著的《打印服务器的统一码》(UnicodeonPrintServers),此二文均出自3号统一码实施者研讨会(圣何塞,加利福尼亚州,8月6—7日,1992年)。另一可获得的编码系统为通用串(UniversalString)或10646串(10646String),它包括通用字符集编码ISO/IEC10646(UniversalCharacterSetCodeISO/IEC10646),就如ISO和IEC联合技术委员会ISO/IECJTCI(ISOandIECJointTechnicalCommittee)以通用标题“信息技术—通用八重编码字符集”(UCS)(1993)(Informationtechnology—UniversalMultiple—OctetCodedCharacterSet)制备的“ISO/IEC国际标准(10646—1”1993)(ISO/IECInternationalStandard)中所描述的那样,10646码集的大部分与统一码的相似,其缺点也和统一码的缺点相似,本申请中的讨论与这两种及其它编码系统相关。当一计算机系统翻译一由统一码、10646码或其它方法编码的字符串时,它执行一再现过程以显示或打印那些字符。三种传统再现过程单独或以某种联合使用一核心表,一查找表和一连字表,再现系统的输入是一长串编码点(即字符的二进制码表示),输出是每一输入字符编码的字模编码,一个字模是一个字符在单独显示或一打印单元里的表现形式,有可能是几个可能的独立字符的组合;例如,下面是七种不同的字模a′àà¨_其中最后的一个是由三个码点即“a”的码点,变音符号的码点和下加横线的码点来表示。在目前系统中,这三个码点被结合并显示成一个单一字模。当一个查找表被使用,再现系统将编码点与表中的那些相比较;如果某一特定码点组合被找到,那么输出仅仅是在查找表入口所找到的字模。系统可能会附加查找连字表以对字母的一些特定组合形成连字,许多语言(如阿拉伯语)有相当多的连字;英语只有几个连字,如以“fi”代替“fi”,“ffi”代替“ffi”及“fl”代替“fl”。这些连字在英语中是可选件,而在其它语言字母表中,连字是书写语言必需的一个特性,一个关于计算机对再现阿拉伯连字及类似问题处理的分析可见J.Becker所著《“多连字文字处理”(MultilingualWordProcessing)《科学美国人》(ScientificAmerican)1984年7月号和J.Becker著的“阿拉伯文字处理”《Communicationsoftheacm》1987年7月号(第30卷,第七号)。再现系统还可查对核心表,在此决定对某些特定字模组合的分离,即对显示出或打印出的字符之间的分隔。上述三种系统可被结合使用以适应多种语言。拉丁语系的字母表处理起来非常简单。然而,许多语言关于字母、语调记号和其它字符的组合相互间有很复杂的规则,不能很好适应上述这些方法。核心表和连字表在大多数系统中是很小的,不能容纳哪怕是一门简单语言的表达所必需的上千种可能的字符组合;例如,泰语有2700种可能的字符组合,已足以使查找表、连字表和核心表大到无法接受,而且将使每一组合的查对占据过长的处理器时间。类似地,阿拉伯文字可以有至少三种不同的组合方式,具有初期、中期和最后形式,且其它的还会有除此之外的第四种(独立)形式,这些字母在书面语言中形成复杂的连字,且每种语言形式通常有一种不同的形状。如果建立一个连字表来容纳所有这些,此表将十分庞大,还需要成千上万的入口以存入28个字母的字母表中可能的组合。其它语言,如朝鲜语和越南语,具有类似数量众多且复杂的字母组合。而为一种将出现此问题的语言建立其专门的表将防碍这些表的标准化和规模缩小化,占用过多内存,且需要大量处理时间对其检索,这样,在一个必需处理不只一种书面字母表或字符集的系统中,也就是说,实质上用于国际目的的系统中,使用包含阿拉伯语、朝鲜语、泰国语、越南语、英语等语言中所有可能字母组合的核心表和连字表是不切实际的。一种可工作的国际再现系统应当能够在所有这些系统内显示字符时处理各种变化,而不需要对每一字母的组合有一个表的入口。当用户输入一不能在表中特定查找到的字符时,另一个问题产生了。例如,为某种原因,一个用户可能想输入一个y(也就是,一个“y”和一变音符号或分音符)而其可能未被给定系统定义,或者想创造某些其它字符,如用一个拉丁式发音创造一个非拉丁字母表字符。后者的一个实例是(泰语字符“kokai”和其上的一个音调符号),这是一个不存在于任一预先规定的字母表中的组合。这些特别的字符不能被传统的系统所处理,这些传统系统遇到未预设定的字符时,典型做法是仅以一个空格或一个缺省记号替代不知的码点。现需要一种能通过分析码点和再现尽可能相似的字模来提供用户创造的未预先设置于系统的表中的字模的系统,这些要在无需建立庞大的特殊字符表的基础上完成。更确切地说,需要这样一种系统,它能够容纳在泰语、阿拉伯语、朝语等语言中找到的如此大量的字符组合,同时要使如连字表和核心表等字符表的规模最小化。图1显示了一个用于改进传统方法以再现字符的系统的一部分,再现系统10是位于中央处理单元的存贮器内的一个常驻应用程序,且存取一个包括核心表50、字模查找表60和连字表70的字体资源40。这些表也贮存在存贮器中,被编码为码点20的字符被输入再现系统10,而再现系统10输出字模30,字模30取决于码点如何映射到表50、60和70中的一个或几个。作为字符的2进制缩码表示的码点20被一个用户输入或从一文件或其它文本资源中获得,对统一码来说,每一码点代表一个16位(2字节)的词。下面的例子将采用统一码,然而本发明可适用于任一字符编码方案。对某些语言来说,用于处理输入字符中的三个公共程序(相应于表50—70)中的每一个均有特定作用。再现系统把输入的码点与表的入口进行匹配。例如,单词“finds”可能被输入,并将被统一码以如下码点表示fJindsU+0066U+200DU+0069U+006EU+0064U+0073;“f”的码点是“U+0066”,“U+”表示这是一个统一码的码点,“0066”是字母的十六进制表示。下一个是“J”,并被第二个字母“i”跟随。“J”在此代表一个特殊的统一码表示的字符,意思是“join”,指示两个字母应合并成一个连字如fi(非连字)变成fi(连字),可选择的连接字符“J”可以由应用程序自动产生,在此文本元素“finds”是原先产生的,或者可由用户特意输入。“J”后面是单词剩余部分的码点。再现系统10可被具体配置以使用表50,60和/或70中任何部分来处理这个单词。例如,它可先查对连字表70,然后是查找表60,最后是核心表50。一个连字,如“fi”,可能仅被存于连字表中,但在其它字母表中,字母组合有可能被存在连字表、查找表和核心表中的任意一个。例如,泰语就是如此,其中字母组合为数极多,包括元音和单调符号。连字表70表示了一个可能的码点集(CP6,CP9,…,CPx,CPy,Cpz),它们被选择是因其显示了所讨论的特定字母表的连字例。例如,CP6可能代表一“f”,CP9可能代表一“i”,从而CP6—CP6—CP9就是代表“ffi”的码点。再现系统将此顺序置于表70,从而代替一个替换字模“ffi”而不是将字序“ffi”输出。其它的特别例子也存贮在连字表中。上述例子中,“finds”可能通过先查找查找表并定位字母“f”而被分析。此后,系统查询连字表70以看是否有以“f”起始的连字,并找出入口“CP6—CP9”(相应于序列0066—0069(代表“fi”。连接字符“J”指示需要连字,因而字模“fi”被输出。下一代表串“nds”的码点位于查找表60中。查找表60对每一码点均包含一字模形状和字模宽度。最终,输入码点20全部以字模30被输出。另外码点也可在被设计用于在预设定字符序列中处理间隔的核心表50中被找到。例如,“f”和“i”之间的间隔可通过在核心表中找出序列“CP6—CP9”而确定(忽略连接符号)。这些表可以组合使用,且查找表恢复字模形状和字模宽度,而核心表恢复字符间间隔。从上例将看出,再现系统可恢复的字模受限于表的容量。此外,对那些通过组合连接二个或两个以上字符而形成的字模,宽度/间隔法不能使字模形状最优化;例如大写(U和变音符号)可能仅被表示为一个大写U和一个重叠的变音符号尽管连字表可提供字型优化处理,但如前所述,没有一个表能容纳现存的成千上万可能的字母组合,更不要说那些非正规使用的大量可能组合了,而一位用户却可能为某特别目的而想打印(如前面提到的组合)。需要一种处理这些特殊情况又不过度增加表的规模的系统。本发明包括用于根据一系列输入码点重现字模的设备和方法,而输入码点可从输入设备、存贮的文件或类似手段获得。码点被划分为一或几种预先规定的类,而码点系列的子集被组合、为采取预定规则表达方式的文本元素。分类和组合均由Lex,YACC或其它类似的结构分析器完成,并经过改进以接受统一码或其它国际兼容字符码。许多这样的文本元素被从码点集中被建立,每一个通常包括一间隔(基)字符和一个或多个将与此基字符共享一显示或打印单元的组合字符、如音调符号、重音或其它发音符号。也许还有附加或代替之的一个或多个连接字符与此基字符形成连字或间隔。图1是显示传统再现字模系统的框图。图2是用于显示和打印字模的设备的框图。图3是依据本发明的再现字模系统的框图。图4是显示本发明系统形成规则表示的状态图。图5是表示此发明涉及方法的流程图。图6是描述本发明中撤退再现过程的流程图。图7是图6改进形式的流程图。图8是本发明中撤退处理程序的一个实施例的框图。本发明系统可用具有图2所示的模块的软件来实施,并应用于图3所示的设备。图3中的再现系统应用程序120以码点190作为输入,并产生字模200作为输出,然后此输出被再现模块260再现而显示出来。图2显示了一个具有显示和打印能力的计算机系统80,包括拥有传统处理器100和存贮器110的计算机90。存贮器存贮再现系统120,字符表130,一个用于控制监视器150的显示驱动140和控制打印机170的打印机驱动160,字符以码串的形式从可以是键盘、具文本文件的磁盘存贮器、调制解调器或其它任何编码文本源之类的输入设备180输入,代表输入字符的字模被再现显示于监视器150或打印于打印机170上,也可输出到某些其它设备。图3是构成再现系统的120的软件模块的详图。图5是本发明方法的总体流程图,图6是本发明中撤退处理程序的流程图,图4是表示本发明生成规则表达的状态图。下面是对本发明的一般讨论,然后是对图2—6系统的详细描述,之后是在字模不能在字体资源中找到时,在撤退处理程序里用于处理字模的一种本发明的较概略的处理方法。本发明中的系统与图1所示的传统系统是兼容的,但其可以使表的规模大大缩小,尤其是连字表和核心表,如下面所要看到的,本发明方法的一般描述。在码点被再现之前,它们必须被分类,且分类结果被用于规定系统的规则表达,如下面将要详细讨论的,这些分类和规则表达被用作如Lex或YACC的改进形式的编译器的输入,从而产生一个图3所示的分析器220。参见StephenJohnson(史蒂芬·约翰逊)所著“YACC还有另一编译器的编译器(YetAnotherCompilerCompiler),Bell实验室(MurrayHill,新泽西州)(YACC在大多数UNIX文件中也有讨论)。Lex在位于新泽西州MurrayHill的Bell实验室的M.E.Lesk和E.Schmidt所著的“Lex一种语法分析程序产生器”(LexALexicalAnalyzerGenerator)中有所讨论。另可参见SantaCruzOperation,Inc.(Sco.PH014—036—900)出版的“SCOUNIXR系统V/386开发系统程序员指南”(SCOUNIXRSystemV/386DevelopmentSystemProgrammer’sGuide)(尤其是第二章Lex编程综述)。无论是Lex还是YACC被使用,它被用于传统方法以产生一具有对确定输入码点分类的测试能力的分析器,并被改进以读统一码字符和类,对Lex做这种改进是很容易的(主要涉及增加可能被读入的码点的长度);否则Lex就被象在传统方法中那样被使用。从输入设备180(见图2)接收到的码点190(见图3)被在图5所示的步骤330中输入给分析器220。最初的码点被读入(步骤340),并被命令码滤波器210(看图3)滤波(步骤350),命令码滤波器抽出代表系统或应用命令的码点,因为它们与将被显示的字模无关,命令码滤波器可按传统设计。如果码点是一个将要被显示或打印的,那么方法继续进行至步骤360,此步确定一个完整的文本元素,如前面产生的规则表达所定义的,是否已被接收到,这一判断由分析器220结合分类规则和表230完成。如果答案是否定的,方法返回步骤340,另一码点被读入并在步骤350被滤波,从而再回到步骤360。规则和表230被分析器220使用以确定对输入码最的分类,每一码点1均有一分类,即使某一给定系统不具备所需的字体资源(包括查找表)来再现一特定字母表,书写系统等,它也应存有标准化码点的全部分类规则。这样,当遇到一个不认识的字符时,即便系统不能再现该字符,它也可依据其分类,如其属于一连接字符还是组合字符,来对字符进行不同处理,下面讨论中的例子将说明这种处理方式。一旦一个完整的文本元素(如一个单字母,或由连结起来的字符组成的字母,如U)被建立,查找处理程序240就在步骤370里从字体资源中查找文本元素(也就是表集130),如果找到了相应的字模(步骤380),该字模被在步骤410中显示或打印,否则,一个撤退过程将通过撤退处理程序250被引用而找到一个可再现的合适字模相应于输入的文本元素,如步骤390中那样。字符或查找表130被用于传统方式的在一特定字体中对给定码进行寻找字模之中。根据用户指定何种字型,一特定码可能导致找到不同的字模,字体资源130的n个查找表代表n种字型。如果在步骤400中撤退过程开始未获成功,方法将返回步骤390以试另一种策略,这相当于对一给定撤退处理程序模块的重新重复,如图6中步骤670—710所示的循环的重复(下面将讨论);或者相当于试图为输入文本元素产生字模的另一种方法的尝试,例如从下面的撤退处理程序软件模块实施程序4转换到实施程序5,不同的策略将在下面详细讨论。一旦撤退程序成功或耗尽,被选择的字模即在步骤410中被输出以再现和显示,再现由图3所示的再现模块260执行,再现和显示均由传统程序实施,其细节取决于所使用的特定硬件(处理器、总线、监视器、打印机等)。;如果输入中含更多的码点(步骤420),方法返回步骤340以处理剩余字模。否则,方法结束并在步骤430退出。上述步骤的顺序也可以改动,例如,码点可以同时被输入、读入和滤波,然后被送给查找处理程序,或者它们可在被接收到的同时被读入并输入查找处理程序以加快处理速度。在输出一侧,字模可如图5所示的方法那样在产生的同时被显示,或者字模(例如位图或Postscript输出)可被确认,字模或是它们的确认码可被适情地存贮于RAM、VRAM或其它易失性或非易失性存贮器中。图3对查找处理程序和撤退处理程序作为单独软件模块加以显示,以表明传统查找处理程序与新的撤退处理程序之间的显著差别,查找处理程序240大部分是传统的,条件是未成功的字模寻找应转向撤退处理程序250以求进一步处理。在实际中,查找处理程序240和撤退处理程序250可以构成独立的字模恢复模块或被作为单一字模恢复模块来实施;只要具有下面所述功能,它们之间的区别是无关紧要的。步骤300码点的一般分类。被输入本发明系统的码点最好能被标准化以符合某种国际化村准,在本实施例中是统一码标准,本实施例中码点的分类因此与统一码标准中的那些相同,对于下面讨论的例子,这些分类是表1码点的分类1.间隔这是最典型的分类,表明一个字模所代表的一个字母或其它字符占取一个单一显示或打印单元,一个间隔字符包括字模形状和一个指示被再现者应与下一单元留有间隔的指示,大多数拉丁或以汉语为基础的(如中文和日文)字符是有间隔的字符。2.组合此码点有一与之相联系的字模,但它通常不在显示文本元素中单独出现;它指示一个通常与一个“间隔”字模组合的字模,组合字符是第二种最普通的,且通常是前面间隔字符的修饰语。在拉丁语系的书写系统中,组合字符包括发音符号(重音,颚化符号,元音变音符号/分音符号,变音符等),它们在其它书写系统,如泰语中更为普遍,在那里它们代表元音和语调记号。3.控制控制码点用于应用程序或操作系统的命令,通常不被再现显示,没有与之相对应的字模,码点也不会影响邻近码点的字模映射,控制字符被滤波掉并被一个前端模块解译。4.连结这是一种特殊字符类,它使两个相邻的文本元素被作为一个文本元素对待。连结字符较其它类少见,尤其是在拉丁字母表中,但是很重要,在拉丁语系的书写系统中,连结字符迫使两个字符间形成连字(如f和i)或者使“3/4”被以分数形式显示而不是日期形式(3/4)。5.非连结这是一个特殊的字符类,它使两个相邻字符被作为分离的文本元素对待,而它们通常被作为组合或连结的文本元素处理,非连结字符是最少见的,但在一些书写系统中很重要。例如,在阿拉伯语中字母“lam”和“alif”在相邻时通常被定作一个字模,且连结通常由再现系统自动完成。如果意欲分离它们,例如在打印阿拉伯字母表时,那么其间的一个非连结字符会迫使形成单独(非组合的)字模。一个字符可以属于不只一种类别,每一字符的分类可表示为一个四标志的位字段,如下<prelisting-type="program-listing"><![CDATA[typedefstruct{Booleancontrolflag1Booleanspacing/combiningflag1;Booleanjoiningflag1;Booleannonjoiningflag1;}CharClasses;]]></pre>这些标志的每一个均有一个值,1代表真,0代表假,结合和间隔性质是相互排斥的,故可以用一个“间隔”标志代表此两个性质(1=间隔,0=结合)。这样,具有分类0100(假—真—假—假)的一个字符即为一个正常的间隔字符。连接和非连接性质是相互排斥的,必须由分别的标志代表。例如,阿拉伯字母“alif”本身既非连接地非非连接。它将与字母“lam”连接,但不能与其它字符连接,如数字9。由于它不促成任一总行为,不把它归为连接或不连结中的任一种(因此,“alif”joining=假,nonjoining=假)。给定CharClasses码点分类后,每一码点的类别就可通过在一个CharClass排列内设置适当的标志来确定,如下所示(“∥”表示注解)<prelisting-type="program-listing"><![CDATA[staticCharClassesUnicodeClasses[]={{TRUE,FALSE,FALSE,FALSE},//U+0000NUL{TRUE,FALSE,FALSE,FALSE},//U+0001SOH···{TRUE,FALSE,FALSE,FALSE},//U+0020US{FALSE,TRUE,FALSE,FALSE},//U+0021SPACE{FALSE,TRUE,FALSE,FALSE},//U+0222!{FALSE,TRUE,FALSE,FALSE},//U+0023"{FALSE,TRUE,FALSE,FALSE},//U+OOFF<paragraphid="d65"></paragraph>···{FALSE,TRUE,FALSE,FALSE},//U+OEOlThaiconsonant"kokai"<paragraphid="d66"></paragraph>{FALSE,TRUE,FALSE,FALSE},//U+OE02Thaiconsonant"khOkhai"<paragraphid="d67"></paragraph>···{FALSE,TRUE,FALSE,FALSE},//U+0E30Thaispacingvowel"saraa"<paragraphid="d68"></paragraph>{FALSE,FALSE,FALSE,FALSE},//U+OE31Thainon-spacingvowel"maihan-akat"<paragraphid="d69"></paragraph>···{FALSE,FALSE,FALSE,TRUE},//U+200CPunctuationzero-widthnon-joiner{FALSE,FALSE,TRUE,FALSE},//U+200DPunctuationzero-widthjoiner·· ·{FALSE,TRUE,FALSE,FALSE},//U+FFE5Han-basedcharacter(inthiscase,Japanese),afull-width"yen"¥{FALSE,TRUE,FALSE,FALSE},//U+FFE6Hancharacter,afull-width"won"<paragraphid="d70"></paragraph>};···]]></pre>上面的码显示了统一码分类的整个表的结构。“…”(“豆点”)表示在此省略了成块的码;整个码序列有上万行的长度,对大多数已知的书写系统进行了分类,其中大部分分类用于数量极大的汉语语系字符,如中文和日文。前面的标志集被用作CharClasses位字段的屏蔽。因此可以看出泰语中辅音字母“kokai”(n)被归类为一个间隔字符(因为只有第二个标志取真值),而泰语中的非间隔元音“maihan—akat”(—)是一个结合字符(因为所有的标志均为假,尤其是“间隔”标志)。为扩展上面的分类表到其它语言,附加类别被定义。例如,朝鲜语书写系统中包括叫做“jamos”的字符集,它们被结合于代表音节的单元内。对这些字符进行结合的规则取决于jamo是起始、继续还是终止音节。三个这样的附加类别(起始、中间和末尾)对朝语来说就是需要的,且一个合法规则表达(见步骤310的讨论)可能被表示成,举例说,IM*F,在此不对朝鲜语和其它书写体系详细探讨,因为原理与本实施中那些例子的原理是相同的。一个相对较小的类别集可以处理世界上大多数书写体系。步骤310产生规则表达本发明使用了基于上述分类的语法,其中“规则表达”被定义为特指文本元素。在这种类似Lex的语法中,有如下的原子类型C匹配于任何控制为真值的码点。S匹配于任何间隔取真值的码点。c匹配于任何间隔取假值的码点。J匹配于任何连接取真值的码点。N匹配于任何非连接取真值的码点。可以使用规则表达操作程序,包括+一个或多个*零或更多|或者来将这些原子类别结合成规则表达记号{控制}C+{单元}Sc*|C+N*{元素}{单元}(J{单元})*这样,一个控制字符被用“C+”表示,它指示这是一个控制字符且一个或多个控制字符可在这个串内合法出现。“单元”是一个事例“Sc*”或一个或多个事例“C+N*”的出现。“Sc*”表示一个单一间隔字符,其后是零或多个结合字符;因此“Sccc”表示由一个间隔字符和其后的三个结合字符组成的一个串,且是形式“Sc*”的一种规则表达。串“cc”和“cN”都是“c+N*”形式的规则表达,“c+N*总是有一个或多个“c”字符,其后是零个或多个“N”(非连结)字符。阵列“元素”指一个完整的文本元素,且被定义为一个包括一单元和其后一连结字符的一个或多个事例加上另一单元的一个系列。因此,不计其数的单元可以通过使用连接字符连接入一个文本元素。本发明涉及的系统用这些规则表达来指示分析器在其识别出一合法记号时执行的动作程序。在本优选实施例中,一个类似Lex的语法被使用。步骤320分析器的生成类别、规则表达和动作程序被用作分析器生成器的输入,该生成器可以与Lex实质上相同,但被改进过以读入统一码字符,如前面所讨论的。改进Lex使其完成能读入统一码字符是一件很容易的事;不然它将被象在传统方式中那样被使用。经改进的Lex即可用于产生分析器。分析器实质上是一优化的状态机,它可读输入的字符串,将它们与规则表达相比较并输出完整的文本元素。图4中显示了一个前面定义的规则表达的状态图,这些规则表达可被认与规则表达定义的文本形式完全相同的方式被读入。图4是一张传统状态图状态由长方形框表示(并以整数参考号500,510等标引),而转移被表示为状态之间的箭头,并以小数形式参考号标引,小数点前面反映起始状态,小数点后表终结状态。例如,转移500.10是从起始态500到“局部单元1”状态510。每一转移都标有一个字母来指示若经历这些转移所要加的字符。例如,转移500.10代表给一个单元增加一间隔字符(如“S”表示的),而转移510.10表示增加了一个结合字符(“c”)。其它转移被标以“J”表示连接或“N”表示非连结,和那些“S”和“c”的事例一样。转移510.20和540.20不增加字符,而只是终止一个给定的文本元素。这样,从一个起始态500开始且沿着转移500.10—510.10—510.10(再次)—510.30—530.10—5l0.20进行将建立一个单元“SccJS”,如前面定义的,这是一个合法的文本元素。一个包含“ccNJS”的文本元素也是合法的,并由途径转移500.40—540.40—540.50—550.30—530.10—510.20而被表示。通过考察可以看出图4的状态图与前面定义的规则表达表是等效的。退出转移510.20和540.20并不直接进入一字符串,但一旦分析器在一个串内遇到的下一个元素不是一个合法的跟随字符,例如一个“S”字符被另一个“S”字符紧跟其后(这是英语是最常出现的),此两转移就被执行;在这种情况下,分析器自动在两字符之间插入一个结束码。步骤330—360输入、读入和过滤码点;产生文本元素。图2和图3所示的再现系统120读入一系列所要再现的码点。输入的码点首先被读入和滤波(如图5中步骤340和350所示)以除去控制字符。然后进行图5中步骤340—420的循环,在此每一文本元素被检查以看它是否存在于字体资源中(步骤380)。如果是,该文本元素被显示或打印(步骤410),且下一文本元素,如果存在的话,被检查(步骤420和340—370)。如果文本元素未在字体资源中找到,撤退过程(步骤390—400)被执行。步骤340—420的循环反复进行,直到所有输入的码点均被再现或被以其它方法处理,然后方法在步骤430退出。码点在步骤340—350被读入和滤波,直到一个完整的文本元素在步骤360被确认,也就是如前面定义和图5所示的一个合法规则表达。步骤340—360被分析器220参照分类规则和表230执行。这样,分析器就可以在结果被送到查找处理程序240之前对整个文本元素的文件进行预处理。下面的动作过程是滤波过程的核心,指明当分析器遇到一个控制字符序列{控制};//忽略控制字符时不应执行任何操作(由不带其它指令的分号指示)。这可以被读作“如果找到一个控制字符,不要采取(再现)行动”。通常,在这类陈述中,分析器将在行的右边执行伪码表达,如果它在左边的大括号内找到并识别出规则表达。步骤340—360一起组成了过程440(见图5),分析器通过它建立文本元素,前面讨论的规则表达使文本元素的形成得以实现。是这些完整的文本元素而不是单个码点,被送到查找处理程序240和撤退处理程序250,对输入码点的分析是在一个不同于以往的再现系统的水平上进行的。步骤370等分析器的核心是一动作程序,它一旦识别出一个完整的文本元素就获得且显示一个或多个字模。这可由下面的伪码表示程序1找到和显示文本元素(步骤370—410)<prelisting-type="program-listing"><![CDATA[{element}{UniCharelement[8];//DeclareelementbufferGlyphIDglyphs[8];//Declareglyphidbufferfind_glyph(element,glyphs);//Routine2,below.display(glyphs);//Displaylocatedordefaultglyph(s)};]]></pre>软件执行程序1是图2和图3显示的再现系统的应用程序的一部分,并作为图3所示的应用模块210—260的控制码运行。根据程序1,一旦遇到文本元素,两个被缓冲的阵列“element”和“glyph”被宣布,且程序“find—glyph”(见下)和“display”被执行。“display”程序可以是任一传统程序,用于在屏幕上再现和显示文本或其它字符等字模,或是打印或将它们以其它方式输出以观察。步骤370—380查找文本元素一旦一个合法文本元素被找到,它就被传送到查找处理程序240(见图3),查找处理程序再在图5所示的步骤370中执行查找过程,在字体资源中寻找元素其本身是一传统的数据库查找。查找的寻找关键字是输入的文本元素,由被分析器识别为记号的一个或多个被编码字符组成。如果文本元素存在于数据库中,那么查找功能返回到字模识别程序。如果不是,那么查找功能启动撤退处理程序,如下面所讨论的。适于实施字模查找的伪码是这样的程序2寻找字模(步骤370—400)<prelisting-type="program-listing"><![CDATA[voidfind_glyph(constUniChar*element,//Text(display)elementGlyphID*glyphs);//Resultingglyphid(s){//Iftheelementisfoundinthedatabase,thenuseit.Otherwise,invokethefallbackhandlerif(search(element,glyphs)==NULL)//(Routine3)find_fallback(element,glyphs);//(Routine4or5)}]]></pre>软件在图3所示的查找处理程序240里实施这一伪码。以一显示元素(也就是如程序1所定义的“element”)作为输入时,程序2宣布“find—glyph”。这被定义为一个“UniChar”类型的常数(因为程序不改变它),这种“UniChar”类型是为指明一统一码字符矩阵而对统一码的类型定义。其名字“*element”指示有一指向“UniChar”矩阵的第一个元素的指针,而此“UniChar”矩阵通常被存贮在分析器的缓冲存贮器中。缓冲存贮器的一个八统一码字符(16字节)的块被陈述“UniCharelement〔8〕”作为文本元素矩阵而存贮在程序1中。程序2的结果是,对于每个初次尝试时在查找表中找到的文本元素再现和显示一单一字模。如果调用了find—fallback程序,可以输出几个字模。输出是存贮于矩阵“GlyphID”和缓冲存贮器里的一个字模识别码;为这一矩阵的缓冲存贮器块被陈述“GlyphIDglyphs〔8〕”保留于程序1中,并且在大小上也是八个统一码字符(16字节)。指针“*glyphs”指向矩阵“GlyphID”的另一个地址。“search”过程是一传统的寻找功能,用于在字体资源130中找到被输入的文本元素,如程序3寻找文本元素(步骤370)<prelisting-type="program-listing"><![CDATA[voidsearch(element,glyphs);{ifelementislocatedinresource,returnglyphs;elsereturnNULL;}]]></pre>它确定文本元素是否存在于字体资源中,如果是,就相应于输入的文本元素将代表字模的码返回,并将其置于缓冲存贮器里在程序1中保留的字模位置上。被查找的特定查找表取决于用户为特定输入字符选定的字体。如果查找处理程序240在查找表130中找到了这一文本元素,它就将代表文本元素的字模的码做为输入传递给再现模块260;以便象在图5的步骤410那样再现和显示或打印。然后,系统在步骤420判断是否还有更多码点;如果有,(比如由缺乏一个文件结束指示而指出),那么方法返回步骤340以寻找下一文本元素。如果文本元素未被找到,那么程序3返回—NULL,它将导致调用撤退程序,“find一fallback”。步骤390—400撤退程序撤退处理程序250接收一个完整的文本元素做为输入,且能以许多不同方式处理它。通常,策略的选择依赖于应用;下面将描述几种策略。一个商业应用典型地将这些策略的一些子集包括于一个单一撤退处理程序中,以对于此应用获得最佳取代字模。对所有撤退程序都相同的是,它们从由分析器在步骤340—360产生的一完整文本元素开始,并且试图在分析子元素,也就是文本元素的子集时尽可能保持文本元素的完整,以判断任一子元素是否可被系统显示。一般性撤退方法如图6所示,并在后面加以讨论。一个简单的撤退程序可以以一个长方框口或其它缺省字符(或空格)替代任何数据库中未找到的显示元素。这种方法需要被用在在遇到未知文本元素时不具备情况处理结构的当前系统上。然而本发明使用一种根据文本元素的内容,即单个码点和它们的顺序,分析被输入的文本元素并产生输出的撤退处理程序。下面所要讨论的每一种撤退程序都有其一定的优点和在特定场合下的作用。下面各程序表示的撤退程序的重要公共特征被结合于流程图6所描述的普遍化撤退程序中,并将在对程序4和5的讨论之后加以讨论。程序4的撤退方法下面是程序4的伪码,用于实施本发明的撤退过程。程序4撤退过程(步骤390—400)<prelisting-type="program-listing"><![CDATA[voidfind_fallback(constUniChar*element//textelementGlyphID*glyphs);//resultingglyphid(s)Unicharsubelement[8]=element;{do{element[Length(element)-1]=0x0000;//Thisstripsthelastcharacterfromthetextelement.if(search(element,glyphs)!=NULL)return;//Iftheelementisinthelook-uptable,thefallbackprocedureiscompleteforthemoment.Otherwise,keepstrippinguntilasubsetof“element”islocatedasavalidglyph,oruntilnothingisleft.}while(Length(element)>1);//Iftheprocedurereachesthispoint,noteventhebasecharacterisrecognized.Adefaultcharacter(suchasabox□)mustbeused.glyphs=FALLBACK_GLYPHID;//Justmakeitaboxglyphs[1]=0x0000;//Terminatestring}]]></pre>表达式“Length(element)—1”表示构成文本元素的矩阵的最后一个位置。另一个位置被(以标准方式)认为是位置0,另二个为位置1,以此类推,所以“element”的长度减1是最后的位置。设定这一元素为“0x0000”使矩阵“element”在那一点上终止,从而自动减短了矩阵并去除了终止码点。象下面所描述的;当这一行又被碰到时,(已被缩短)矩阵末位的下一码点将被去除,以此类推。程序4的撤退程序去除结合记号,从而缩减了输入的文本元素,直到剩下的文本子元素是可在查找表中找到的一个文本元素。例如,字符应被表示为一个三字符文本元素由U,其后的变音符号(是一个结合字符)和再其后的下加横线(也是一个结合字符)组成,它在大多数字体中不是一个字模。此文本元素是“Scc”形式的规则表达,相应于三个字符“U¨__”。如果查找处理程序240不能在查找表130中找到该文本元素,它就将此文本元素送至撤退处理程序250,如步骤380和390所示。撤退程序从去除文本元素中最后的字符(码点)开始,在本例中就是下横线。这样只剩下了文本子元素“U¨”,它可由撤退处理程序250在表130中找到。然后,它被作为输出(框200)送至再现模块260,此模块将再现“”。当下横线字符被从文本元素“U¨__”中除去之后,如果文本子元素“U”在表中找不到,那么撤退处理程序删除变音符号。“U”即被找到。如果在查找表中不能把变音符号作为一个单独文本元素找到,就会用一已知字符产生一个子替换,如双引号”,它将与“U”结合形成字符“U”。这并不理想,但至少是对“U”一个合理的子替换。类似的子替换可被建立在撤退处理程序软件模块中,因而系统可以移作许多不同的应用,它不需要将任何关于“unknown”的字符,如变音符¨的信息存贮;取而代之的是,当一文本元素未被找到,一个替代字符已被指明,且替代字符存在于查找表中,那么撤退程序就会在需要时进行替换。替换字符可能是不只一个字符;例如,如果碰到日元符号(¥)而其不在查找表内,它可以由一个Y和两短横结合在一个单元内来形成,看起来象一个“¥”,这又不理想,但可以被认出是所欲表现的字符。另一类有用的替换是从非拉丁语字母表如中文、日文、西里尔字母等中音译过来的字符,这样用户至少可以得到一个实际字模不存贮于系统中的文本的语音表示。如果文本元素“U”的变音符号和下横线都已被去除而最后一个剩余码点(“U”)仍未找到,但不能获得任何替代字符,那么最后一次撤退仍是缺省字符,如□字模,即便如此,一个空格也可和变音符号和下横线结合,当然此时最好是结合字符,使读者至少可以获得一些包括在最初文本元素内的信息。同理,如果变音符号不被撤退处理程序认识,那么它可被忽略,但不管怎样“U”和下横线被显示出来。当撤退程序被执行一次之后,至少有一个码点被从尾部删去。这个被删去的部分最好作为将被显示的新元素被保存和处理。在“U”的例子中,仅管文本元素作为整体不能在查找表中找到,但独立的子元素通常是合法的。这样,最好将元素被删去的部分保存,并在程序4之后设置“element”与这个被删去的部分相等,且在程序1中再次调用“find—glyph”程序。相对于上面的程序4,在程序4A中,“U”和下横线字符均被存贮以再现;又由于后者被归类为一个结合字符(“c”类),它被与“U”结合在同一显示单元内,且输出“U”与完整的文本元素完全相同,就好象文本元素一开始就在查找表中被找到一样。为保存文本元素的剩余部分可以采用下面的方法最后一个字符被从文本元素中移去(如程序4中那样),且剩余部分的字模被找到。如果最后一个字符本身也对应一个字模,它将与其它被找到的字模连接在一起。程序4A<prelisting-type="program-listing"><![CDATA[voidfallback_handler(constUniChar*element,//TextelementGlyphID*glyphs)//Glyphid′s{//Declarationsintindex;//IndexoflastcharacterUniCharlast[2];//LastcharacterfromelementGlyphIDlastid[8];//Glyph(s)forlastcharacter//Removethelastcharacterandsaveit.index=Length(element)-1;last=element[index];last[l]=0x0000;element[index]=0x0000;//Gettheglyphid′sfortherestofthestring.//Notethismayrecurseiftheelementisnotinthetable.lookup_glyphs(element,glyphs);//Ifthelastcharacterisinthelookuptableif(search(last,lastid)!=NULL)//Concatenatetheglyphforthelastcharacter.concatenate(glyphs,lastid)]]></pre>如果,举例来说,原始的文本元素对应字模也就是U—变音符号加上一个重音符号,且当前字体的查找表中既无整个字模也没有无重音符号的,前面所述的伪码就要递归调用。此程序的最初调用移去重音符号,并试图寻找U。这一尝试失败,程序被再次调用。此程序的第二次调用移去变音符号,且寻找代表“U”本身的字模。然后一个代替变音符号的字模(也许是一个双引号,作为撤退)被结合给字模“U”。这两个字符的实际重叠打印是由硬件特别控制的;它有可能需要回格(在某打印机或终端上),或是特殊的换码程序等等。程序5的撤退方法一种可选择的撤退程序用独立的元素替代含连结字符的元素。这可以代替程序4或附加于程序4。例如,一个包含“3J/4J”的元素,它将对应于四分之三的分数形式如果它存在于可获得的字库中,如果不存在,它将被分解成“3/4”。程序5可供选择的另一种撤退程序<prelisting-type="program-listing"><![CDATA[voidfind_fallback(constUniChar*element,//DisplayelementGlyphID*glyphs)//Resultingglyph(s){//Declarationsinti://IndexintoelementUniCharsubelem[8];//Subelementintlen=0;//Lengthof“subelem”intglen=0;//Numberofglyphs{//Scantheelementforajoiningcharacter.for(i=0;i<Length(element);i++){//Ifitisajoiningcharacter,lookupthispartif(element[i]==JOINING){//Terminatethesubelement.subelem[len++]=0x0000;//Lookuptheglyph(s)forthesubelement.find_glyph(subelem,glyphs+glen);//Prepareforthenextsubelement.glen=glen+Length(glyphs);len=0;}//Otherwisejustaddthecharacter.else{subelem[len++]=element[i];}}//Lookupanyremainingsubelement.if(len>0){//Terminatethesubelement.subelem[ln++]=0x0000;//Lookuptheglyph(s)forthesubelement.find_glyph(subelem,glyphs+glen);//Prepareforthenextsubelement.glen=glen+Length(glyphs);len=0;}}]]></pre>程序5在“joining”字符处将文本元素分解成子元素;这样,“SccJS”将变成“Scc”和“S”,“J”被丢掉了。当一特定系统没有所需要的连字集但是有基本字符时,这种方法尤为有用。例如,如果一个用户的系统不包括阿拉伯语中可能存在的数千种连字但是包括基本阿拉伯字母,那么阿拉伯语文本仍可被再现和显示,只不过字母之间是彼此分离的。仅管这不是语言显示的常用形式,但是比另一种丢弃全部信息以选择要理想。此外,当用户想打印单个字母,例如在列字母表或在用阿拉伯(或其它语言)字母表达数学方程式时,这种方法确实很理想。程序5的过程有其优点,即它省却了在其它情况下需要存贮的上千个连字表和核心表的入口。尽管在某些书面体系,如阿拉伯语中,连字会显著改变字母的形状,在其它书面体系,如泰语和越南语中,通过在显示单元某些预先确定的地方为结合字符定位可以形成上千种可能的结合。这些体系中的元音记号、声调记号和其它结合字符就象英语中的发音符号(重音等),因其不会改变要被读的潜在字符的基本形状。一般化的撤回策略图6显示了用于处理程序4和5所涉及情况的程序的流程图,一般来说就是处理含有一个或多个未知码点(即未在字库中找到)的任何文本元素,尤其是含有J和c的文本元素。图6所示程序由查找处理程序240和退回处理程序250结合起来执行,并且说明实施图5所示步骤390—400的优先方法,并把重点放在由退回处理程序使用的方法。在步骤620—660中,除去不认识的连结(J)字符,而在其它情况下将被连接的字符加到一字模表中以便分别再现。在步骤670—730中,结合(c)字符被找到并除去,且剩余的字符象在文本单元中指定的那样加到字模表中。对整个文本单元有条理地寻找不认识字符,除掉不认识字符,而保持结合字符信息,并且把文本元素中认识的部分显示之。下面的例子将清楚地对其说明范例1S1JUJS2现考虑一个S1JUJS2形式的输入文本单元,其中S和J代表它们的正常含义(分别为一个间隔字符和一个连接字符),S1和S2代表认识的间隔字符,U代表不认识的间隔字符。J表示输出的字模应将所有三个字符S1和S2全部连接(如果它们都是认识的字符)。这种情况可以出现于最初产生文本的系统含有一个有三个连接起来的间隔字符的字模(以S1JSunkJS2)的形式),但中间的“S”(Sunk)对于现在试图再现文本元素的系统是未知的;也就是,“Sunk”不能进入查找表中,J指示输出字模将包含对所有3个字符S1,Sunk,S2的连接(如果它们都是已知字符)。被连结字符的例子在英语中较为少见,但在其它一些语言中常见。通过在两个f间和第二个f与i之间使用连接字符“J”有可能形成有效的“ffi”连字(但这不符合上面的SJUJS模式,因为如果其一个字符被认识,中间的字符也认识)。一个更为可能的情况是用连接字符表示通过三个阿拉伯字母alif—lam—sin形式的连字。Aif和lam被连接成一个连字,然后alif—lam连字被与Sin连接起来以形成一个三字母连字。如果所有三个字符均是认识的,文本元素将采取SJSJS的形式,而如果三字符字模和alif—lam字模均不在查找表中,那么本系统打印出三个分离的字符alif,lam和sin。在这种情况下,如果alif和sin是可获得的,中间字符“lam”也将被假设为是系统可获得的,但是有可能出现一个不被认识的新字符。本范例对相对稍复杂的后一种情况进行分析。本发明的方法使得系统可从文本元素“S1JUJS2”中抽出和显示认识的信息,而不是象现存系统所做的那样只把整个文本元素处理。因此,最理想的是显示“S1S2”(第一个和最后一个S),而把“JUJ”从中间删除。在步骤380(图5),文本元素“S1JUJS2”将找不到相应字模;所以方法继续进行到步骤390,也就是图6显示的步骤610。步骤610判断出文本元素不是空的。在步骤620,先根据(但不包括)J的第一次出现将一子元素设置为文本的一部分,且第一个J被去除。在本例中,这步剩下子元素S1。此外,此子元素被作为TEMP保存。子元素是非空的(步骤630),且已假设它包括在查找表中,所以在步骤660,S1被附加在字模表上(且是此字模表中唯一的成分)。在步骤740,子元素和任何紧跟在连接字符J后面的,如果有的话,被从原始的文本元素中移走。这相当于从A“S1JUJS2”中移走“S1J”,剩下“UJS2”为文本元素。返回步骤610,这是非空的,所以在步骤620产生一新的子元素,由“U”组成;剩余的J被在步骤610(1)(a)中去除。在步骤620(2)中,子元素作为TEMP保存。子元素是非空的(步骤630),且它不能在表中找到(步骤650)。它不包含一个c(步骤670),所以一个缺省字模(一个长方框,一空白等)被加于字模表中,使其现在具有“S1□”。在步骤730中,表示在堆栈中任何c的字模(到现在还没有)被加到字模表中,而在步骤740中,“U”码点(现已被保存为TEMP)被和紧随其后的“J”一起被除去。这样在原始文本元素中就只剩下“S2”。经变化的文本元素是非空的(步骤610)。在步骤620,文本中没有J,所以整个文本元素S2被认为为子元素(步骤620(1)(b))并被作为TEMP保存(步骤620(2))。子元素是非空的(步骤630),且可在表中找到(步骤650),所以其字模码被加到字模表中(步骤660),使其现在具有值“S1□S2”。在步骤740,TEMP的值(“S2”)被从原始文本元素中除去,而原始文本至此已被缩减得只剩“S2”,故文本元素只剩下空串。在步骤610,由于文本元素已空,字模表被返回(步骤750)。然后回到步骤410(图5),在此步骤字模表被正常显示。由前面可清楚看出,只有“S1□S2”被从原始文本元素“S1JUJS2”中保留在字模表中用于再现。这是合理的由于“U”是不认识的,它不能被显示,且由于同样原因,不能确定S1,U和S2是被如何连接的,所以连接信息被处理,且只有认识的字符S1和S2被显示,其间有一长方框(□)表示不认识的字符(“U”)。在上面的“alif—lam—sin”一例中,如果假设字符“lam”不被认出(也就是不在表130中),那么显示的字模表将为alif—□—sin,其中缺省符号代表“lam”。范例2S1c1uc2此例采取Sccc形式,其中第二个结合字符c(由U表示)是不认识的,但是其它字符可以在表中独立找到。Sccc形式的一个例子可以是也就是一个U一变音符号加一个重音符号和一下横线,其中码点按___的顺序出现(U,变音符号,重音符号,下横线)。这一不寻常的字符组合被用于说明本系统能够处理的情况类型。假设试图再现此文本元素的系统不认识重音记号即它不出现于查找表中。这可能发生在,例如,一个纯德文系统中,它包含变音符号和下横线,但是不合法语类型的重音记号。然后如图5中的步骤380,假设完整的文本元素S1c1uc2未被找到,所以方法转到图6中的步骤610。继续进行至步骤620时,子元素被设置为完整的文本元素,因为它不包含J。步骤630和650为假,而步骤670为真,所以在步骤690,子元素变成S1c1u,且c2入栈。此子元素仍不在表中(步骤710),返回步骤670确定该子元素仍包含至少一个C。在步骤690,子元素只有在不含最后一个C时被设置为当前的子元素,在此例中是一不认识的结合字符U。(如前面所讨论的,分析器220(图3)可以确定字符U的分类,即使查找表可能不包含关于U的适当字模的信息,因为所遇到的所有码点的类别都存在表230中)。现在子元素包括串S1C1,且在步骤700不认识的字符U入栈,使其现在具有形式字符栈UC2在步骤710中,假设剩余子元素S1C1在查找表130中找到,因而在步骤720中对应S1C1的结合字模作为第一个元素加到字模表中。对应剩余结合字符的字模也被加到字模表中(步骤730)。在此例中即为U和C2。U应当在保留其“结合”状态的同时被赋与一个空白空缺字符,从而使代表C2的已知字模和已知字模S1C1结合,形成代表S1C1C2的结合字模。这导致一个字符U被显示,而丢弃了代表重音符号的未知码点。如果未知字符(重音符号)的结合类别既不知道也未被保存,则得到的U的显示应为U—,即U与变音符号结合,后面是一个代替重音记号的非结合空白,下横线跟在U后面而不是与之结合(而是与前面的空白结合)。这样,本系统就可以尽可能多地保留包括信息的原始信息,仅丢掉无法再恢复的信息。这就形成了本系统的又一优势,即众多的字母和符号的不同结合形式不必存在查找表中。由于本系统能够在重现时结合字符,结合字符表的众多入口就能免除。这使得系统有高度适应性而无需花费任何力气或为产生和存贮表而扩展存贮器。它还可使新的字符和不存在某一标准码(如统一码)集的字母表中的字符能被使用。重排输入的文本序列当一个文本元素被系统读入时,它可能不是一种可被识别的字符顺序,因而在前面的例子中字模U可能在查找表中被存为U(U,变音符号,下横线),而不是以输入的码点序列U__¨(U,下横线,变音符号)出现。在这种情况下,前一种码点顺序可能被找到(在图5的步骤380中),而后者则不能。为防止这种现象的不必要发生,分析程序和撤回处理程序将输入码点重排成理想的顺序。在此情况下,系统可以保证一元音的变音符号紧跟元音,且/或所有下横线码点都在文本元素的最后。在本例中,此两规则的任一个都将把U__¨(U,下横线,变音符号)重排成U¨__(U,变音符号,下横线),从而防止返回处理程序执行步骤610到750的过程。图7显示了这一改进,其中步骤760检验给定文本元素中的码点是否为预先设定的顺序。如果不是,文本元素在被送到撤回程序的其它部分(步骤780)之前就被重新排列(步骤770)。许多不同的排序方案可被使用,且分析程序和撤回处理程序可用不同方案编程,这不影响码点或它们的类别,也不会影响实际表达式的定义。这对于处理从非用户的系统输入的非传统输入是一个有效的办法,同时也可适应在同一码标准单独出现的字母的新组合;人们只需简单的修改分析程序和撤回处理程序而无需重新生成查找表。范例3S1c1u1u2Juc2JS2现考虑一个如上形式的文本元素串,其中小写字母U代表未知结合字符,其它字符则按前面的例子定义,在本发明的一般类型记号中,这是一个ScccJScJs形的文本元素,即一个间隔字符,后面是三个结合字符,然后是一个连起来的间隔字符,然后是另一个结合字符,最后是又一个连接的间隔字符。尽管这个例子是一个不太可能的高度复杂的文本元素,它对于在此说明是有用的,通过观察,很清楚系统将返回S1c1u1u2Juc2JS2<S1c1><□c2><S2>,其中<Sic1>是一个结合字模(由于c),<□c2>是一个连接字模(由于c2的结合特性)。缺省框□作为U的替代被打印,而未知的结合字符U1和U2被丢弃。S2独立存在(其前面的J被丢弃)。参照图6所示方法,步骤620将子元素设置成S1c1u1u2,即查找到但不包括第一个J,并将其保存为TEMP。步骤630和650均为负,步骤670为正,故在步骤690子元素变成S1c1u1(当前子集查找但不包括最后一个c,即最后一个结合字符)。最后那个结合字符是u2,并被作为第一个元素入栈。步骤710取假值,步骤670仍为正,所以现在子元素变成S1C1(步骤690),且最后的结合字符U1入栈(步骤700),这个栈现在看起来象字符栈u1u2假设S1c1的字模对于选定字体(图3中表130中的一个)在字库中被找到,那个字模就被在步骤720中存于字模表中,且U1和U2从字符栈出栈并同样加到字模表中(步骤730)。现在字符栈是空的,而字模表是字模表S1c1u1u2在步骤740,TEMP串S1c1u1u2和紧跟其后的J被从原始文本元素S1c1u1u2Juc2JS2中除去,只剩下Uc2JS2作为新的“原始”文本元素。步骤610取假值,故步骤620设置子元素(和TEMP)为Uc2。步骤630和650均取假值,步骤670取真值,故步骤690设置子元素为U,而步骤700将c2入字符栈(目前空着)。步骤710和步骤670一样产生负值。在步骤680和730,缺省框和代表C2的字模码被加到字模表中,该表现在是字模表S1c1u1u2□c2在步骤740,TEMP(Uc2)的当前值和其后的J被从文本元素Uc2JS2中除去,剩下S2作为新的文本元素。处理步骤610时,文本元素仍不是空的,故在步骤620(1)(b)中子元素被设置为S2,在步骤620(2)中它被作为TEMP存贮。步骤630为负,步骤650为正,故步骤660把代表S2的字模加到字模表中,使其现在包括字模表S1c1u1u2□c2S2现在,在步骤740,TEMP(S2)的值被从本身已被设置为S2的原始文本元素中除去,从而剩下一个空串。步骤610现在为正。它将上述字模表返回到步骤410(见图5),在此步骤字模被再现和显示。S1c1将被一起显示,其后是与c2结合在一起的缺省字符(在此是长方框),然后是代表S2的字模。象前面一样,对未知的结合字符不显示任何字符,因为它们结合分类被保存它们可以用与前面字模结合的空白来表示。图3所示的退回处理程序250在图8的框图中有详尽说明,并且显示了一个实施上述在图6—7的流程图中所描述方法的软件的适当结构。通过J—子元素模块800对含J的子元素进行处理,而含C的子元素由模块830处理。参照图6,步骤620—650和步骤740可以用软件模块800实施,而步骤670,690—710和740可以用软件模块830实施。反过来,J—和C—模块控制字模表模块810来产生和保持字模表(步骤660,720和730)。模块800和830与一个查找模块820相互配合,模块820存贮查找表130(比较图3)以在表内寻找字模如果它们能被找到(见步骤650和710),恢复它们。任何缺省字模最好在有关的子元素模块800或830中由一个子模块产生;例如,J—模块800可以产生代表空字符的缺省字符来代替连接字符,C—模块830可以产生空白结合字符代替未知的结合字符,且两者均可为未知的间隔字符产生一长方框□。当然,这也可以在一个单独的缺省字符产生模块中被处理。一旦图6的过程被执行,结果步骤610为真值,撤回处理程序250就将字模表从字模表模块810输出到再现模块260(见图3)。范例4S1J1J2S2一种可能碰到的不常见情况是两个J连续出现,例如,一个在某种字母表中通常有一连接字符跟随其后的字母的后面可能有来自另一种字母表、通常在其前面有连接字符的一个字母。在步骤620,S1成为第一个子元素(和TEMP的值),且J1被删除(如前面例1中)。在步骤650,S1被找到;在步骤660,它的字模被加到字模表中;且在步骤740中,S1和J1被从串S1J1J2S2中去除,只剩下J2S2。继续返回步骤610(真),然后到步骤620(1),现在子元素被设定在一个空串(到“第一个J”)且J2被删除。因为子元素是空的,步骤630的结果为正,所以在步骤640子元素(和在它后面的J2)被从文本元素中除去,只剩下S2。字符S1和S2就这样被以常规形式再现。用图6的程序,当用户的系统不具有给定字符的字模的表信息和当一个少见或未知的字符组合或字符类型被作为文本元素输入时的许多情况就可被处理。所能解决的情况类型视预设定的常规表达而定,此常规表达被选择以解决上述问题和保持较大字库中的问题。其它撤退方案可能还考虑了对于某特定输出设备的显示特性。例如,如果输出设备定一个PostScript激光打印机,撤退处理程序可以使用PostScript操作程序对所需文本元素构成近似值。这种方法的细节过于复杂和具有机器特性,在此不做详细描述。然而作为一个范例,在将7J/J8形式的任何文本元素(数字,连接符,斜杠,连接符,数字)映射到分数形式时它是很有用的,无论这样的文本元素在何时出现。这可以使任何系统都能产生最优化的分数,而不是只限于数字编辑器。通过举例,下面是对于如7J/J8这样一个文本元素使用上述撤退方案的步骤概况,这一文本元素应对应于一个分数八分之七如果可获得这样的字模。①将字形大小缩减三分之二。②移到下一单元的上半部分。③显示第一个数字(7)的字模。④在第一个数字(7)的下面划一水平线。⑤移到单元的下半部⑥显示第二个数字(8)的字模。⑦恢复字形尺寸。尽管针对这一特定问题还可能有许多其它办法,关键是图5所示的撤退处理程序和方法允许这一变化。有了这种方法就不再需要一个包括了数千种可能有的分数的表;在需要的时候,任何分数都可被产生。用于不同情况的其它规则集也可被产生,且在需要某一种特定的输出中含不同独立成分输出形式(如一个分数)时尤为有用。权利要求1.一种从包含许多码点的文本元素产生字模的方法,上述每个码点代表一个所述字模;本方法由存贮在含有用于控制存贮器的处理器的计算机的程序执行,且存贮器中至少存有一个查找表与预先设定的含所述字模的预设定集的所述码点集对应,此办法包括步骤有(1)确定文本元素是否与表中一个字模相对应;如果是,继续进行到步骤4,否则进行到步骤2;(2)通过移去第一个预先设定的文本元素的子集来修改文本元素;(3)判断在表中是否存在与修改后的文本元素相应的字模,如果有,处理步骤(4),且(4)输出相应字模。2.权利要求1的方法,其中,如果判断步骤(3)为负,步骤(3)包括的步骤有(5)返回步骤(2)以进一步修改文本元素,进行用修改后的文本元素执行步骤(3),且(6)用进一步修改后的文本元素重复步骤(2)—(3)—(5),直到一个经修改的文本元素在表中有与之相对应的字模,然后处理步骤(4)。3.权利要求2的方法,其中步骤(6)包括的步骤有如果在经修改文本元素所对应的字模在表中被找到之前已达到一个预先确定的标准,那么在达到此预定标准的同时停止对文本元素的修改,并为修改过的文本元素产生一个缺省字模作为其对应字模。4.权利要求3的方法,其中步骤(2)包括从基本元素中至少除去一个码点的步骤,而预先确定的标准包括一个文本元素为空的判断;本方法还包括的步骤有在从文本元素中至少除去一个码点的同时产生一个文本元素剩余部分;且在用与经修改的文本元素对应的字模执行了步骤(4)之后,将剩余文本元素作为文本元素。5.权利要求1的方法,其中步骤(2)包括从文本元素除去一个码点的步骤;方法还包括的步骤有在从文本元素至少除去一个码点的同时产生一个文本元素剩余量;且在用与经修改的文本元素对应的字模执行了步骤(4)之后返回到步骤(1),将剩余量作为文本元素使用。6.权利要求6的方法,其中被除去的码点是一个在表中无对应字模的结合字符的码点,而步骤(3)包括的步骤有用一个缺省结合字符代替结合字符。7.一种由一串字符码产生字模的方法,字符码被输入一计算机系统,该系统有一个与存贮实施此法的软件的存贮器耦合的处理器和一个与处理器耦合的输出设备;本方法还包括的步骤有(1)从输入串产生包括字符码最初子集的第一个正常表达法此正常表达法相应于预先设定的语法;(2)判断第一个正常表达法是否存在于查找表中,如果是,找到与第一个正常表达法相应的字模,并且继续进行到步骤(8);(3)如果在查找表中未找到第一个正常表达法,产生初始字符码集的第一个子集作为当前子集,并且把初始字符码集的剩余量作为当前的剩余量,这个输入字符码的第一个剩余量至少包括一个不包括在第一个子集中的码;(4)判断字符码的当前子集是否能在查找表中找到;如果是,找出与当前子集相对应的字模处理步骤7,否则处理步骤(5);(5)产生输入字符码的一个新子集作为当前子集,产生输入字符码的一个新剩余量做为当前剩余量,此当前剩余量至少包括一个不包括在当前子集中的码;(6)判断预先确定的标准是否达到,如果没有,回到步骤(4),如果达到,处理步骤(7);(7)如果被产生的子集都不能在查找表中找到,指定至少一个缺省字符做为找到的字模并继续进行到步骤(8);(8)将找到的字符输出到输出设备。8.一种相应于包括代表要显示的字符的许多码点的输入文本元素而产生输出字模的系统,包括一台具有存贮至少一个字模表的存贮器的计算机;本系统包括查找处理程序,它用于寻找表找出代表文本元素的正确字模位置,撤退处理程序,如果代表文本元素的正确字模不能由查找处理程序找到时对文本元素进行处理,它包括第一产生装置,它至少产生一种构成文本元素的码点的一个子集;定位装置,用于在表中寻找代表子集的正确字模的位置;和第二产生装置,当代表子集的正确字模不能由定位装置定位时,为子集产生一个缺省字模;程序还包括输入装置和输出装置,输入装置从所说撤退处理程序接收所说的正确和缺省字模输出装置用于输出所说的正确和缺省字模以显示之。9.权利要求8的系统,其中每个码点都有一预先设定的类别,且系统还包括分析器装置,它对本文元素中每一码点确定分类并将类别与文本元素一起送到查找处理程序。10.权利要求9的系统,其中一个所说类别相应于一个连接码点,表明其前面一个和后面一个码点将被由连接在一起的字模表示。11.权利要求10的系统,其中输入文本元素的另一个子集包括代表第一个字符的码点,其后是代表一连接字符的码点,再后面是代表第三个字符的码点;且第二种产生装置包括用于当表达第一个子集整体的字模在查找表中找不到时产生一个空白的缺省字符以替代连接字符,并把代表第一和第三个字符的码点送给定位装置,以确定分别代表第一和第三个字符的字模经所说的输出装置输出。12.权利要求10的系统,其中输入文本元素的第一个子集包括对应第一个字符的码点,其后是第二个字符的码点,再后是第三个字符的码点,且第二和第三个字符中的每一个都包含一个结合字符,在此第一和第三个字符被表示在查找表中而第二个字符则没有;且第二种产生装置包括用于将代表第一和第三个字符的码点送至定位装置以为第一个字符找出第一个字模和为第三个字符找出第二个字模,并且第一和第二个字模结合成代表第一和第三个字符的结合字模,以及将此结合字模送至上述输出装置以输出该结合字模的装置。全文摘要一种用于对文本元素产生字模的方法和设备。每一个文本元素至少包括一个码点,通常是几个码点。系统在表内寻找代表一个被输入文本元素的字模,且如果字模未被找到同时系统地产生文本元素的子集,并且在表内寻找代表每一子集的字模。对不在表中的码点产生缺省字符。系统对每一码点进行分类,如统一码分类,并且采用根据其类别对未知码点进行处理的方式。文档编号G09G5/22GK1117160SQ94113598公开日1996年2月21日申请日期1994年12月29日优先权日1994年1月4日发明者约翰(I)·麦克恩内尔,莫迪海·休伯曼申请人:计数设备公司