字符串MBCS编码和UNICODE编码的相互转换

unicode转换  时间:2021-04-12  阅读:()

MBCS编码和UNICODE编码的相互转换今天写的一段代码涉及到MBCS编码和UNICODE编码的相互转换查了一下M SDN的相关资料整理如下

在VC6中默认使用MBCS编码即多字节字符实际就是支持大于0x80的AS CII码。这样一个中文字可以表示为2个字节 GB2312就是这样表示的。

VC6的默认安装是不带UNICODE库的要在VC6中写UNI CODE程序必须安装CRT和MFC的Uni c ode库。

要使你的程序支持Unicode要在你的项目属性中去掉"_MBCS"宏定义增加"UNICO DE"和"_UNICODE"两个宏定义。 注意这两个都应该加上 因为CRT和MFC使用UNICODE定义而STL则使用_UNICODE

如果你的程序是MF C的则Unic ode版MF C库的入口点是wWinMai nCRT Startup。

为了方便开发者VC6中提供了Tchar.h里面定义了一些宏用来帮助写两种编码都兼容的代码。

类型

一般文本

数据类型名称已定义_TCHAR char char wchar_t

_TINT int int wint_t

_TSCHAR signedchar signedchar wchar_t

_TUCHAR unsigned char unsigned char wchar_t

_TXCHAR char unsigned char wchar_t

CRT中的相关函数在Tchar.h中都定义了相应的替代基本是将str换成了_tc s 比如CRT中的unsigned int strle n(const char *)现在是unsigned int _tcslen(const TCHAR*)在Unio cde时将被替换为unsigned int_wcslen(const wchar_t)*而在MBC S时会被替换为unsigned int_mc slen(const char*)。

看写Unic ode和MBCS兼容的代码挺容易的吧我总结了一些替换规则

1将char换成TCHAR(unsigned char必须去掉unsigne d)

2将str函数换成_tcs函数

3将字符串常量定义加要_T("")宏

4 printf函数族必须修改为wprint f不过要注意千万不要使用wprintf函数来解析char型

很多时候程序中既需要Unicode又需要使用ASCII这时需要用到操作系统的2个API

WideCharToMulti Byte用来将Uni c ode字符串转化为MBCS的

Multi ByteToWide Char用来将MBC S字符串转化为Uni c ode的

一些注意事项

在Unic ode编码下 sizeof没那么可靠了memset( ,0, sizeof())的习惯用法可能会出大错改成memset(,0,sizeof()/szieof(TCHAR))就没事了呵呵

在Unic ode下一个中文字符就是一个字符 len=strlen()/2;这样可不行了

用VC6进行UNICODE编程

最近试图将自己的程序编译成Unicode版本费了不少力气相关内容整理如下适用于VC6但VC7、 VC8应该也差不多的后者新建项目缺省即按Unicode编译。

1.添加UNICODE和_UNICODE预处理定义

位置 Project Settings ->C/C++->Preprocessor definition s

添加了这两个定义后MFC的一些内置类型如TCHAR、 CString都将转为支持宽字符类型

wchar_t

2.使用宽字符相关类型如char->TCHAR、 char *->LPTSTR、 const char *->LPCTSTR

3.对字符串常量使用_T()宏

4.替换C库中的中字符串操作函数如strlen->_tc s len、 strc mp->_tc s cmp等

类似的还有C库中字符串与数字的转换函数如atoi ->_ttoi、 itoa->_itot等

5.将Projec t S ettings ->Link->Output->Entry P oint设为w WinMainCR T S T artup

否则会有如下错误msvcrtd.lib(crtexew.obj) :error LNK2001 :unres olved external symbol_WinMain@16

6.C++标准库中的string有对应的宽字符版本wstring两者均为basic_string的特化版本可在StdAfx.h中

#ifdef_UNICODE

#define tstring wstring

#els e

#define tstring string

#endif

然后在代码中使用tstring即可类似的还有fstream/wfstream、 ofstream/wofstream等

7.宽字符版本的英文字符仍可直接与整型值进行比较如

CString s=_T("ABC");

ASSERT(s[0]=='A');

8.对于仍需使用ANSI字符串的地方如第三方类库的接口仍可继续使用如需进行Unicode 字符串和ANSI 字符串的互转换 可使用 MultiByteT oWide Char 和WideCharToMulti Byte

