`

Vc的字符串说明

阅读更多
vc 中的混乱的字符。


MBCS(多字节码)
早在Windows采用Unicode统一编码进行语言管理之前,Windows为了能够进行非ANSI标准字符的输出,于是采用两个字节来表示这些语言文字。因为这些双字节文字和ANSI是混和在一起的,为了加以区别,Windows将这些字符的最高位置为 1(即这些双字节文字的每个字节都>=127),所以这种表示法可以表示 127x127 约一万多种非ANSI文字,其本上可以表示任何一种语言的常用文字了。于是,Windows为每一个区域版本,都制定了分别独立的文字编码,这就是MBCS(多字节码)。

Unicode(统一码、万国码、单一码)
是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
在Unicode中:汉字“字”对应的数字是23383。在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、 UTF-16、UTF-32
UTF-8以字节为单位对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
  Unicode编码(16进制) ║ UTF-8 字节流(二进制)
  000000 - 00007F ║ 0xxxxxxx
  000080 - 0007FF ║ 110xxxxx 10xxxxxx
  000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx
  010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。
  例1:“汉”字的Unicode编码是0x6C49。0x6C49在 0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001,用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

L""表示Unicode字符(请切记:WCHAR即ushort只表示宽字符,而宽字符并不就是 unicode,反而Unicode属于宽字符).
我们可以使用%S等进行转换MBCS/Unicode转换


setlocale(LC_ALL,"");
TCHAR  sxStr1[]   =   TEXT("12汉字");//根据平台自动选择字符集
char   szStr2[]   =   "12汉字";  //MBCS码
WCHAR  swzStr3[]   =   L"12汉字"; //UNICODE码

printf("%d,%d\n",sizeof("abc"),sizeof(L"abc"));

printf("//depend on platform\n");
_tprintf(TEXT("_tcsclen(\"%s\")=%d,sizeof(\"%s\")=%d\n"),sxStr1,_tcsclen(sxStr1),sxStr1,sizeof(sxStr1));
strPrt0X(sxStr1,10);

printf("//MBCS\n");
printf("strlen(\"%s\")=%d,sizeof(\"%s\")=%d\n",szStr2,strlen(szStr2),szStr2,sizeof(szStr2));
strPrt0X(szStr2,10);

printf("//MBCS\n");
printf("_mbstrlen(\"%S\")=%d,sizeof(\"%s\")=%d\n",swzStr3,_mbstrlen(szStr2),szStr2,sizeof(szStr2));
strPrt0X(szStr2,10);

printf("//Unicode\n");
wprintf(L"wcslen(\"%S\")=%d,sizeof(\"%s\")=%d\n",szStr2,wcslen(swzStr3),swzStr3,sizeof(swzStr3));
strPrt0X(swzStr3,10);

#在工程设置为"Unicode字符集" 时候
4,8
//depend on platform
_tcsclen("12汉字")= 4,sizeof("12 汉字")=10
31 00 32 00 49 6c 57 5b
//MBCS
strlen("12汉字")=   6,sizeof("12 汉字")=7
31 32 ffffffba ffffffba ffffffd7 ffffffd6
//MBCS
_mbstrlen("12汉字")=4,sizeof("12 汉字")=7
31 32 ffffffba ffffffba ffffffd7 ffffffd6
//Unicode
wcslen("12汉字")=   4,sizeof("12 汉字")=10
31 00 32 00 49 6c 57 5b

#在工程设置为"未设置"时候
4,8
//depend on platform
_tcsclen("12汉字")= 6,sizeof("12 汉字")=7
31 32 ffffffba ffffffba ffffffd7 ffffffd6
//MBCS
strlen("12汉字")=   6,sizeof("12 汉字")=7
31 32 ffffffba ffffffba ffffffd7 ffffffd6
//MBCS
_mbstrlen("12汉字")=4,sizeof("12 汉字")=7
31 32 ffffffba ffffffba ffffffd7 ffffffd6
//Unicode
wcslen("12汉字")=   4,sizeof("12 汉字")=10
31 00 32 00 49 6c 57 5b 00 00

utf-8实际上是对Unicode的widechar进行了编码,因此utf-8 可以用char*表示,
utf-8与Unicode之间的转换通过MultibyteToWideChar实现。

============
再来说一下使用什么好
综合考虑Unicode是大势所趋:
1.API基本都有Unicode版本
2.更容易国际化
3.多国语言混合不会出现乱码的情况

=======================

关于字符串的使用
用String CString是比较好的选择,因为他们转换比较灵活。
其次是用Tchar

如果要进行转换 MultiByteToWideChar / WideCharToMultiByte
mbcstowcs / wcstombcs
都可以
但是MultiByteToWideChar / WideCharToMultiByte 还能转字符编码,这在遇到汉字的时候会很有用。
分享到:
评论

相关推荐

    字符串检测VC

    "字符串检测VC"的标题和描述暗示了我们将会探讨如何在VC环境中对字符串进行基本的操作,如字符串的相加减、空串判断以及编辑框中的字符串管理。以下是对这些知识点的详细说明: 1. **字符串的相加减**: 在C++中,...

    zifuchuan.rar_vc 字符串 处理_zifuchuan_字符串_字符串处理

    在这个"zifuchuan.rar_vc 字符串 处理_zifuchuan_字符串_字符串处理"的压缩包中,我们可以期待找到一些关于如何在VC++环境中处理字符串的实例或源代码。 字符串处理涉及到对字符序列的操作,如创建、查找、替换、...

    vc字符串大全.pdf

    以下是一些主要的VC字符串函数及其详细说明: 1. **bcmp**: - 功能:比较两个内存区域的内容是否相同。 - 参数:`const void *s1`,`const void *s2`分别指向要比较的内存区域,`int n`表示比较的字节数。 - ...

    VC中截取字符串(CString)的方法

    在VC++编程中,我们有时会遇到关于截取字符串的问题,对于CString类型字符串的截取VC中有现成的函数可供使用,主要是:CString Mid (int nFirst, int nCount);和BOOL AfxExtractSubString (CString& rString, ...

    vc字符串大全[参考].pdf

    VC字符串大全涵盖了C语言编程中常用的字符串处理函数,这些函数对于软件开发至关重要,尤其是在处理文本数据和用户输入时。以下是一些关键的字符串函数及其详细说明: 1. **bcmp**: - bcmp() 函数用于比较两个...

    mfc字符串加解密

    MFC(Microsoft Foundation Classes)是Microsoft为Windows应用程序设计的一种C++类库,其中包含了对字符串处理的重要类——`CString`。`CString`类提供了丰富的字符串操作功能,但在某些场景下,如传输敏感信息或...

    vc字符串大全.docx

    在VC++编程环境中,字符串处理是程序开发中的常见任务,涉及到很多内置函数。这些函数帮助开发者高效地操作字符串,包括比较、拷贝、查找和填充等操作。以下是根据标题和描述中提到的一些函数的详细说明: 1. **...

    C++检测字符串合法性的类(自创)

    自己写的一个类,实现对字符串的检测。 可以检查字符串是否满足某种指定的类型格式, 指定的类型格式包括整型数、浮点数、布尔型、有特殊要求的字符串等, 同时允许把字符串转换成相应的数据类型, 可用于对用户输入...

    VC字符串函数大全.docx

    以下是对文档中提到的一些关键字符串函数的详细说明: 1. **bcmp**: - 函数:`int bcmp(const void *s1, const void *s2, int n);` - 功能:它比较两个内存区域`s1`和`s2`的前`n`个字节。 - 返回值:如果两者...

    字符串操作函数大全(String)

    函数返回:参数说明:dest-目的字符串,src-源字符串,maxlen-连接的字符个数。 字符串比较 在字符串操作中,字符串比较是非常重要的一种操作。C 语言提供了字符串比较函数,例如 strcmp 等。 strcmp 函数 ...

    VC中的字符串处理类(静态库形式)

    这是我用VC写的一个字符串处理类,模仿了很多VB中字符串处理的过程,所以我命名为VBString类。在这个类里主要是以处理char指针类型为主的,当然也支持WCHAR,不过只是普通的将char * 转换出来或放进去而已,具体的...

    C语言json字符串的生成与解析

    以下是对C语言中JSON字符串生成与解析的详细说明: 1. JSON数据格式: JSON是一种基于文本的格式,它使用键值对来表示数据,类似于JavaScript的对象字面量。基本结构包括对象(键值对的集合,用花括号{}包围)和数...

    字符串与或非判断类VC

    在给定的"字符串与或非判断类VC"主题中,我们关注的是如何在一个主字符串中进行特定子字符串的判断,包括是否存在、并行条件以及否定条件的检查。这个场景通常涉及到字符串搜索算法和逻辑运算的应用。以下是对这些...

    VC 格式化字符串一例.rar

    在标题提到的“VC 格式化字符串一例.rar”压缩包中,包含了一个实例代码,用于演示如何将字符串转换为指数形式和小数形式。下面将详细介绍这两种字符串格式化的实现方式。 首先,我们来看如何将字符串转换为指数...

    Java数组、向量与字符串

    在Java编程语言中,数组、向量和字符串是基础且重要的数据结构,它们在各种应用场景中扮演着不可或缺的角色。下面将分别对这三个概念进行详细解释,并结合提供的代码示例进行说明。 1. **Java数组** 数组是存储...

    C++字符串完全指南.doc

    《C++字符串完全指南》是深入理解C++中字符串处理的关键资源。本文将详细解析其中的重要知识点,旨在帮助读者全面掌握字符串的运用。 第一部分:字符串基础部分 21.1. 前言 这部分引入了C++中字符串处理的基础概念...

    vc 源码 md5字符串加密算法 绝对可以用的 vc6.0 vs2010 通过

    4. **结果整合**:所有数据块处理完后,将四个中间变量转换成32位的十六进制字符串,这就是MD5的摘要值。 在VC6.0和VS2010中,这个MD5实现应该兼容这两种不同的编译环境。`vc`指Visual C++,它是微软开发的C++集成...

    VC/C++ 字符编码格式转换

    LPSTR lpMultiByteStr, // 输出的多字节字符串缓冲区 int cbMultiByte, // 多字节字符串缓冲区大小 LPCSTR lpDefaultChar, // 如果转换失败,用此默认字符填充 LPBOOL lpUsedDefaultChar // 指示是否使用了默认...

    vc.zip_VC 字符_Vc_c++小程序代码

    C++提供了标准库std::string来处理字符串,并有各种字符操作函数,如std::strlen、std::strcpy、std::strcmp等,用于字符串的长度计算、复制和比较。此外,C++中的字符数组和字符指针也是处理字符数据的重要工具。 ...

    一个计算十六进制字符串BCC的工具(附VC6源码)

    标题中的“一个计算十六进制字符串BCC的工具”指的是一个软件程序,它的主要功能是处理十六进制字符串,并执行特定的BCC(Byte Checksum)计算。BCC,即字节校验和,是一种简单的错误检测方法,常用于通信协议和数据...

Global site tag (gtag.js) - Google Analytics