背景:
统计各种类型的账号并展示,效果图:
账号类型是直接从配置文件读取,故原代码是采用补齐长度进行对齐,
问题来了,开发语言是VB6,VB默认是以Unicode处理编码的。如例"基本:"在VB里长度是3,但是用Ascii来说中文是占2个字符的,实际是5.
在网上找了下,找到一个计算VB字符的占位数的方法:
.将string用 strconv转成ascii,再返回字节数。
LenB(StrConv(strIn, vbFromUnicode))
函数说明:
返回按指定类型转换的 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 转成系统的缺省码页。 |
返回 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, 中文、日文、韩国的谚文等方块字……