来源 http://blog.163.c om/s sb_it/blog/s tatic/4487616520083910857238/

Unic o de 宽字节字符集

1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数

可以调用Microsoft Visual C++的运行期库包含函数_mbslen来操作多字节既包括单字节也包括双字节字符串。

调用s trlen函数无法真正了解字符串中究竟有多少字符它只能告诉你到达结尾的0之前有多少个字节。

2. 如何对DBCS 双字节字符集字符串进行操作

函数 描述

PTSTR CharNext  LPCTSTR  ; 返回字符串中下一个字符的地址

PTSTR CharPrev  LPCTSTR, LPCTSTR  返回字符串中上一个字符的地址

BOOL IsDBCSLeadByte( BYTE ) 如果该字节是DBCS字符的第一个字节则返回非0值

3. 为什么要使用Unic ode

1 可以很容易地在不同语言之间进行数据交换。

2 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。

3 提高应用程序的运行效率。

Windows 2000是使用Unicode从头进行开发的如果调用任何一个Windows函数并给它传递一个ANSI字符串那么系统首先要将字符串转换成Unicode然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串系统就会首先将Unicode字符串转换成ANSI字符串然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序就能够使你的应用程序更加有效地运行。

Windows CE 本身就是使用Unic ode的一种操作系统完全不支持ANSI Windows函数

Windows 98 只支持ANSI只能为ANSI开发应用程序。

Microsoft公司将COM从16位Window s转换成Win32时公司决定需要字符串的所有COM接口方法都只能接受Unicode字符串。

4. 如何编写Unicode源代码

Microsoft公司为Uni c ode设计了Window sAPI这样可以尽量减少代码的影响。实际上可以编写单个源代码文件以便使用或者不使用Unicod e来对它进行编译。只需要定义两个宏UNICODE和_UNICODE就可以修改然后重新编译该源文件。

_UNICODE宏用于C运行期头文件而UNIC ODE宏则用于Windows头文件。当编译源代码模块时通常必须同时定义这两个宏。

5.Windows定义的Unic o de数据类型有哪些

数据类型 说明

WCHAR Unicode字符

PWSTR 指向Unicode字符串的指针

PCWSTR 指向一个恒定的Uni c ode字符串的指针

对应的ANSI数据类型为CHAR LPSTR和LPCSTR。

ANSI/Unico de通用数据类型为TCHAR PTSTR,LPCTSTR。

6. 如何对Unicode进行操作

字符集 特性 实例

ANSI 操作函数以str开头 strcpy

Unicode 操作函数以wcs开头wcscpy

MBC S 操作函数以_mb s开头_mb s cpy

ANSI/Unicode 操作函数以_tcs开头_tcscpy C运行期库

ANSI/Unic o de 操作函数以lstr开头lstrcpy Windo ws函数

所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示 Unic o de版本函数结尾以W表示。Windows会如下定义#ifdef UNICODE

#define CreateWindowEx CreateWindowExW

#els e

#define CreateWindowEx CreateWindowExA

#endif // !UNICO DE

7. 如何表示Unicode字符串常量

字符集 实例

ANSI “string”

Unicode L“string”

ANSI/Unicode T(“string”)或_TEXT(“string”)if( szError[0]==_TEXT(„J‟) ){ }

8. 为什么应当尽量使用操作系统函数

这将有助于稍稍提高应用程序的运行性能因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用。 由于这些函数使用得很多 因此在应用程序运行时它们可能已经被装入RAM。

如 S tr Cat S tr Chr S tr Cmp和S tr Cpy等。

9. 如何编写符合ANSI和Unic ode的应用程序

 1 将文本串视为字符数组而不是chars数组或字节数组。

2 将通用数据类型如TCHA R和PT STR用于文本字符和字符串。

3 将显式数据类型如BYTE和PBYTE用于字节、字节指针和数据缓存。

4 将TEXT宏用于原义字符和字符串。

5 执行全局性替换例如用PTSTR替换PSTR。

6 修改字符串运算问题。例如函数通常希望在字符中传递一个缓存的大小而不是字节。这意味着不应该传递sizeof(szBuffer),而应该传递sizeof(szBuffer)/sizeof(TCHAR)。另外如果需要为字符串分配一个内存块并且拥有该字符串中的字符数目那么请记住要按字节来分配内存。这就是说应该调用malloc(nCharacters *sizeof(TCHAR)),而不是调用mallo c(nCharacters)。

