系统自带的记事本有读写UTF-8文本文件的功能,我想在自编的记事本中也加入这个功能,但在网上查找了一个钟头,竟然找不到用VB编写的代码,看来,天降大任于斯人也,大概要由我来开这个头了。
  于是我在网上狂查UTF-8的文章,恶补这方面的知识,并且还真的获益非浅,起码从七窍通六窍——一窍不通到七窍通一窍——略知一二了,呵呵。
  当我做完最后一次试验时,长长地叹了一口气,美美地伸了一个懒腰,呵呵,真爽啊,一天的时间终于没有白费!这也许就是编程的乐趣吧,当看到程序按照自己的愿望运行时,各位哥们姐们,你们的心情一定也与我是一样的,无比舒畅。
  下面我先简单讲述一下UTF-8编码的有关知识,并且只讲与我编写的读写UTF-8文本代码有关的知识(如有谬误之处请各位兄弟指正),详细的理论请各位自己找专业文章看看。
  UTF-8 编码字符理论上可以最多到 6个字节长,但目前全世界的所有文字和符号种类加起来也只要编到 4个字节长就够了。
  UTF-8 是以 8位(即 1个字节)为单元对原始码进行编码(注意一点:这里所讲的原始码都是指Unicode码),并规定:多字节码(2个字节以上才称为多字节)以转换后第1个字节起头的连续“1”的数目(这些连续“1”称为标记位),表示转换成几个字节:“110”连续两个“1”,表示转换结果为2个字节,“1110”表示3个字节,而“11110”则表示4个字节……跟随在标记位之后的“0”,其作用是分隔标记位和字符码位。第2~第4个字节的起头两个位固定设置为“10”,也作为标记,剩下的6个位才做为字符码位使用。
  这样,2字节UTF-8码剩下11个字符码位,可用以转换0080~07FF的原始字符码,3字节剩下16个字符码位,可用以转换0800~FFFF的原始字符码,由此类推。编码方式的模板如下:
原始码(16进制) UTF-8编码(二进制)
--------------------------------------------
0000 - 007F       0xxxxxxx
0080 - 07FF       110xxxxx 10xxxxxx
0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx
……
--------------------------------------------
  模板中的“x”表示字符码。
  VB能识别的 Ascii码<007F,所以在VB中,Ascii码都只能编为1个字节的UTF-8码。汉字的 Unicode编码范围为0800-FFFF,所以被编为3个字节的UTF-8码。
  例如“汉”字的Unicode编码是6C49,6C49在0800-FFFF之间,所以要用3个字节的模板:1110xxxx 10xxxxxx 10xxxxxx。
  UTF-8文本文件与Unicode文本文件类似,在文件的头部也有标记字节,Unicode文件的标记是2个字节:&HFF 和 &HFE,UTF-8文件的标记是3个字节:&HEF、&HBB 和 &HBF
  要写入UTF-8编码的文本文件,关键是对汉字编码的处理。我们从上述的汉字编码模板就可以看出,对汉字的处理步骤大致为:
第一步:取得汉字的Unicode码
第二步:将Unicode码分解为两个16进制数据
第三步:将这两个16进制数据转换成二进制数据并连接
第四步:将二进制数据分解为三个串,第一个串为4个位,在前面加上标记位“1110”,第二、三个串均为6个位,分别在前面加上“10”标记位
第五步:将这三个串分别转换为10进制数据并赋值给字节型数组
第六步:将字节型数组用二进制法写盘,并且要先在文本头存入三个字节的标记(&HEF、&HBB、&HBF),再将转换好的数据写入
  要读取UTF-8编码的文本文件,对汉字的处理步骤大致为:
第一步:用二进制法读入文本数据,赋值给字节型数组,并判断前3个字节是否UTF-8标记,如果是,才进行以下的处理
第二步:逐个字节判断是否汉字编码,如果是,就再提取后两个数组元素,共三个数组元素来加以处理
第三步:将这三个数据都转换成16进制数据
第四步:将三个16进制数据都转换成二进制数据
第五步:从第一个二进制数据中去掉前4位,从第二、三个二进制数据中分别去掉前2位,并将这三个处理后的二进制数据依次连接,成为一个16位的字串
第六步:从这个二进制串中分别提取前8位和后8位转换成两个10进制数据,这两个数据就是汉字的Unicode码了,将它们赋值给一个字符型变量即可
  由于上述的二进制数字均须进行大量的字符串操作,因此在实际的代码中,笔者采用了逻辑运算(位操作)来代替上述的字符串操作

  新建一个工程,添加一个文本框,MultiLine 属性设为 True,ScroBars 属性设为2,再添加一个公用对话框,改其名称为CD。再用菜单编辑器建立二个菜单项:一个的标题为“另存为UTF-8文件”,名称为“SaveToUTF8”,另一个用于打开文件,标题为“打开”,名称“OpenFile”。
代码如下:

Option Explicit
Dim DAT() As Byte, DAT1() As Byte
Dim Z As String
Dim i As Long

