VS2010与VS2013中的多字节编码与Unicode编码问题

1. 多字节字符与单字节字符

  char与wchar_t

  我们知道C++基本数据类型中表示字符的有两种:char、wchar_t。

  char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因为它表示一个字时可能是一个字节也可能是多个字节。一个英文字符(如’s’)用一个char(一个字节)表示,一个中文汉字(如’中’)用3个char(三个字节)表示。

  wchar_t被称为宽字符,一个wchar_t占2个字节。之所以叫宽字符是因为所有的字都要用两个字节(即一个wchar_t)来表示,不管是英文还是中文。

  在C++中,一般操作如下:

1. 用常量字符给wchar_t变量赋值时,前面要加L。如: wchar_t wch2 = L’中’;

2. 用常量字符串给wchar_t数组赋值时,前面要加L。如: wchar_t wstr2[3] = L”中国”;

3. 如果不加L,对于英文可以正常,但对于非英文(如中文)会出错。

2. 多字节字符串与宽字节字符串

 std::string与std::wstring

  字符数组可以表示一个字符串,但它是一个定长的字符串,我们在使用之前必须知道这个数组的长度。

  为方便字符串的操作,STL为我们定义好了字符串的类string和wstring。大家对string肯定不陌生,但wstring可能就用的少了。

  string是普通的多字节版本,是基于char的,对char数组进行的一种封装。

  wstring是Unicode版本,是基于wchar_t的,对wchar_t数组进行的一种封装。

3.字符集(Charcater Set)与字符编码(Encoding)

字符集(Charcater Set或Charset):是一个系统支持的所有抽象字符的集合,也就是一系列字符的集合。

  字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

  常见的字符集有:ASCII字符集、GB2312字符集(主要用于处理中文汉字)、GBK字符集(主要用于处理中文汉字)、Unicode字符集等。

字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个字符集(如字母表或音节表),与计算机能识别的二进制数字进行配对。即它能在符号集合与数字系统之间建立对应关系,是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息,而计算机的信息处理系统则是以二进制的数字来存储和处理信息的。字符编码就是将符号转换为计算机能识别的二进制编码。

一般一个字符集等同于一个编码方式,ANSI体系(ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符)的字符集如ASCII、ISO 8859-1、GB2312、GBK等等都是如此。一般我们说一种编码都是针对某一特定的字符集。

一个字符集上也可以有多种编码方式,例如UCS字符集(也是Unicode使用的字符集)上有UTF-8、UTF-16、UTF-32等编码方式。

endl;

时间: 2024-10-07 07:07:34

VS2010与VS2013中的多字节编码与Unicode编码问题的相关文章

Css中常用中文字体的Unicode编码对照

在网页制作中,最常用的恐怕是字体属性了,在调整页面兼容的时候,也常常发现字体名称的原因导致不兼容或乱码,下面给出几种常用字体的ucicode编码对照,方便使用. 宋体 SimSun \5B8B\4F53 黑体 SimHei \9ED1\4F53 微软雅黑 Microsoft YaHei \5FAE\8F6F\96C5\9ED1 微软正黑体 Microsoft JhengHei \5FAE\x8F6F\6B63\9ED1\4F53 新宋体 NSimSun \65B0\5B8B\4F53 新细明体

【ANSI编码和Unicode编码】

最近在对之前的代码进行优化,主要是把界面全部换成GUI形式的(就是市面上的这种),之前进行数据查询的时候没问题,但是换成GUI的时候,由于输入的的是Unicode编码,而处理的时候又强制转换成ANSI编码,经过一番查阅(刚开始还以为强制转换是万能的....),才发现...看来之前还是低估了它~~~ 以下是相关的介绍 常规的ANSI编码(使用""包裹)和Unicode编码(使用L""包裹),这样对应的就有了两套字符串处理函数,比如:strlen和wcslen,分别用于

ASCII编码和Unicode编码

ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节. 字母A用ASCII编码是十进制的65,二进制的01000001: 字符0用ASCII编码是十进制的48,二进制的00110000,注意字符'0'和整数0是不同的: 汉字中已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101. 你可以猜测,如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicod

中文转换成Unicode编码 和 Unicode编码转换为中文

前几天,遇到一个问题,就是在浏览器地址栏传递中文时,出现乱码,考虑了一下,解决方式有很多,我还是采用了转换编码的方式,将中文转换为Unicode编码,然后再解码成中文,以下是实现的过程,非常简单! package cy.code; public class CyEncoder { private String zhStr; //中文字符串 private String unicode;//将中文字符串转换为Unicode编码 存储在这个属性上. public CyEncoder(String z

js字符串编码和unicode编码互转

//字符串编码转为unicode编码function charToUnicode(str) { let temp; let i = 0; let r = ''; let len = str.length; for (; i < len; i++) { temp = str.charCodeAt(i).toString(16); while ( temp.length < 4 ) temp = '0' + temp; r += '\\u' + temp; }; return r; } //uni

SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码

参考文章:微信公众号文章 一直对sql中的left和right有误解,一直以为它是这样的. SELECT Mobile FROM dbo.T_User WHERE Id = 1 执行这样一句: SELECT LEFT(Mobile,2) leftNum FROM dbo.T_User WHERE Id = 1 SELECT RIGHT(Mobile,2) rightNum FROM dbo.T_User WHERE Id = 1 出现的结果是这样的: 而我心中这样认为: 我认为只出现第二个. 运

刨根究底字符编码之八——Unicode编码方案概述

Unicode编码方案概述 1. 前面讲过,随着计算机发展到世界各地,于是各个国家和地区各自为政,搞出了很多既兼容ASCII但又互相不兼容的各种编码方案.这样一来同一个二进制编码就有可能被解释成不同的字符,导致不同的字符集在交换数据时带来极大的不便. 比如大陆和台湾是只相隔150海里.使用着同一种语言的兄弟地区,也分别采用了不同的DBCS双字节字符集编码方案. 以前大陆地区必须装上类似于"UCDOS希望汉字系统"这样的中文处理系统专门来处理简体汉字的显示.输入问题. 而台湾地区由于采用

java 中文转换成Unicode编码和Unicode编码转换成中文

转自:一叶飘舟 http://blog.csdn.net/jdsjlzx/article/details/7058823 package lia.meetlucene; import java.io.IOException; import org.apache.lucene.index.CorruptIndexException; public class Unicode { public static void main(String[] args) throws CorruptIndexEx

VS2010,VS2012,VS2013中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法

在VS2013开发环境下,C#引用COM组件遇到的两个问题: 一开始是COM组件没有注册导致代码引用报错,那么我就使用管理员的命令行方式下,入册COM组件: C:\WINDOWS\system32>regsvr32 E:\CjnDesEncrypt.dll ,执行完该命令,代码引用不报错了,但是生成过程中又报如下错误: 在引用COM组件的时候,出现了无法嵌入互操作类型“……”,请改用适用的接口的错误提示. 查阅资料,找到解决方案,记录如下: 选中项目中引入的dll,鼠标右键,选择属性,把“嵌入互