VB里关于ASCII扩展字符的问题

pisces0228 2009-01-06 03:51:04
129到255代码对应的字符为西文的扩展字符,以下代码:
Dim Btemp(3) As Byte
Dim Strtemp As String
Btemp(0) = 99
Btemp(1) = 27
Btemp(2) = 177
Btemp(3) = 178
Strtemp = StrConv(Btemp, vbUnicode)

在打印机的检测模式下,对Strtemp进行十六进制检测,结果为:63 1B B1 B2
显然,结果说明VB没有对Btemp数值进行更改.结果是正确的.

而以下代码:
Dim Btemp(3) As Byte
Dim Strtemp As String
Btemp(0) = 99
Btemp(1) = 27
Btemp(2) = 177
Btemp(3) = 38
Strtemp = StrConv(Btemp, vbUnicode)

测试出来的结果却是:63 1B 3F,如果VB没有做小动作,那么正确的结果是:63 1B B1 26
经过反复测试发现,如果大于129的字节后面,跟的不是同样大于129的字节的话,VB会对数值进行转换....
也就是说,打印机会接收到错误的代码,打印出错误的字符.

请问该怎么做,才能让VB不要这么"多此一举"呢?
...全文
141 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2009-01-07
  • 打赏
  • 举报
回复
文件模式中 Input/Output 是有格式的文本文件,写入时会进行格式化,Byte 数组转成可显示的字符串。
而 Binary 模式是按内存字节读写的,不做转化。
pisces0228 2009-01-07
  • 打赏
  • 举报
回复
put #1,,Btemp
中间省略掉的参数怎么用?
pisces0228 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Tiger_Zhao 的回复:]
引用 3 楼 pisces0228 的回复:
open "lpt1:" for output as #1
dim a as string
print #1,a
close

这样调用向打印机输出..
文件模式改用二进制方式试试

VB codeDim Btemp(3) As Byte
Btemp(0) = 99
Btemp(1) = 27
Btemp(2) = 177
Btemp(3) = 38
Open "LPT1:" For Binary Access Write As #1
Put #1, , Btemp
Close
[/Quote]

这个可以..麻烦请解说一下..
Tiger_Zhao 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pisces0228 的回复:]
open "lpt1:" for output as #1
dim a as string
print #1,a
close

这样调用向打印机输出..[/Quote]
文件模式改用二进制方式试试
Dim Btemp(3) As Byte
Btemp(0) = 99
Btemp(1) = 27
Btemp(2) = 177
Btemp(3) = 38
Open "LPT1:" For Binary Access Write As #1
Put #1, , Btemp
Close
zdingyun 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pisces0228 的回复:]
引用 1 楼 Tiger_Zhao 的回复:
不要调用转换函数,

VB codeStrtemp = Btemp


不知道你如何调用打印机,应该直接按 Ansi 格式输出。


open "lpt1:" for output as #1
dim a as string
print #1,a
close

这样调用向打印机输出..
[/Quote]
LZ:用OPEN语句打开打印机方式,在WIN9X下支持汉字打印,在WINXP下不支持汉字.
若在WINXP下应该使用Printer 对象来实施打印汉字.
http://topic.csdn.net/u/20070929/18/6ddd8fc1-aac3-4cc7-9b08-4fd21c7ffecc.html我的答贴.
pisces0228 2009-01-06
  • 打赏
  • 举报
回复
Btemp 不是字符,比如Btemp=12,也就是数值,打印机按数据十六进制代码接收: 31(1) 32(2)
pisces0228 2009-01-06
  • 打赏
  • 举报
回复
VB codeStrtemp = Btemp

是什么来着??
是不是:strtemp=Btemp ?
这样也不行,就像上面说的,找不到对应字符,用"?"替换掉了,打印机收到的数据是:3F 3F
Tiger_Zhao 2009-01-06
  • 打赏
  • 举报
回复
Btemp 不就是
pisces0228 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Tiger_Zhao 的回复:]
不要调用转换函数,

VB codeStrtemp = Btemp


不知道你如何调用打印机,应该直接按 Ansi 格式输出。
[/Quote]

open "lpt1:" for output as #1
dim a as string
print #1,a
close

这样调用向打印机输出..
pisces0228 2009-01-06
  • 打赏
  • 举报
回复
我明白为什么Btemp=177时,对应的字符是"3F"了.
因为177高位为人,VB自动认为它是汉字,将"177"和后面的"38"合在了一处,而string里没这个汉字,所以会自动用"?"号代替掉.而"?"的ASCII代码正是"3F"..对于这个"自作聪明"的行为感到无奈..
在C++ 6.0的char(177)里,就算找不到对应的字符,但并不会用"?"号代替,而会原原本本地输出177这个字符,哪怕没这个字符..
因为被string局限了,所以,感觉string不能达到我要的,请问,VB有像C++中char那样的类型吗?
Tiger_Zhao 2009-01-06
  • 打赏
  • 举报
回复
不要调用转换函数,
Strtemp = Btemp

不知道你如何调用打印机,应该直接按 Ansi 格式输出。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