说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

讲解一下UNICODE,它和ASCII有什么不同.我很糊涂.

编辑:说三道四文库 发布时间:2017-12-19 02:55
HTML文档下载 WORD文档下载 PDF文档下载
rt
ASCII占1字节,UNICODE占2字节。
因此ASCII表示的字符数最多只能到256,而UNICODE可以达到65536,可以把世界上的各种文字统一编码。
即使是英文,用UNICODE也要2字节。
我也很糊涂..........
关于unicode与ascii的区别,你找本charles petzold的 <<windows 程序设计>>,那里面讲的很清楚的。
有啥糊涂,只要记住:“UNICODE占用两个字节”
Unicode vs Ansi

Visual Basic 32-bit 版本的字串处理采用 Unicode,也就是说字串在 VB 内部是以
Unicode 的格式来存放。

何谓 Unicode?简单的说,就是每一个字元都是以 2-byte 的型式表示,而每个「实
体字元」就是一个「字元」。因此,

Len("大家好")
Len("abc")

所传回的值都是 3,因为「大」和「a」都是一个字元。

但是这对一些中文字串处理,例如纯文字的资料档,却是一个大灾难,因为你必须以
byte 来定位每个字元,可是 Unicode 却把一切的处理全搞砸了。例如:

Len("Good Morning") 传回 12,而
Len("今天天气很好") 传回 6

对初学者而言,好不容易能使用 VB 来写程式已经是件了不起的事了,却马上在中文
处理上挨了一记闷棍,所受到的打击实在不小。但是不要怕,事实上只要再多了解一
些指令,就可以把中文处理的问题解决了。

是什麽指令呢?最重要的莫过於 StrConv 了。StrConv 函式的语法为:

StrConv(待转换字串, 转换格式)

其中转换格式在这里用到的是:

vbUnicode 将 Ansi 字串转换为 Unicode
vbFromUnicode 将 Unicode 字串转换为 Ansi

将字串转成 Ansi 之後,所有的字串处理指令都要加个 B,例如:LeftB, RightB,
MidB, ChrB, InstrB, LenB, InputB 等。例用这些指令来处理就行了。

当你处理完毕之後,你可以再将它再转回 Unicode,这样就可以使用一般的字串处理
指令了。

这样讲看得懂吗?如果还是不了解,看看下面的实例说明:

[●] 简易使用范例

看看下面的基本范例您应该就会对 VB 的字串处理方式有些概念。

Private Sub Command1_Click ()
Dim sUnicode As String
Dim sAnsi As String

' Unicode 运算
sUnicode = "王小明,A123456789,651023,台北市中山路100号,(02)2345678"
Debug.Print Len(sUnicode) ' 传回 44
Debug.Print Mid$(sUnicode, 5, 10) ' 传回 A123456789
Debug.Print Instr(sUnicode, "台北市") ' 传回 23

' 将 Unicode 字串转成 Ansi
sAnsi = StrConv(sUnicode, vbFromUnicode)
' Ansi 运算
Debug.Print LenB(sAnsi) ' 传回 54
Debug.Print MidB$(sAnsi, 8, 10) ' 传回 ?????,因为忘了转回 Unicode
Debug.Print StrConv(MidB$(sAnsi, 8, 10), vbUnicode) ' 传回 A123456789,请注意转回 Unicode 的动作一定要做
Debug.Print InStrB(sAnsi, StrConv("台北市", vbFromUnicode)) ' 传回 23, 不要忘了要把"台北市"也转成 Ansi,否则会找不到
End Sub

[●] 读入文字档

在 VB 的小技巧中,有一个是快速读档法:

Private Sub Command1_Click ()
Dim sFile As String

