Unicode

本文探讨了Unicode在Windows应用开发中的重要性,包括Windows2000及Windows CE平台上的开发实践,以及如何在COM接口中使用Unicode。文章还介绍了C运行期库和Windows头文件对Unicode的支持。

 刚才写了满满一篇,居然给发表丢了。很郁闷,决定重写一遍,当温习了。

即使现在你不打算对应用程序进行本地化,开发时将U n i c o d e放在心上,肯定可以简化将来的代码转换工作

。此外, U n i c o d e还具备下列功能:
? 可以很容易地在不同语言之间进行数据交换。
? 使你能够分配支持所有语言的单个二进制. e x e文件或D L L文件。
? 提高应用程序的运行效率(后面还要详细介绍)。

Windows 2000是使用U n i c o d e从头进行开发的,,用于创建窗口、显示文本、进行字符串操作等的所有核心函数都需要U n i c o d e字符串。如果调用任何一个Wi n d o w s函数并给它传递一个A N S I字符串,那么系统首先要把字符串转换成U n i c o d e,然后将U n i c o d e字符串传递给操作系统。当然,进行这些字符串的转换需要占用系统的时间和内存。

为了使Windows CE尽量做得小一些,M i c r o s o f t公司决定完全不支持ANSI Wi n d o w s函数。因此,如果要为Windows CE开发应用程序,必须懂得U n i c o d e,并且在整个应用程序中使用U n i c o d e。

当M i c r o s o f t公司将C O M从1 6位Wi n d o w s转换成Wi n 3 2时,公司作出了一个决定,即需要字符串的所有C O M接口方法都只能接受U n i c o d e字符串。这是个了不起的决定,因为C O M通常用于使不同的组件能够互相进行通信,而U n i c o d e则是传递字符串的最佳手段。

U N I C O D E和_ U N I C O D E:。_ U N I C O D E宏用于C运行期头文件,而U N I C O D E宏则用于Wi n d o w s头文件。当编译源代码模块时,通常必须同时定义这两个宏。

C运行期库对U n i c o d e的支持:为了利用U n i c o d e字符串,定义了一些数据类型。标准的C头文件S t r i n g . h已经作了修改,以便定义一个名字为w c h a r _ t的数据类型,它是一个U n i c o d e字符的数据类型。所有的U n i c o d e字符串函数均以w c s开头,w c s是宽字符串的英文缩写。若要调用U n i c o d e函数,只需用前缀w c s来取代A N S I字符串函数的前缀s t r即可。

对于包含了对s t r函数或w c s函数进行显式调用的代码来说,无法非常容易地同时为A N S I和U n i c o d e对这些代码进行编译,若要建立双重功能,必须包含T C h a r. h文件,而不是包含S t r i n g . h文件。T C h a r. h文件的唯一作用是帮助创建A N S I / U n i c o d e通用源代码文件。它包含你应该用在源代码中的一组宏。

若要定义一个A N S I / U n i c o d e通用的字符串数组,请使用下面的T C H A R数据类型。如TCHAR *szError = "error",但这个代码还是有问题的,如果定义了_UNICODE宏的话,编译将会出错,应该为TCHAR *szError = L"error",这就需要另外一个宏_TEXT了。

windows头文件和api:windows头文件定义了3个unicode类型:WCHAR PWSTR PCWSTR, Wi n d o w s头文件也定义了A N S I / U n i c o d e通用数据类型P T S T R和P C T S T R.

在Windows 2000下,M i c r o s o f t的C r e a t e Wi n d o w E x A源代码只不过是一个形实替换程序层或翻译层,用于分配内存,以便将A N S I字符串转换成U n i c o d e字符串。该代码然后调用C r e a t eWi n d o w E x W,并传递转换后的字符串。当C r e a t e Wi n d o w E x W返回时,C r e a t e Wi n d o w E x A便释放它的内存缓存,并将窗口句柄返回给你。如果要创建其他软件开发人员将要使用的动态链接库( D L L),请考虑使用下面的方法。在D L L中提供两个输出函数。一个是A N S I版本,另一个是U n i c o d e版本。在A N S I版本中,只需要分配内存,执行必要的字符串转换,并调用该函数的U n i c o d e版本.