10. 如何对字符串进行有选择的比较

通过调用CompareString来实现。

标志 含义

NORM_IGNORECASE 忽略字母的大小写

NORM_IGNOREKANA TYPE 不区分平假名与片假名字符

NORM_IGNORENONS PACE 忽略无间隔字符

NORM_IGNORESYMB OLS 忽略符号

NORM_IGNOREWIDTH 不区分单字节字符与作为双字节字符的同一个字符

SORT_STRINGSORT 将标点符号作为普通符号来处理

11. 如何判断一个文本文件是ANSI还是Unicode

判断如果文本文件的开头两个字节是0xFF和0xFE那么就是Unicode否则是ANSI。

12. 如何判断一段字符串是ANSI还是Unic ode

用IsTextUni c ode进行判断。IsTextUnic ode使用一系列统计方法和定性方法以便猜测缓存的内容。由于这不是一种确切的科学方法因此IsTextUnic ode有可能返回不正确的结果。

13. 如何在Unicode与ANSI之间转换字符串

Window s 函数MultiByteTo WideC har用于将多字节字符串转换成宽字符串 函数WideChar ToMultiByt e将宽字符串转换成等价的多字节字符串。

TmhHost暑假活动:高端线路VPS季付8折优惠,可选洛杉矶CN2 GIA/日本软银/香港三网CN2 GIA/韩国双向CN2等

tmhhost怎么样?tmhhost正在搞暑假大促销活动,全部是高端线路VPS,现在直接季付8折优惠,活动截止时间是8月31日。可选机房及线路有美国洛杉矶cn2 gia+200G高防、洛杉矶三网CN2 GIA、洛杉矶CERA机房CN2 GIA,日本软银(100M带宽)、香港BGP直连200M带宽、香港三网CN2 GIA、韩国双向CN2。点击进入:tmhhost官方网站地址tmhhost优惠码:Tm...

速云:广州移动/深圳移动/广东联通/香港HKT等VDS,9折优惠,最低月付9元;深圳独立服务器1050元/首月起

速云怎么样?速云,国人商家,提供广州移动、深圳移动、广州茂名联通、香港hkt等VDS和独立服务器。现在暑期限时特惠,力度大。广州移动/深圳移动/广东联通/香港HKT等9折优惠,最低月付9元;暑期特惠,带宽、流量翻倍,深港mplc免费试用!点击进入:速云官方网站地址速云优惠码:全场9折优惠码:summer速云优惠活动:活动期间,所有地区所有配置可享受9折优惠,深圳/广州地区流量计费VDS可选择流量翻...

BuyVM($5/月),1Gbps不限流量流媒体VPS主机

BuyVM针对中国客户推出了China Special - STREAM RYZEN VPS主机,带Streaming Optimized IP,帮你解锁多平台流媒体,适用于对于海外流媒体有需求的客户,主机开设在拉斯维加斯机房,AMD Ryzen+NVMe磁盘,支持Linux或者Windows操作系统,IPv4+IPv6,1Gbps不限流量,最低月付5加元起,比美元更低一些,现在汇率1加元=0.7...

unicode转换为你推荐
Downloadwordpress支付宝蜻蜓发布蜻蜓支付可以代理么企业信息查询系统官网怎么查企业信息是否在网上公示过ym.163.comfoxmail设置163免费企业邮箱重庆杨家坪猪肉摊主杀人重庆忠县的猪肉市场应该好好整顿一下了。6月份我买到了母猪肉。今天好不容易才下定决心去买农贸市场买肉。字节跳动回应TikTok易主#北京字节跳动科技有限公司#小说审核有三面么?我面试了两轮就叫我回家等消息了 要是刷下来了也该告什么是支付宝支付宝是什么意思Joinsql颁发的拼音大致的致的拼音爱买网超艾比安高达厉害吗,今天在网上看到的万代的果断入手了,168贵吗,不知道这款高达厉不厉害
双线服务器租用 新通用顶级域名 主机测评 mach5 抢票工具 网站保姆 好玩的桌面 免费ftp站点 云全民 创梦 谁的qq空间最好看 umax120 中国电信宽带测速网 双12 宏讯 服务器论坛 浙江服务器 lamp兄弟连 电信宽带测速软件 大化网 更多