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

 
 
Python RK3588 MPP 8路视频硬解码!全体目光向我看齐! 本文重写了官方demo、加入了Zlmediakit进行拉流并通过pybind11将代码封装成so库,现在,在python中直接通过import的方式,就能完成基础的拉流解码操作,目前支持8路拉流解码!!! 阅读详情

相关推荐

AC7811无感FOC实战:从开环到闭环的电机控制调试全记录

本文详细记录了基于国产AC7811芯片实现无感FOC电机控制的全过程。从硬件软件环境搭建、开环I/F启动调试,到滑模观测器参数整定,再到平滑切入闭环及双环PID调节,提供了完整的实战步骤与参数调试心法。文章重点分享了无感控制从开环到闭环切换的关键技巧与常见问题排查清单,为工程师提供了一份避坑指南。

kotlin6android的博客 713

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

告别手动发日报!用n8n+钉钉打造智能报告机器人(含模板下载)

本文详细介绍了如何利用n8n开源工作流自动化平台与钉钉机器人搭建智能日报系统,实现数据自动采集、处理和发送。通过实战步骤和模板下载,帮助用户告别手动处理日报的繁琐,提升工作效率和数据准确性。

h3i4j的博客 855

vs 2005 Unicode 转 ANSI

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

darkbus111的专栏 950

硬件原理图:从软件思维到硬件接口的嵌入式开发破局指南

本文为软件开发者提供了读懂硬件原理图的嵌入式开发破局指南。文章将硬件原理图类比为“硬件系统的架构图”,引导读者将软件API调用思维迁移到硬件接口理解上,详细解析了电阻、电容、二极管等常见元器件的“硬件API”功能与选型逻辑,并通过实战电路拆解,阐述了从原理图分析到驱动代码编写的完整思维链条,帮助开发者建立软硬件协同的系统级视角。

lg888的博客 493

保姆级避坑指南:用Docker在Ubuntu 22.04上部署Isaac Sim 5.1.0,搞定宇树G1仿真环境

本文提供了一份详细的保姆级避坑指南,帮助用户在Ubuntu 22.04上通过Docker部署Isaac Sim 5.1.0,并成功搭建宇树G1仿真环境。文章涵盖了环境准备、Docker与NVIDIA容器工具包的配置、Isaac Sim镜像的定制化拉取与配置,以及宇树G1仿真环境的实战调试,旨在帮助开发者高效解决部署过程中的常见问题。

weixin_33728268的博客 207

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

激光雷达点云配准:ICP与NDT算法详解

激光雷达点云配准:ICP与NDT算法详解​ ,人工智能,计算机视觉,大模型,AI,本文深入解析激光雷达点云配准的ICP与NDT算法。阐述了点云配准基础概念与评价指标,详解ICP算法原理、流程、最优变换矩阵计算、优缺点及改进版,给出Python代码示例;同样解析NDT算法的原理、流程、模型构建、优缺点、参数选择与代码示例。还对比两者在精度、效率、鲁棒性和适用场景的差异,提供算法选择建议,介绍实际应用案例、常见问题及解决方法,探讨算法发展趋势。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 15万+

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

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

MyLinChi的博客 5513

C#上位机实战:PLC与检测设备无缝对接,构建产品质量实时判定系统

本文分享了基于C#开发的汽车零部件质量检测系统实现经验。系统采用三层架构:设备层(PLC/视觉相机/三坐标)、通信层(OPC UA/SDK/串口)和应用层(数据采集/判定/存储)。重点解决了三大技术难点:1)通过OPC UA订阅模式将PLC通信延迟从500ms降至50ms;2)反编译厂商Demo破解视觉SDK对接难题;3)采用时间戳+产品ID实现多设备数据同步。系统上线后质检人员减少67%,误判率降至0.5%,数据追溯效率显著提升。文章强调工业场景下稳定性优先于技术复杂度,实用经验值得借鉴。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 799

innovus中如何设置cts参数

上面是设置cts的一般设置,如果需要对某些skew group或者某些clock tree设置不一样的参数,如需要对clk1这个clock设置不一样的inverter,可以使用。需要查询已经设置过的ccopt参数,可以使用get_ccopt_property去查询,方法和set_ccopt_property一致。言归正传,cts的设置命令是set_ccopt_property,获取命令是get_ccopt_property。另外,set_ccopt_property提供一套命令查询方法。

芯冰乐 544

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

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

cfylove的专栏 6052

用 SNC 和 SAP Single Sign-On Secure Login 把 SAP 登录这件小事,变成一件安全又不用输密码的事

在传统的 SAP 系统里,登录这件事看起来很朴素:用户打开 SAP GUI,输入一个 SAP 用户名,再输入一个 SAP 密码,点回车,进系统,开始干活。表面上没毛病,但从安全角度看,这种老办法问题很大。默认情况下,这些用户名和密码在网络上传输时是明文,也就是不加密传输。攻击者如果在公司网络里做监听,理论上可以直接截取到口令信息,这种风险对今天任何一家合规要求高、审计严格的企业来说,基本是不可接受的。(SAP Help Portal)SAP 给出的答案叫做 ,全称是 。SNC 做的事情可以概括成两类:一类是

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 373

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

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

weixin_34106122的博客 262

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VS2005中UNICODE和ANSI的区别

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

raochangping的专栏 1328

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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、付费专栏及课程。

余额充值