字串换行方法 本发明涉及一种字串换行的方法,用以在文字显示装置中,对不等宽的字符(character)所组成的字串(String)执行换行的动作。
在一般的视窗操作系统(如Windows95或Windows98)中,所提供的字体大致上可以分为两类:
1·等宽的字体:指字串中的每个字符的宽度都相同。如中文字符、Courier以及Courier new等几种字体,等宽字体的种类有限,字型的变化上也比较简单。
2·不等宽的字体:指字串中的每个字符的宽度都不相等,如罗马字体、True Type字体等,不等宽字体的种类较丰富,字型地显示效果也比较美观。
在文书编辑的时候,如果遇到一般的等宽的字符,对电脑的处理而言,常常是以等间距的字体表现,在换行的运算上比较简单,只要将行宽除以字符的宽度,就可以计算每行可以容纳的字数,之后只要累加每行的输入字数,就可以判断是否需要换行。
但是对于所谓的西文,即文字是以字母组合成以单字为单位的型态的文字,为求电脑上所表现出的态样能符合平时书写的习惯,以及电脑上的字型能有丰富的变化和效果,多半采用非等间距的字体。
而在一个固定的行宽中,每行可编辑的不等宽字符是一个不定数,要确定每行的字符数,就要分别取得各字符的宽度与行宽相比,因此要实现不等宽字符所组成的字串的换行,其演算法的效率就非常的重要。
一般的解决方法是,在已知此行首字符的情况下逐个向后累加各字符宽度,并与行宽比较,以确定此字符是在本行还是下一行,如果累加各字符宽度大于行宽,在根据WORD WRAP(字换行)规则把恰当的单词折换到下一行。如果此行实际能编辑的字符数是N,则累加宽度与行宽的比较次数便为N,因此要花不短的时间比较字符累加宽度与行宽,使得换行的运算显得效率低下。
如上所述,本发明的主要目的在于提供一种可以提高字串的换行效率的方法,用以在文字显示装置中,对不等宽的字符所组成的字串执行换行的动作。该方法藉由能编辑的最宽字元的数目加快确定实际能编辑的字符数目,在已知一行所能编辑的实际字符数后,由行尾向行首搜索本行字符,将恰当的单词折到下一行。
根据本发明所揭示的方法,主要包含下列步骤:
将该字串的首字符设定为读取的初始字符;
将该行的全部行宽设定为可用行宽值;
取得该字串中的最宽字符的字宽值;
根据该字宽值计算该行可容纳的最多最宽字符数N;
自该字串的首字符起开始逐一读取N+1个字符,并计算N+1个字符的累加宽度;以及
比较该累加宽度与该行行宽,如果该累加宽度小于该行宽,则将第N+2个字符设为读取的初始字符,并将剩余行宽设为该行的可用行宽值,返回计算最多字符的步骤,如果该累加宽度大于行宽,则自该字串中决定下一行的首字符,并将该首字符换到下一行。
本方法减少了编辑框中字符换行时累加字符宽度与行宽的比较次数,节省时间,达到提高字符换行效率的目的。
有关本发明的详细内容及技术,结合附图说明如下:
图1为本发明所揭示的方法流程图;
图2为本发明所揭示的方法的实施例。
棍据本发明所揭示的方法,该方法是从字串中找一最宽字符,再以此行的行宽除此最宽字符的字宽计算出此行所能编辑的最宽字符的字符数N,从此行的首字符开始向后读取N+1个字符(同时判断有无分行字符以及结束字符),计算N+1个字符的字符宽度,并用行宽减去此N+1个字符的宽度值,以得到此行还可编辑的最宽字符数,接着再自N+2个字符重复以上的操作流程,一直到实际的宽度已经超过了行宽,便自此单词向前读取单词分隔字符,如果搜寻到单词分隔字符,将此单词分隔字符后的字符作为下一行的首字符。
从下面的描述可以发现,本发明的计算次数的确比已有技术来得少。假定最宽字符宽度为Lw,字符平均宽度为Lp,各字符分布尽量均匀,可得比较字符累加宽度与行宽次数近似为(LogdN)+1,其中,N为此行实际能编辑的字符数,d-Lw/Lp;而逐个向后累加各字符宽度与行宽比较以确定此字符在本行还是在下一行的方法中,累加宽度与行宽的比较次数为N,因为N>(logdN)+1,所以本发明所揭示的方法,比较的次数较已知方法为少,效率得到提高。
接着,配合图1对上述的执行过程进行详细的流程描述,其步骤包括有:
步骤10:开始;
步骤11:设定操作的初始状态(将本行的首字符作为本次操作的初始字符,并将全部行宽设为可用的行宽值,搜寻字符是从初始字符开始);
步骤12:取得当前字串中最宽字符的宽度;
步骤13:计算本行还能编辑的最宽字符数N(用行宽除以字串中最宽字符的宽度值);
步骤14:从本次的操作初始字符开始读取1个字符;
步骤15:判断是否读到分行字符,若读到分行字符,则进行步骤22,否则进行步骤16;
步骤16:判断是否读到结束字符,若读到结束字符,则进行步骤26,若未读到结束字符,则继续下一步骤;
步骤17:判断是否读取N+1个字符,若是,则进行步骤19,否则进行步骤18;
步骤18:读取下一个字符,接着进行步骤15;
步骤19:计算所搜寻字符的累加宽度,进行下一步骤;
步骤20:将累加宽度与行宽进行比较,若小于等于,则进行步骤13,重新计算本行还能编辑的最宽字符数N,若大于,则进行步骤21;
步骤21:从此位置向前,直到本行首字符,搜寻一个单词分隔字符;
步骤22;将此字符的下个字符,作为下一行的首字符;
步骤23:判断是否有单词分隔字符,若有,则进行步骤24,否则进行步骤25;这里的单词分隔字符一般可以包括逗号、句号、空格等;
步骤24:将此分隔字符的下一个字符,作为下一行的首字符,然后进行步骤26;
步骤25:将读取到的最后一个字符作为下一行的首字符;然后进行步骤26;
步骤26:换行;
步骤27:结束。
实例:
下面,以一实例并配合图2做说明。在编辑框中的缓冲区内容为“This isa sample for word wrap,please study it.”,在本编辑字库中的最宽字符为W,宽度为10,编辑框的宽度为193,换行的动作是透过以下的步骤,步骤1至步骤6是由能编辑的最宽字符数加快确定实际能编辑的字符数目,步骤7则为在已知一行所能编辑的实际字符数目后,由后向前搜寻本行字符,将恰当的单词换到下一行,详细的过程为:
开始:编辑框宽度为193,可编辑19个宽度为10的字符W(W为本编辑中的最宽字符),如图2A;
步骤1:从首字符开始向行尾搜索20个字符(到’r’),剩下的宽度为101,还可编辑10个最宽字符,如图2B;
步骤2:从第21个字符开始向行尾搜索11个字符(到’,’),剩下的宽度为36,还可编辑3个最宽字符,如图2C;
步骤3:从第32个字符开始向行尾搜索4个字符(到’e’),剩下的宽度为22,还可编辑2个最宽字符,如图2D;
步骤4:从第36个字符开始向行尾搜索3个字符(到’e’),剩下的宽度为4,还可编辑0个最宽字符,如图2E;
步骤5:从第39个字符开始向行尾搜索1个字符(到’’,空白字符),剩下的宽度为1,还可编辑0个最宽字符,如图2F;
步骤6:从第40个字符开始向行尾搜索1个字符(到’s’),累加字符宽度已超出行宽,下一部找出下一行的首字符,如图2G;
步骤7:从本行首字符向前搜索到空格字符,找出下行行首字符为’s’,将’s’作为下行首字符,如图2H到图2I。
本发明的效果
本发明籍由计算一行所能编辑的最宽字符数,来减少编辑框中字符换行时累加字符宽度与行宽的比较次数,节约了时间,提高字符换行的效率。
虽然本发明已以一较佳实施例揭示如上,然其并非用以限定本发明,任何熟习本扶技术领域者,在不脱离本发明的精神和范围内,当可作些许的更动与润饰,因此本发明的保护范围当视后附的权利要求书为准。