Open "C:\filename.txt" For Input As #1
sFile = Input$(LOF(1), #1)
Close #1
End Sub

但是很不幸地,如果你读取的档案内含中文字,那上面这段程式会出现 Input past
end of file 的错误。因为 LOF 传回的是档案的 byte 数,而 Input 函式读取的是
字元数,由於档案内含中文,因此档案中的字元数将会小於 byte 数,於是就发生错
误了。

要解决这个问题,我们就要用到 StrConv 和 InputB 这两个函式了:

Private Sub Command1_Click ()
Dim sFile As String

Open "C:\filename.txt" For Input As #1
sFile = StrConv(InputB$(LOF(1), #1), vbUnicode)
Close #1
End Sub

上面修正程式先用 InputB 将档案读进来,不过使用 InputB 所读入的档案是 Ansi
格式的,所以要再用 StrConv 转成 Unicode 才行。

[●] 随机资料档

许多文字资料档是以固定位元组的位置来加以区格,例如下面的资料格式:

王小民650110台北市中山路100号 (02)1234567
张大呆660824花莲县大甲镇广东街23号(03)9876543
......

像这种类型的档案要如何处理呢?这是就必须用到 Type 以及 byte array 了。

Private Type tagRecord
Username(5) As Byte ' 姓名 6 bytes
Birthday(5) As Byte ' 生日 6 bytes
Address(21) As Byte ' 地址 22 bytes
TEL(11) As Byte ' 电话 12 bytes
CrLf(1) As Byte ' 换列字元 2 bytes
End Type

Private Sub Command1_Click()
Dim uRecord As tagRecord

Open "C:\filename.dat" For Random As #1 Len = LenB(uRecord)
Get #1, 2, uRecord ' 取第二笔资料

With uRecord ' With ... End With 应该会用吧
Debug.Print .Username ' 传回 ???
Debug.Print StrConv(.Username, vbUnicode) ' 传回 "张大呆"
End With

Close #1
End Sub

在这个例子中,一定要用到 byte array,因为只有 byte array 才能正确地定位到每
个 byte 的位置。以前使用字串来定位的方法已经不适用了,千万要记住!但是使用
byte array 所读入的资料是 Ansi 格式,若要处理或是做运算的话,记得还要转成
Unicode 格式才行。

[●] 使用 Byte Array

除了上面必须使用 byte 精确定位的例子之外,纯文字的处理基本上是用不到 byte
array 的。byte array 通常是用在处理 binary 资料。这方面的问题我们将另文讨
论。

看吧!只要熟悉使用 StrConv,你就可以在 Unicode 及 Ansi 格式之间自由自在地变
来变去,相信当您看完这篇文章之後,对处理中文应该不再烦恼了吧! 

--------------------------------------------------------------------------------
Site
谢了,加分
收藏
收藏 
VB利用Form_QueryUnload询问使用者是否关闭窗口 利用VB的图片框实现屏幕的滚动 利用VB动态改变Windows显示模式的两种方法 利用VB控制窗口显示风格 利用VB实现浮动按钮 VB利用子类处理技术限制窗体的大小 奇形怪状的窗体 -VB资料 强制ComboBox弹出下拉框 -VB资料 强制和防止窗口重画 -VB资料 巧用“关于”对话框-VB资料 请问在VB中如何关闭别的应用程序窗口 确定屏幕分辨率-VB资料 让VB5支持动画光标 让窗口拒绝接受键盘和鼠标事件 -VB资料 让窗体处于最前面 -VB资料 让窗体居中 -VB资料 让所有的控件都动起来 -VB资料 让最大化和最小化按钮消失-VB资料 任意多边形的窗口-VB资料 如 何将「拒 绝 被 盖 住 的 窗 口 」还 原-VB资料 VB如何创建椭圆形的窗体? VB如何创建无Icon的窗体? VB如何防止Edit框中的Password不被非法获取 VB如何将鼠标显示成动画鼠标? VB如何利用程序拉下 ComboBox? VB如何让窗体右上角的X失效? VB如何使Form的背景图随Form大小改变 VB如何使Text文本框的属性只读? VB如何使窗体右上角的&quot;X&quot;无效? VB如何使窗体最小化并消失 VB如何在VB和Delphi中快速实现立体化窗口显示 急救 少有问问题,来者有份! SmartUpload组件的Request有问题啊 db中知道如何知道一个已知名字的procedure存在于哪个package中? Windows2000的计算机名的命名规则是什么? 关于microsoft speech sdk5.1的问题?高分请教。 到底有没有人懂 菜鸟提问~~! 关于时钟中断的简单问题!! 我的硬盘完了。。。。。。。。。。。。。。。救救我呀。。。。。。。。。 关于JTree的图标 用jdk能否进行java编程,运行java程序? 如何用代码触发另外一个按钮的click事件!!!!!!!!! 奇怪的问题, 在线等待 请教:别名是中文速度很慢 请教dbgrid问题 请教:如何在JSP中实现媒体播放 如何使用asp程序反复提交一个页面 能不能实现powerpoint中实现同时只播放一个文档? 求SQL SERVER 2000 的东京攻略 请问怎么能自动升级 我是来找我MM的..................................... 动态生成的Tree怎么响应自定义的动作 哪里可以下载到asp的自助建站程序? COM初学者,请给点建议,谢谢!up有分 JBuilder9 的声音可以更改么? 再问一个关于rave的问题:怎么用程序在rave designer上画网格线,就是如何画直线??? 操作系统装好了,网卡却不能用了,急呀!!在线等待! asp.net中怎么判断request的一个值是否为空? ???数据显示问题??? 请教SOCKET编程中遇到的一个问题 如何得到程序是在运行时还是在设计状态? 求救!(送分) 子报表预览问题???????? 问一个关于多线程操作文件的问题(在线等待) 怎样实现:点击一个按钮,显示或隐藏一段内容? 请教关于WEBSPHERE的简单问题! 奇怪的问题?困扰中。。来看看有点意思:) fdas写过Taglib的大哥们教教我. 请问*.prz是什么文件,用什么软件打开 在线等待,水晶报表问题 在asp脚本中调用存储过程出错,求教,急 小问题 CSDN 无人能回答的问题,微软的BUG,我不得不重装.NET。 我是不是中毒了? 水晶报表中打印时无法打印多份 请各位帮忙 紧急求助!JAVA脚本问题!关于新闻发布系统 菜鸟,我,快毕业了......... 如何让combobox控件不能编辑 请教怎样查看当前数据库的时间格式? 请教发送邮件的问题!! "只是你没有发现"英语怎么拼?要求绝对准确` 蜀鄙二僧 两句子何恃而往 语气一样么 英语翻译If I rest,I rust. 錵是什么 錵霛这是什么字!谢拉!这到底是什么字啊!拼音发过来! 炫女不贞,炫士不信.礼不让辞,行不细谨.君子不器,智周天地.炫女不贞,炫士不信.礼不让辞,行不细谨.君子不器,智周天地. 拼音怎么拼才准确呢? 准确的准拼音怎么拼 贝聿铭怎么读 小明和爸爸、妈妈一起坐火车前往北京,坐座位时,小明恰好坐在爸爸和妈妈中间的概率为 女德幽贞,冰人亦得力, 加油站职员遭抢劫 胸前手机挡子弹救其有研究称所有哺乳动物遵循21秒排尿定埃及武打冠军因支持前总统穆尔西 金牌世上真有“摇钱树”:桉树能测地下黄金美国安局铁杆盟友临阵“倒戈” 称反对外媒称俄罗斯在G20峰会监控各国元首埃及再次审理穆兄会领导人美国百年交响名团将首次访华巴西劫匪入室抢值钱漫画叙利亚副总理称没有掌握自己被免职消息美国最新型隐身驱逐舰下水 因价格太贵中国铁路首次尝试同站台换乘列车小情侣车站前生纠纷 引民警携枪到场处揭秘合肥职业催款人:要签保密协议,感中国新型万吨级锻造机试车 航空发动机香港新界庆回归 26万市民参与169二季度甘肃省查处252起无证行医案件杀亲家辩称“醉梦中杀人”男子获刑14加拿大移民部长为新入籍法辩护 否认存“体彩杯” 深圳少儿锦标赛 赛事播报换造型与画外音深圳打拼的建设者最值得关爱重生之另类法师神医圣手仗剑诛邪新闻异能者逆转法师末日电影院篮坛门徒屌丝经理人魔法世界之雨恋雪逆天印至尊享受邬达克纪念馆旅游上海八万人体育场旅游老槐树旅游梅山旅游燕子岛旅游万佛湖旅游筇竹寺旅游豆沙关旅游措勤旅游直白村旅游泰丰公园旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