Unicode vs Ansi

《Windows核心编程》之”Unicode vs ANSI“         《Windows核心编程》第二章专门介绍编程中的字符和字符串编码以及相关库函数,主要涉及”Unicode“和”ANSI“。书上描述的非常透彻,在此,我将它的主要思想精简并概括如下: 一、字符(串)类型         ANSI和Unicode是两种不同的字符编码方式。ANSI一般以一个字节(8bits)来编码所有的字符,理论上可以表示256种字符;Unicode,一般指UTF-... 阅读详情
Unicode vs Ansi 作者:dongxiao 发布时间:2001/02/05
 
文章摘要:
  本文介绍可以在 Unicode 及 Ansi 格式之间自由自在地变来变去的方法。
       

正文: 

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 格式之间自由自在地变来变去,相信当您看完这篇文章之後,对处理中文应该不再烦恼了吧!

 
 
QMT量化交易桥接方案深度对比:从MiniQMT淘汰说起 量化交易系统中的API桥接,本质是解决本地终端与底层交易引擎之间的通信瓶颈。其核心原理在于绕过GUI封装、直连确定性执行层,从而获得低延迟、高可靠、可监控的指令通路。技术价值体现在策略实盘一致性提升、毫秒级响应保障及运维可控性增强。典型应用场景包括打板策略、T+0套利、高频网格等对时效与稳定性双敏感的自动化交易。本文聚焦国金证券QMT专业版生态,系统剖析DLL注入、HTTP反向代理、IPC共享内存与官方HTTP API四大桥接路径的性能边界、合规风险与工程落地成本,尤其深入解析qmt终端 client is 阅读详情

相关推荐

新手入门机器学习案例(附源代码)

无

guguo666的博客 6655

ANSI vs UNICODE

