Chr 函数和 ChrB 函数
Microsoft Access 中的 Chr 函数总是返回双字节字符。在早期版本的 Microsoft Access 中 Chr(&H41) 和 ChrB(&H41) 是相等的,而在当前版本的 Microsoft Access 中。Chr(&H41) 和 ChrB(&H41) + ChrB(0) 才是相等的。
同样,在早期版本的 Microsoft Access 中,“”表示为 ChrB(&H82) + ChrB(&HA0),但当前版本的 Microsoft Access 中却表示为 ChrB(&H42) + ChrB(&H30)。
调用 Windows 应用程序编程接口 (API)
在某些 Windows API 函数中,字符串的字节长度有特殊的含义。例如,下列程序返回一个在 Windows 中建立的文件夹。在 Microsoft Access 中,LeftB(Buffer, ret) 不能返回正确的字符串。这是因为尽管该函数显示了一个 ANSI 字符串的字节长度,但 LeftB 函数处理的却是 Unicode 字符串。在这种情况下可使用 InStr 函数只返回没有空值的字符串。
Private Declare Function GetWindowsDirectory Lib "kernel32" _
Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, _
ByVal nSize As Long) As Long
Private Sub Command1_Click()
Buffer$ = Space(255)
ret = GetWindowsDirectory(Buffer$, 255)
' WinDir = LeftB(Buffer, ret) '<--- Incorrect code"
WinDir = Left(Buffer$, InStr(Buffer$, Chr(0)) - 1)
'<--Correct code"
Print WinDir
End Sub
Input 函数和 InputB 函数
在 Microsoft Access 中,Input 函数在将文本从文件读到一个 Unicode 格式字符串中时会转换指定数量的字符,并将其作为变量读取。而 InputB 函数却不然,它假定数据已是二进制,对其不加转换即存为变量。如果读取一个以固定长度字段存储的文件时使用 InputB 函数,那么该固定字节长度的数据一经读取便需转换。
Open "Data.Dat" For Input As 1
dat1 = StrConv(InputB(10, 1), vbUnicode)
dat2 = StrConv(InputB(10, 1), vbUnicode)
dat3 = StrConv(InputB(10, 1), vbUnicode)
Dim Var() As Byte
Var = "" ' Unicode
Var = StrConv("", vbFromUnicode) ' ANSI
Function AnsiStrConv(StrArg, flag)
nsiStrConv = StrConv(StrArg, flag)
End Function
' LenB ANSI
Unicode
Function AnsiLenB(ByVal StrArg As String) As Long
AnsiLenB = LenB(AnsiStrConv(StrArg, vbFromUnicode))
End Function
' MidB ANSI
Unicode
'
Function AnsiMidB(ByVal StrArg As String, ByVal arg1 As Long, _
Optional arg2) As String
If IsMissing(arg2) Then
AnsiMidB = AnsiStrConv(MidB(AnsiStrConv(StrArg, vbFromUnicode) _
, arg1),vbUnicode)
Else
AnsiMidB = AnsiStrConv(MidB(AnsiStrConv(StrArg, vbFromUnicode) _
, arg1, arg2), vbUnicode)
End If
End Function
' LeftB
ANSI
Unicode
Function AnsiLeftB(ByVal StrArg As String, ByVal arg1 As Long) As String
AnsiLeftB = AnsiStrConv(LeftB(AnsiStrConv(StrArg, _
vbFromUnicode), arg1), vbUnicode)
End Function
' RightB ANSI
Unicode
Function AnsiRightB(ByVal StrArg As String, ByVal arg1 As Long) As String
AnsiRightB = AnsiStrConv(RightB(AnsiStrConv(StrArg, _
vbFromUnicode), arg1), vbUnicode)
End Function
' InStrB 2 Ansi Ansi
Function AnsiInStrB(arg1, arg2, Optional arg3) As Integer
If IsNumeric(arg1) Then
pos = LenB(AnsiLeftB(arg2, arg1))
AnsiInStrB = InStrB(arg1, AnsiStrConv(arg2, vbFromUnicode) _
, AnsiStrConv(arg3, vbFromUnicode))
Else
AnsiInStrB = InStrB(AnsiStrConv(arg1, vbFromUnicode) _
, AnsiStrConv(arg2, vbFromUnicode))
End If
End Function
使用 Byte 数据类型
在 Microsoft Access 中,Byte 数据类型已成为一种新增的数据类型。如果在处理二进制数据时使用了字符串变量类型,则文本将在 ANSI 和 Unicode 之间进行转换,并且将改变二进制数据。因此,处理二进制数据时应使用 Byte 数据类型的变量。
Dim ByteData() As Byte
ByteData = "" ' Unicode
ByteData = StrConv("", vbFromUnicode) 'ANSI
ByteData = InputB(10, #1) '