Private Sub SaveToUTF8_Click()
    On Error GoTo OutError
    Dim zAsc As Long 'Ascii码暂存
    Dim L As Long '字节计数
    CD.Flags = &H200A
    CD.DialogTitle = "另存为"
    CD.Filter = "UTF-8文本(*.txt)|*.txt"
    CD.ShowSave
    If CD.Filename = "" Then Exit Sub
    For i = 1 To Len(Text1)
        Z = Mid$(Text1, i, 1)
        zAsc = Asc(Z)
        If zAsc > 0 Then '如果不是汉字
            ReDim Preserve DAT(L + 1) As Byte
            DAT(L) = zAsc
            L = L + 1
        Else
            ReDim Preserve DAT(L + 3) As Byte
            DAT1 = Z
            DAT(L) = (DAT1(1) And 240) / 16 Or 224
            DAT(L + 1) = (DAT1(1) And 15) * 4 + ((DAT1(0) And 192) / 64) Or 128
            DAT(L + 2) = DAT1(0) And 63 Or 128
            L = L + 3
        End If
    Next
    ReDim DAT1(2) As Byte
    DAT1(0) = &HEF
    DAT1(1) = &HBB
    DAT1(2) = &HBF
    Open CD.Filename For Binary As #1
    Put #1, , DAT1
    Put #1, , DAT
OutError:
    Close
End Sub

摘自:网络整理


相关文章参考:


※VB输入文本文件实现右对齐

※VB计算文本文件的行数

※VB打开文本文件各种方法

※vb:读写文本文件

※vb UTF文本文件访问

※简述UTF-8编码原理及其文本文件的读写技术【转】

※VB 读写TXT文本文件函数

※VB 判断是否文本文件

※VB 按指定编码格式写入文本文件


VB部分相关文章推荐:


☆VB6 中善用ByRef 提升速度

☆[vb] Set 语句

☆VB_Format自定义格式

☆用VB如读取内存地址

☆vb FindwindowEx的用法实例

☆进制转化进10进制数

☆收藏:如何获取当前已经打开的IE对象(VB6代码)

☆DXInput中键码的转换(VB6.0代码)

☆如何在VB6.0里动态使用具有事件的对象

☆[vb]格式输出Format函数

☆读取和写入Windows的INI文件

☆简述UTF-8编码原理及其文本文件的读写技术【转】

☆VB中的文件操作

☆VB中的文件操作文档

☆vb 中拷贝文件

☆VB反跟踪技术点滴

☆VB共享软件防破解设计技术初探(二)

☆VB共享软件防破解设计技术初探(三)

☆VB共享软件防破解设计技术初探(一)

☆RTF文件格式【转】

☆VB压缩技术

☆[vb]FSO对象模型在VB中的应用

☆VB 窗体实现文件拖拽获取路径方法

☆VB:注册表的读写

☆vb中空操作(等待)的指令、延时方法

☆VB让控件可以当标题栏拖动

☆FSO对象新建、打开、保存文件

☆获取网关IP和MAC 的VB源码

☆VB文件关联

☆vb获得本地和远程的MAC地址(网卡地址)

☆VB中ShellExeCute的应用

☆VB打开网址方法大全

☆vb简单控制音量大小及静音的方法

☆拖动无边框窗体(VB6代码)

☆VB使用FileSystemObject对象写文件

☆VB 从注册表中删除项及其某个值

☆vb 字符串转为数字和判断字符串是否是数字字符串【转】

☆vb按热键启动应用程序

☆VB的坐标系统综述

☆VB利用API函数来处理文件

☆关于VB中Shell及ShellExecute的总结与记录

☆[vb]On Error GoTo 0和On Error resume区别

☆[vb]On Error 语句

☆记录一下:在菜单上添加自绘图形的例子(VB6代码)

☆vb中findwindow的疑惑

☆[vb]FindWindow使用方法

☆常用文件类[转,无法运行通,待调试]

☆[vb]url utf-8编码

☆VB中的Unicode 和Ansi 格式

☆VB中的format格式化函数

☆VB中字符串匹配的多种方式

☆VB抓图

☆谈vb目录文件操作的三种方法-2

☆谈vb目录文件操作的三种方法-1

☆vb使用open方法读写文件

☆VB的MD5加密模块

☆VB 超简单的屏幕截图代码

☆vb以类名或窗口标题查找句柄并关闭

☆VB将配置保存到EXE本身(生成EXE木马程序)

☆VB 调用腾讯截图控件CameraDLL.dll

☆在VB6.0中怎么实现escape和unescape

☆vb求任意两线交点

☆VB中调用Windows API的注意事项[VB知识库]

☆VB 一个获得自己外网IP 地址的程序代码

☆VB程序中实现IP地址子网掩码网关DNS的更改[转]

☆在VB 中应用FSO 对象模型介绍(摘自网络)

☆[转] Vb中FSO 对象的介绍

☆VB 画坐标轴

