【ANSI编码和Unicode编码】

最近在对之前的代码进行优化,主要是把界面全部换成GUI形式的(就是市面上的这种),之前进行数据查询的时候没问题,但是换成GUI的时候,由于输入的的是Unicode编码,而处理的时候又强制转换成ANSI编码,经过一番查阅(刚开始还以为强制转换是万能的....),才发现。。。看来之前还是低估了它~~~

以下是相关的介绍

常规的ANSI编码(使用""包裹)和Unicode编码(使用L""包裹),这样对应的就有了两套字符串处理函数,比如:strlen和wcslen,分别用于处理两种字符串

微软将这两套字符集及其操作进行了统一,通过条件编译(通过_UNICODE和UNICODE宏)控制实际使用的字符集,这样就有了_T("")这样的字符串,对应的就有了_tcslen这样的函数

为了存储这样的通用字符,就有了TCHAR:

当没有定义_UNICODE宏时,TCHAR = char,_tcslen =strlen

当定义了_UNICODE宏时,TCHAR = wchar_t , _tcslen =
wcslen[1]

当我们定义了UNICODE宏,就相当于告诉了编译器:我准备采用UNICODE版本。这个时候,TCHAR就会摇身一变,变成了wchar_t。而未定义UNICODE宏时,TCHAR摇身一变,变成了unsignedchar。这样就可以很好的切换宽窄字符集。

tchar可用于双字节字符串,使程序可以用于中日韩等国 语言文字处理、显示。使编程方法简化。

好,已经知道错误在哪里了。。。接下来就是解决ANSI编码和Unicode编码转换的问题了!!

1.将Unicode转ANSI


TcharToChar (const TCHAR * tchar, char * _char)
{
int iLength ;
//获取字节长度
iLength = WideCharToMultiByte(CP_ACP, 0, tchar, -1, NULL, 0, NULL, NULL);
//将tchar值赋给_char
WideCharToMultiByte(CP_ACP, 0, tchar, -1, _char, iLength, NULL, NULL);
}

2.ANSI转Unicode

CharToTchar (const char * _char, TCHAR * tchar)
{
int iLength ;

iLength = MultiByteToWideChar (CP_ACP, 0, _char, strlen (_char) + 1, NULL, 0) ;
MultiByteToWideChar (CP_ACP, 0, _char, strlen (_char) + 1, tchar, iLength) ;
}

转载请注明出处:http://www.cnblogs.com/Susake/p/3737996.html

时间: 2024-08-04 21:25:13

【ANSI编码和Unicode编码】的相关文章

python中的字符串编码问题——2.理解ASCII码、ANSI码、Unicode编码、UTF-8编码

ASCII码:全名是American Standard Code for Information Interchange,ASCII码中,一个英文字母(不分大小写)占一个字节的空间,范围0x00~0x7f,即0-128. ANSI码:ANSI编码是一种对ASCII码的拓展.ANSI编码用0x00~0x7f 范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示其他语言的其他字符.前126个与ASCII码相同,之后的字符全是某个国家语言的所有字符.容量2的16次

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

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

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

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 出现的结果是这样的: 而我心中这样认为: 我认为只出现第二个. 运

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与VS2013中的多字节编码与Unicode编码问题

1. 多字节字符与单字节字符 char与wchar_t 我们知道C++基本数据类型中表示字符的有两种:char.wchar_t. char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因为它表示一个字时可能是一个字节也可能是多个字节.一个英文字符(如's')用一个char(一个字节)表示,一个中文汉字(如'中')用3个char(三个字节)表示. wchar_t被称为宽字符,一个wchar_t占2个字节.之所以叫宽字符是因为所有的字都要用两个字节(即一个wchar_t)来表示,不管是英

所有的字符编码由System.Text.Encoding类获取所有的字符编码如Unicode编码、 GB18030编码、(UTF-8) 简体中文(GB2312)

本页列出来目前window下所有支持的字符编码  ---通过 System.Text.Encoding.GetEncodings()获取,里面可以对其进行查询,筛选,对同一个字符,在不同编码进行查看和分析... 代码页编号 名称 代码 类型 单字节码位 37 IBM EBCDIC (美国-加拿大) IBM037 SBCSCodePageEncoding 是 437 OEM 美国 IBM437 SBCSCodePageEncoding 是 500 IBM EBCDIC (国际) IBM500 SB