level 11
虽然已经有人发过了,但昨天没有找到,所以再来问一下。
VB 的字符串的储存并不是和文件储存一致的的,所以如果用字符串指针和TextOutA不能输出,只能使用TextOutW输出,但现在需要使用TextOutA进行一个整合的输出,所以只能使用Asc逐字转换吗?但我记得好像有一个函数可以直接转换字符串,但我我忘了怎么转换的了😂
2021年03月06日 00点03分
1
level 11
另外VB储存汉字方式与TextOutA所能识别的有什么方法直接转换吗?
2021年03月06日 00点03分
2
level 11
标题没说清楚,主要是汉字问题,英文符号已测试无问题
2021年03月06日 00点03分
3
level 11
好像是StrConv函数,但我还是想了解一下VB储存方式(Unicode?)怎么转换为TextOutA可识别的储存方式(ASCII扩展?)(单字转换)
2021年03月06日 00点03分
5
level 10
在“内存中”,用StrConv()函数进行转换。
此函数的第2个参数,标识“转换方式”。
用vbFromUnicode,就是把第1个参数指向的字节流“当成Unicode编码看待”,
把它转换成ANSI格式的字符编码后返回。
用vbUnicode,则是把第1个参数指向的字节流“当成ANSI编码”,
把它转换成Unicode格式的字符编码返回。
2021年03月06日 03点03分
6
level 13
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
Private Declare Function TextOut2 Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As Long, ByVal nCount As Long) As Long
Private Declare Function TextOutW Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
Private Declare Function TextOutW2 Lib "gdi32" Alias "TextOutW" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As Long, ByVal nCount As Long) As Long
Private Sub Form_click()
Dim str As String
Dim bt() As Byte
Dim i As Integer
str = "AAA" '内存中是按Unicode存储的
Debug.Print LenB(str) '字节数为6
bt = str
For i = 0 To UBound(bt)
Debug.Print bt(i) '分别是65 00 65 00 65 00
Next
'TextOut Me.hdc, 0, 0, str, Len(str) '输出AAA(由于参数lpString是String的,VB会将str转成Ansi,再由TextOut绘制)
'TextOut2 Me.hdc, 0, 0, StrPtr(str), LenB(str) '输出A A A (由于参数lpString是Long的,不会转换,而转递的需是StrPtr(str)字符串指针)
'TextOutW2 Me.hdc, 0, 0, StrPtr(str), Len(str) '输出AAA(由于参数lpString是Long的,不会转换,而转递的需是StrPtr(str)字符串指针),str本是Unicode,TextOutW也是处理Unicode的,所以正常输出
'TextOutW Me.hdc, 0, 0, str, Len(str) '这里就输出乱码了(由于参数lpString是String的,VB会将str转成为Ansi,再转递给TextOutW输出,TextOutW还是按Unicode在处理,当然也就错了)
str = StrConv("AAA", vbFromUnicode) '转ANSI
bt = str
For i = 0 To UBound(bt)
Debug.Print bt(i) '分别是65 65 65
Next
Debug.Print LenB(str) '字节数为3
'TextOut2 Me.hdc, 0, 0, StrPtr(str), LenB(str) '这里输出AAA (由于vbFromUnicode转换后已经是ANSI格式了)
'String详解
Debug.Print StrPtr(str) '得到字符串的指针
Debug.Print VarPtr(str) '得到变量的指针
Dim newptr As Long
Call CopyMemory(newptr, ByVal VarPtr(str), 4)
Debug.Print newptr '得到变量指针处的4个字节,即字符串的指针,和StrPtr(str)效果一样,只是没StrPtr(str)快 (此法只是为了分析String,不推荐使用)
Dim strlen As Long
Call CopyMemory(strlen, ByVal StrPtr(str) - 4, 4) '字符串的指针向前偏移4个字节,存储的是字符串的字节数,即和LenB(str)一样 (此法只是为了分析String,不推荐使用)
Debug.Print strlen
End Sub
2021年03月06日 04点03分
9
VB的Open写入字符串时也进行了转换(转成了ANSI),所以文件中是按ANSI格式存储的,而且读取时VB又将ANSI转成Unicode,反正都是可以测试(Uedit32可以看二进制)
2021年03月06日 04点03分
看了一下您的代码,也发现了如果用A版函数,直接传入字符串就可以了,但是因为某些原因,所以我需要使用指针输出
2021年03月06日 05点03分
用字符串变量则转换在输出阶段,而用字符串指针则转换在数据处理阶段,而且大批量的字符转换只是特殊情况,大部分情况不必要大量转换,所以我还是更倾向于处理时使用StrConv,输出用A版函数传指针
2021年03月06日 05点03分