☆VB 二进制文件的操作

☆[VB]BMP转JPG

☆VB中KeyCode常数用法

☆vb实时曲线的绘制和保存


更多精彩>>>

简述UTF-8编码原理及其文本文件的读写技术 【转】相关推荐

  1. 字符编码原理 ASCII,Unicode和UTF-8 - - ITeye技术网站

    字符编码原理 ASCII,Unicode和UTF-8 - - ITeye技术网站 字符编码原理 ASCII,Unicode和UTF-8 博客分类:coder加密与解密 编码utf-8unicode原理 ...

  2. H264编码原理及NALU介绍

    一.简述 流媒体编解码流程大致如图1所示: [流媒体编解码流程 图1] 视频数据编解码层格式包含有:H264,H265,MPEG4等. 本文我们主要对H264编码原理进行整理,并对NALU做简要介绍. ...

  3. 【Android 内存优化】Android 原生 API 图片压缩原理 ( 哈夫曼编码开关 | 哈夫曼编码原理 | libjpeg-turbo 函数库 )

    文章目录 一. 哈夫曼编码开关 二. 哈夫曼编码原理 三. libjpeg-turbo 函数库 四. libjpeg-turbo 函数库下载 [Android 内存优化]图片文件压缩 ( Androi ...

  4. base64编码_几分钟看懂Base64编码原理

    Base64简介 Base64是基于64个可打印字符(小写字母a-z,大写字母A-Z,数字0-9,符号"+","/" 再加上作为垫字的"=" ...

  5. 简述ospf的工作原理_简述洛氏硬度计的工作原理及应用领域

    简述洛氏硬度计的工作原理及应用领域,其采用金刚石锥体或钢球作为压头.它应用一个次要负载,接着是一个主要负载,然后将负载减少到 初的次要负载.材料的硬度通过使用线性测量仪或其他工具从次要负载的第二次穿透 ...

  6. 【RS码1】系统RS码编码原理及MATLAB实现(不使用MATLAB库函数)

    关注公号[逆向通信猿]更精彩!!! 基础知识 要想搞懂本节知识,需要先熟悉掌握以下前几篇博客 [多元域乘法]多项式乘法电路原理及MATLAB详解 [多元域除法]多项式除法电路原理及MATLAB详解 R ...

  7. 【BCH码1】系统BCH码编码原理及MATLAB实现(不使用MATLAB库函数)

    关注公号[逆向通信猿]更精彩!!! BCH编码原理 设一个 ( n , k ) (n,k) (n,k)循环码的生成多项式为 g

  8. 详解varint编码原理

    什么是Varint编码 Varint是一种使用一个或多个字节序列化整数的方法,会把整数编码为变长字节.对于32位整型数据经过Varint编码后需要1~5个字节,小的数字使用1个byte,大的数字使用5 ...

  9. 简述流水线基本工作原理 计算机,自动化专业计算机技术基础作业题(50题)

    自动化专业计算机技术基础作业题(50题) (3页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 江西理工大学2012级自动化专业作业题1. 简 ...

最新文章

  1. hdu1305Immediate Decodability(字典树)
  2. PLT、POT、延迟绑定
  3. FPGA实验——译码器原理及实现
  4. Android 应用内微信 H5 支付
  5. expecting statement错误的一种情况(phpstorm 8.0.2)
  6. VMware卸载有残留,再安装时报错提示MSI Failed
  7. linux初学文档,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  8. Android开发学习
  9. C语言PAT乙级试题答案1016
  10. 文本编辑器——VI/VIM
  11. 快商通智能客服云平台、金融反欺诈方案获中科院互联网周刊金i奖
  12. 【数据库习题原理 10】数据库恢复技术
  13. 纯c++实现光线追踪渲染器
  14. 通过js获取谷歌浏览器版本
  15. python中的折线图、散点图、直方图绘制和图像参数设置
  16. Intellij idea和eclipse快捷键—快速复制当前行到上一行或者下一行失效解决
  17. 分布式存储FastDFS(自用)
  18. 全志T3开发板——嵌入式入门学习测试教程(4)
  19. 读书笔记: 如何把一件事做到最好
  20. 【nginx】配置nginx.conf 配置多个代理

热门文章

  1. Python 为何能成最强编程语言?!
  2. 马化腾评 ofo 溃败原因;京东到家否认裁员;王兴质押全部摩拜股权 | 极客头条...
  3. 恭喜你,2018 中国开发者有奖大调查“榜上有名”!
  4. socket编程和进程线程同步跟新
  5. 字节跳动算法工程师总结:java自学路线及推荐书籍
  6. 什么是Redis缓存雪崩、缓存穿透和缓存击穿
  7. 第 0 章 阳哥MySQL高级
  8. string 都不能作用于switch_谁带孩子争论不休?家庭教育谁也不能缺席,每个人的作用都不同...
  9. python mock支付_python mock知识03
  10. mysql8.0连接错误_MySql 8.0连接失败