中英文混排展示的对齐

背景:

统计各种类型的账号并展示,效果图:


账号类型是直接从配置文件读取,故原代码是采用补齐长度进行对齐,

问题来了,开发语言是VB6,VB默认是以Unicode处理编码的。如例"基本:"在VB里长度是3,但是用Ascii来说中文是占2个字符的,实际是5.


在网上找了下,找到一个计算VB字符的占位数的方法:

.将string用 strconv转成ascii,再返回字节数。

 LenB(StrConv(strIn, vbFromUnicode))


函数说明:

StrConv 函数

      

返回按指定类型转换的 Variant (String)。

语法

StrConv(string, conversion, LCID)

StrConv 函数的语法有下面的命名参数:

部分 说明
string 必要参数。要转换的字符串表达式。
conversion 必要参数。Integer。其值的和决定转换的类型。
LCID 可选的。如果与系统LocaleID不同,则为LocaleID(系统LocaleID为缺省值。)

设置值

conversion 参数的设置值为:

常数 说明
vbUpperCase 1 将字符串文字转成大写。
vbLowerCase 2 将字符串文字转成小写。
vbProperCase 3 将字符串中每个字的开头字母转成大写。
vbWide* 4* 将字符串中单字节字符转成双字节字符。
vbNarrow* 8* 将字符串中双字节字符转成单字节字符。
vbKatakana** 16** 将字符串中平假名字符转成片假名字符。

vbHiragana** 32** 将字符串中片假名字符转成平假名字符。
vbUnicode 64 根据系统的缺省码页将字符串转成 Unicode。
vbFromUnicode 128 将字符串由 Unicode 转成系统的缺省码页。

Len 函数

      

返回 Long,其中包含字符串内字符的数目,或是存储一变量所需的字节数。

语法

Len(string | varname)

Len 函数的语法有下面这些部分:

部分 说明
string 任何有效的字符串表达式。如果 string 包含 Null,会返回 Null。
Varname 任何有效的变量名称。如果 varname 包含 Null,会返回 Null。如果 varname 是 Variant,Len 会视其为 String 并且总是返回其包含的字符数。

说明

两个可能的参数必须有其一(而且只能有其一)。如为用户定义类型,Len 会返回其写至文件的大小。

注意   LenB 函数作用于字符串中的字节数据,如同在双字节字符集(DBCS)语言中一样。所以 LenB 返回的是用于代表字符串的字节数,而不是返回字符串中字符的数量。如为用户自定义类型,LenB 返回在内存中的大小,包括元素之间的衬垫。对于使用 LenB的示例代码,请参阅示例主题中的第二个示例。


而原代码用了系统的一个API :

Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long


与strlen的不同是一个返回字节长度,一个返回字符长度。


再字符长度补齐之后,又有另外一个新问题,数字部分并没有完全对齐:



这个问题又涉及到等宽字体:


比例字体(Monospaced Font)即每个字母宽度按一定比例自动调整;而等宽字体则是每个字母所占宽度相同。

差别关键在于可读性。显然比例字体使单词的整体可读性增强了。但是,早期的打字机、电脑屏幕由于技术的限制,不能自动显示比例字体,因而最先出现的是等宽字体。而现在,技术的突破已使比例字体得以普及。

不过,即便到今天,等宽字体也还有它一定的使用优势,如用于显示编程代码。

分类

常见比例字体:Times New Roman, Arial, Helvetica, 微软雅黑(例外)……

常见等宽字体:Courier, Monaco, 中文、日文、韩国的谚文等方块字……


调整字体后,问题解决。



你可能感兴趣的:(中英文混排展示的对齐)