环境:C RunTime LibraryUnicode 在ANSI C中的定义:String.htypedef unsigned short wchar_t标准的ANSI C字符串函数及等价Unicode函数char * strchr(const char *, int);wchar_t * wcschr(const wchar *, wchar_t);int strcmp(const

FogSinai 954

保姆级教程:用MATLAB复现格拉斯哥大学FMCW雷达数据集多普勒谱(附完整代码与避坑指南)

本文提供了一份详细的MATLAB教程,指导如何复现格拉斯哥大学FMCW雷达数据集的多普勒谱分析。从环境准备、数据获取到距离压缩、MTI滤波、时频分析(STFT)以及结果后处理,涵盖了完整流程,并附有优化代码和避坑指南,特别适合雷达信号处理研究者和工程师。

weixin_28720767的博客 114

vs 2005 Unicode 转 ANSI

VS2005默认是Unicode的工程,我可没有这么多时间来研究Unicode和ANSI的转换.得了,先她默认的Unicode改为默认ANSI吧: (1)相应编译宏的设定。如果使用Unicode字符集,需要定义预编译宏UNICODE和 _UNICODE两个;而使用ANSI字符集,不需要这个。具体修改方式为:ALT+F7打开工程选项,选择 C++栏目,再选择里头的PreProcessor栏目,

darkbus111的专栏 950

在已有win10系统下安装Ubuntu,最后出现执行‘grub-install/dev/nvme0n1p5‘失败的致命错误的解决方案

本人电脑型号戴尔灵越,两个SSD512G固态硬盘,c盘为系统盘. Ubuntu版本为20.04LTS,在官网下载https://ubuntu.com/download/desktop/thank-you?version=20.04.3&architecture=amd64 系统盘制作工具为Rufus-3.15http://rufus.ie/zh/ 安装过程网上很多,在这里就不赘述了. 其他安装过程都很顺利,直至安装最后出现这个 本来安装了到最后还以为成了,结果又不行...... 后.

XiaoChen_gugugu的博客 1万+

Matlab激活失败?手把手教你解决License checkout failed问题(附详细截图)

本文针对Matlab激活后出现“License checkout failed”错误的常见问题,提供了详细的解决方案。核心在于精准定位并正确填写Windows系统用户名,而非计算机名或账户全名。文章通过分步截图和命令指引,手把手教你使用`whoami`命令获取正确信息,并重新运行激活程序,从根本上解决因用户名填写错误导致的许可检查失败问题。

weixin_29062823的博客 570

VS中的字符串(Unicode/ANSI)操作和类属性设置

VS中的字符串(Unicode/ANSI)操作和类属性设置 1、在VS2005中,所有的字符都为Unicode,所以每一个字符串都因该加上_T("xxx")。_T是一个宏,如果定义了Unicode,_T("x")就相当于L"x",这是宽字符,如果没有定义Unicode,_T("x")就相当于"x"。 在VS中,_T(x)如下定义: #define_T(x)__T(x)...

hopegrace的博客 2260

初探802.11协议(6)——Wi-Fi 6新特性简介

Wi-Fi 6新机制(特性)介绍

FanFF的博客 1522

vs中ANSI编码和UNICODE编码及二者的兼容性问题

ANSI编码的字符集是多字符集,也就是每个字符的编码宽度不相等。 UNICODE编码的字符集是宽字符集,每个字符的编码都是两个字符。 有些操作系统仅支持多字符集,有些操作系统仅支持宽字符集,当然更多的操作系统是两种字符集都支持。为了兼容两种字符集,vs编译器为使用宏定义的方法来选择编译成多字符集还是宽字符集,下面分别介绍: 1.多字符集(ANSI) 字符型是char    const ch

MyLinChi的博客 5513

【系统分析师】第2章-基础知识:数学与工程基础(核心总结)

数学与工程基础

数据知道的博客 6812

第201期 解锁科研效率新高度:Claude 科学技能插件(claude-scientific-skills)深度体验

科研AI助手Claude Scientific Skills开源工具为Claude大模型扩展科学能力,覆盖数据可视化、数学计算、学术格式处理等科研全流程需求。该插件支持LaTeX公式生成、自动化科研图表绘制、学术文档规范校正等功能,让研究人员通过自然语言指令即可完成专业任务。项目开源可定制,支持特定学科需求扩展,目前已托管于GitHub。使用门槛低,只需配置Claude API密钥即可快速启用,帮助科研人员从繁琐技术细节中解放,聚焦核心研究创新。

全网120W+关注AI拉呱,专注人工智能以及科技前沿! 1357

将VS2010默认Unicode编码设置为ANSI编码

我的输出结果和目标输出结果,一模一样但是无法被识别。查了半天错,发现是编码格式不一样,vs2010默认的编码格式是Unicode,而目标格式是ansi。改过来就好了。打开菜单栏–>项目–>XXX属性–>配置属性–>常规–>字符集–>设置你想要的编码方式即可

cfylove的专栏 6052

AE(自动曝光)调试策略:曝光曲线设计与过曝控制

自动曝光(AE, Auto Exposure)系统是图像质量控制链路中的核心模块之一,其性能直接决定了成像亮度是否稳定、细节是否完整、场景切换是否自然。在现代移动终端影像系统中,AE 不仅需要适应不同光照强度和复杂环境,还需兼顾人脸优先、HDR触发、视频帧率控制等多目标优化需求。本文基于高通 Snapdragon 和 MTK Dimensity 等主流平台的调试经验,系统梳理了 AE 模型设计原则、曝光曲线配置、测光策略选择与过曝抑制机制,并结合典型实战案例,提供可复制的工程落地路径。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3089

在VS2010下使用 UNICODE 和 ANSI 的混合编程

1,在VS2010 编译器的菜单上 “项目----属性---左侧的配置属性----常规---右侧的 字符集 ”可以对项目所要使用的字符集进行定义,可以选择”使用Unicode字符集“、“使用多字节字符集”等等。 2,MessageBox 有三个版本:MessageBoxA, MessageBoxW, MessageBox; ************************...

weixin_34106122的博客 262

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VS2005中UNICODE和ANSI的区别

我们在编写Visual C++ 2005程序时候经常会碰到(如下错误),很迷惑   'CreateWindowExW' : cannot convert parameter 1 from 'const char [4]' to 'LPCWSTR' UNICODE  计算机发明后,为了在计算机中表示字符,人们制定了一种编码,叫ASCII码。ASCII码由一个字节中的7位(bit)表示,范

raochangping的专栏 1328

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VS2013在Unicode字符集下读写ANSI编码文件

CFile file(_T("test.txt"), CFile::modeRead);//读取文件 int filelen = file.GetLength(); char *p = new char[filelen + 1]; file.Read(p, filelen); p[filelen] = '\0'; USES_CONVERSION;//转化为wchar_t* 可以使用CString的

BCD_not_CBD的博客 2558

VS中遇到的 UNICODE和ANSI 编码问题

<br />以前编码问题总能让自己凑或蒙过去,最近要做一个项目服务器端用python写,客户端用c++,工程编译的字符集使用UNICODE。之间通过socket进行通信,通信过程中编码转换问题把我搞得晕头转向,逼着我将编码问题好好研究一番。<br /><br /> <br /> <br />首先先谈谈VC中的编码问题,首先编码我们大致可以分为两类:文件编码和内存编码。文件编码即源代码文件的编码,gbk,UTF-8等。内存编码即源代码编译成为二进制文件的时候采用的编码。<br /><br />比如,在VC 2

guo693的专栏 7787

给肥胖的VS2005去掉Unicode VC++ unicode ANSI 版本转换

让这个问题困扰了多次,找到设置方法,转下 http://www.cnblogs.com/ark-zhang/archive/2012/10/18/2728838.html 给肥胖的VS2005去掉Unicode VS2005默认是Unicode的工程,我可没有这么多时间来研究Unicode和ANSI的转换.得了,先她默认的Unicode改为默认ANSI吧:

652

VB编程中的Unicode vs Ansi

Unicode vs Ansi Visual Basic 32-bit 版本的字串处理采用 Unicode,也就是说字串在 VB 内部是以 Unicode 的格式来存放。 何谓 Unicode?简单的说,就是每一个字元都是以 2-byte 的型式表示,而每个「实 体字元」就是一个「字元」。因此, Len("大家好") Len("abc") 所传回的值都是 3,因为「大」和「a」都是一个字元。 ...

miaozk2006的专栏 319

ansi和unicode(二)BasicExcel 操作Excel用中文"另存为"存档文件名显示乱码(Vs2008编译)

Vs2008 编译BasicExcel 操作Excel用中文“另存为”,存档文件名显示乱码 比如我用"你好.xls"存档,实际显示“ÄãºÃ.xls”(我的工程设置Vs2008的字符集为“多字符集”) 而用Vc6.0编译 BasicExcel 操作Excel用中文“另存为”,存档文件名显示正常,真是郁闷了。 PS:  从设置选项中可以看到,工程中使用的字符集可设置为“M

542

VS2005中UNICODE和ANSI以及MBCS的问题

转自:http://starspiritray.blogcn.com/diary,14051732.shtml    我们在编写Visual C++ 2005程序时候经常会碰到(如下错误),很迷惑  CreateWindowExW : cannot convert parameter 1 from const char [4] to LPCWSTR

xziis的专栏 629
上一篇: 真实感计算机图形学(二)--消隐及真实感图形生成
下一篇: COM中的对象与C++中的对象
CandyCat
博客等级 码龄26年 23粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值