Windows API中的某些函数,比如Wi n E x e c和O p e n F i l e等,只是为了实现与1 6位Wi n d o w s程序的向后兼容而存在,因此,应该避免使用。应该使用对C r e a t e P r o c e s s和C r e a t e F i l e函数的调用来取代对Wi n E x e c和O p e n F i l e函数的调用。从系统内部来讲,老的函数完全可以调用新的函数。老的函数存在的一个大问题是,它们不接受U n i c o d e字符串。当调用这些函数时,必须传递A N S I字符串。另一方面,所有新的和未过时的函数在Windows 2000中都同时拥有A N S I和U n i c o d e两个版本。

Wi n d o w s还提供了一组范围很广的字符串操作函数。这些函数与C运行期字符串函数(如s t r c p y和w c sc p y)很相似。但是该操作系统函数是操作系统的一个组成部分,操作系统的许多组件都使用这些函数,而不使用C运行期库。建议最好使用操作系统函数,而不要使用C运行期字符串函数。这将有助于稍稍提高你的应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程E x p l o r e r. e x e所使用。由于这些函数使用得很多,因此,在你的应用程序运行时,它们可能已经被装入R A M。在经典的操作系统函数样式中,操作系统字符串函数名既包含大写字母,也包含小写字母,它的形式类似这个样子: S t r C a t、S t r C h r、S t r C m p和S t r C p y等。若要使用这些函数,必须加上S h l WA p i . h头文件

PS:妈的,刚才居然发表丢了,拷贝一份先,唉,没时间打魔兽了。。。。。。。。。
 

05-26
### Unicode 编码概述 Unicode 是一种国际化的字符编码标准,旨在为全球各种语言提供统一的编码支持。其核心目标是通过为每个字符分配唯一的一个代码点来消除传统字符编码方案中的局限性[^2]。 #### Python 中的 Unicode 处理 在 Python 中,字符串默认是以 Unicode 形式存储的。这意味着当涉及到不同编码之间的转换时,通常会遵循以下原则:将其他编码的字符串解码为 Unicode,然后再将其重新编码为目标编码形式[^1]。这种两步走的方式能够有效减少因直接转码而导致的数据丢失或错误。 #### 实际应用案例分析 假设有一个场景需要读取并处理来自文件系统的非 UTF-8 数据流(比如 GBK),可以通过如下方法完成: ```python with open('example.txt', 'r', encoding='gbk') as f: content = f.read() # 此处content已经是unicode对象 new_content = content.replace('旧内容','新内容') with open('output.txt', 'w', encoding='utf-8') as out_f: out_f.write(new_content) # 将修改后的数据写入新的UTF-8编码文件中 ``` 此段代码展示了如何从GBK编码读取文本到内存作为Unicode处理后再保存回磁盘成为UTF-8格式的过程[^1]。 #### 关于具体实现细节 尽管理论上定义了完整的Unicode空间,但在实际操作层面上存在多种不同的表现形式即所谓的“Unicode Transformation Format (UTF)”系列。其中最常见的是UTF-8、UTF-16以及较少使用的UTF-32等变体[^4]。它们各自适应特定的应用环境需求——例如网络传输倾向于轻量级且兼容ASCII特性的UTF-8;而对于某些嵌入式设备或者特殊场合下可能更偏好固定长度字段组成的UTF-16/32版本。 另外值得注意的一点是在JavaScript这样的前端技术栈里推荐利用十六进制表示法下的Unicode值来做进一步优化工作,这样不仅可以规避掉潜在的一些显示异常情况还能加快解析效率[^3]。 ### 结论 综上所述,无论是开发人员日常遇到的各种跨平台间文字交换难题还是深入探讨底层原理方面的话题,掌握好关于Unicode及其衍生出来的各类实用技巧都是非常必要的技能之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值