C#和VC++字符集和编码
C#
char 关键字用于声明 .NET framework 使用 Unicode 字符表示 System.Char 结构的实例。 Char 对象的值是 16 位数字 (序号值。)将字符表示为 UTF-16 代码单位。
Unicode 字符在世界上表示大多数书面语言。
|
类型 |
范围 |
大小 |
.NET Framework 类型 |
|---|---|---|---|
|
char |
U+0000 到 U+FFFF |
16 位 Unicode 字符 |
char 可以隐式转换为 ushort、int、uint、long、ulong、float、double 或 decimal。 但是,不存在从其他类型到 char 类型的隐式转换。
string 类型表示一个字符序列(零个或更多 Unicode 字符)。 string 是 .NET Framework 中 String 的别名。
代码文件.cs默认是用系统编码GBK保存的。可以通过设置更改。
VC++的字符转换之CP_ACP和CP_OEMCP
http://blog.sina.com.cn/s/blog_53c1950a010158mw.html
Windows API函数MultiByteToWideChar用于多字节编码字符串向宽字符串(即UTF-16 LE)的转码。它的第一个参数的常用值是CP_ACP和CP_OEMCP。这到底指的是什么代码页呢? 我编了小程序做了实验。
CP_ACP和CP_OEMCP,分别是指当前计算机上的Windows操作系统的Windows代码页与OEM代码页。对于东亚的简体中文、繁体中文、日文、韩文等Win操作系统语言环境,这两种代码页是同一个,如简体中文是代码页936即GB2312字符集,繁体中文是950即大五码字符集,韩文是949、日文是932。对于西方国家的拼音文字语言设置,两个代码页不同。典型的如English_US,其Windows代码页是1252、OEM代码页是437,还有第三个代码页ISO-8859-1又称Latin-1或“西欧语言”,是针对英语法语西语德语等西欧语言的扩展ASCII字符集。这三者(1252、437、8859-1)都是针对英语但并不相同。
为什么会有Windows代码页与OEM代码页的区别呢?因为在八十年代DOS系统时期,还是“字符终端”的屏幕只能够显示的256个字符,这些字符的字形的点阵信息存储在硬件的ROM中。DOS操作系统通过系统中断调用驱动程序把这些字形读出来写入显存。这是由OEM负责字符集中有哪些字符,显示时为什么字形的时代,而且一台PC上只有这么一套字符集/字形,没得选,除非你再差一个带字库的“汉卡”。进入了微软的Windows操作系统时代之后,由于硬件的发展,操作系统有了自己的字形文件,绘制字符时不再真地去读ROM,而是用字形文件(就是字体fonts文件)来把字符的形状写入显存。可以选择用哪种字形:如有衬线的Times NewRome,还是无衬线的Sans Serif。操作系统默认使用的字符集,就由微软来定义了,如English_US使用Codepage1252;简体中文使用Codepage936(即国标2312). 至于那个OEM436,就是legacy,用于向后兼容。
综上,就这么点事。CP_ACP和CP_OEMCP,分别是UINT的0和1。在WinNls.h中的注释说明分别是“default to ANSI code page”,“default to OEM code page”。所以,在简体中文Windows,这两个宏表示的都是代码页936.
下述程序代码片段用于测试
UINT codepage=936;
char str[]="我们中国"; //这个char[]必然是多字节编码字符串
DWORD len;
// 得到我们要转换的MyString为UNICODE所需要的UNICODE缓冲区的长度
len = MultiByteToWideChar(codepage, 0, str, -1, 0, 0);
wchar_t *buf=new wchar_t[len+10];
MultiByteToWideChar(codepage, 0, str, -1, buf, len);
setlocale(LC_CTYPE,"");//把当前locale字符环境从C/C++缺省的"C"设置,改为操作系统的设置(即代码页936)
wprintf(L"%s",buf); //因为这个C标准库函数的实现,是把宽字符输入又转化为多字节字符去显示,所以必须正确设置当前操作系统的多字节编码的代码页
结果:
1. 输入是char str[]="我们中国"; UINT codepage=936或者54936(这是GB18030代码页)或者CP_ACP或者CP_OEMCP,都能正确打印出结果“我们中国”。
2. 输入是char str[]="иい瓣"; UINT codepage=950; 也能正确把上述大五码字符串打印出宽字符串输出结果“我们中国”。
3. 输入是char str[]="鎴戜滑涓浗 "; UINT codepage=65001; 也能正确把上述UTF-8字符串打印出宽字符串输出结果“我们中国”。
附录:
一个在线GB/BIG5/UTF-8/UNICODE转码的网站http://www.dheart.net/bmzh/index.php
ps. 实际上,简体中文Windows系统的默认代码页936,不是只有6763个汉字的GB2316,正确说法是自1995年Windows95起,代码页936是GBK字符集,包含了20902个汉字。此前,代码页936与GB2316是一样的。GB2316 >> GBK >> GB18030 是向后兼容的。所以编程角度把这三者视作等同,也凑合啦。
windows的CP_ACP代码页与CP_OEMCP代码页区别
代码页是字符集编码的别名,也称“内码表”,是特定语言的字符集的一张表。
代码页分为两种:一种是ANSI代码页;另一种是OEM代码页。
⑴OEM代码页主要是用于Windows系统中的命令行界面(Console)程序,虚拟Dos。
⑵ANSI代码页主要是用于Windows系统中本地编码不是Unicode的图形用户界面(Gui)程序。
procedure TForm9.BitBtn3Click(Sender: TObject);
var
cpInfoEx:TcpInfoEx;
begin
//GetACP:获取当前系统的ANSI代码页;
//具体可以对照一下:开始è程序è运行,CMDè输入CHCP;
Windows.GetCPInfoEx(Windows.GetACP,0,cpInfoEx);
Memo2.Lines.Add(SysUtils.Format('ANSI Code Page:%s',[cpInfoEx.CodePageName]));
//GetOEMCP:获取当前系统的OEM代码页;
Windows.GetCPInfoEx(Windows.GetOEMCP,0,cpInfoEx);
Memo2.Lines.Add(SysUtils.Format('OEM Code Page:%s',[cpInfoEx.CodePageName]));
//结论:对于中文操作系统来讲,ANSI代码页跟OEM代码页都是936(ANSI/OEM - 简体中文GBK);
end;
//附图:

GetACP (http://www.programfan.com/doc/vbapi/GetACP.htm)
VB声明:Declare Function GetACP Lib "kernel32" Alias "GetACP" () As Long
说明:判断目前正在生效的ANSI代码页返回值Long,目前活动ANSI代码页的标识符。针对一种特定的语言,可能存在多个这样的代码页。
可能的代码页包括下面这些:
874 泰语
932日语
936中文(简体)
949朝鲜语
950中文(台湾和香港繁体)
1200Unicode
1250东欧语言
1251西里尔语
1252美国和西欧语言
1253希腊语
1254土耳其语
1255希伯来语
1256阿拉伯语
1257波罗的语注解
不要混淆ANSI代码页与OEM代码页的概念!ANSI代码页为不同版本的windows定义标准的ANSI 8位字符集。而OEM代码页指定基础DOS代码页,由系统及键盘使用
GetOEMCP(http://www.programfan.com/doc/vbapi/GetOEMCP.htm)
VB声明:Declare Function GetOEMCP Lib "kernel32" Alias "GetOEMCP" () As Long
说明:判断在OEM和ANSI字符集间转换的windows代码页返回值Long,目前处于活动状态的OEM代码页的标识符。针对一种特定的语言,可能存在多个代码页。
以下是可用代码页列表
437默认:美国
708-720阿拉伯代码页
737希腊775波罗的
850国际
852Slavic
855西里尔语
857土耳其语
860葡萄牙语
861冰岛语
862希伯来语
863加拿大法语
864阿拉伯语
865挪威/丹麦语
866俄语
874泰语
932日语
936中文(简体)
949朝鲜语
950中文(台、港繁体)
1361朝鲜语
C#和VC++字符集和编码的更多相关文章
- WEB开发中的字符集和编码
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- Ruby:字符集和编码学习总结
背景 Ruby直到1.9版本才很好的支持了多字节编码,本文简单总结了今天学习的关于Ruby编码方面的知识. 字符串可以使用不同的编码 在.NET中字符串的编码是一致的,Ruby允许字符串有不同的编码, ...
- .NET:字符集和编码学习总结
背景 一直没有深入的学习字符集和编码的知识(现在也没有深入),今天查阅了一些资料,弄明白了一些事情,本文就简单记录一下. 字符集和编码 字符集是指一些符号组成的集合,编码是对指定字符集如何表示为字节的 ...
- java中的字符集和编码
前言 上次对计算机中的“字符集”和“编码”分别进行了总结,并指出二者之间的区别,不要搞混了,不清楚的再回到上一章看一下.今天再总结下java中是如何使用字符集(主要是Unicode字符集,其他常用字符 ...
- Linux字符集和编码
计算机内部,所有信息最终都是一个二进制值形式存放 字符集 字符集:charset是character set的简写,即二进制和字符的对应关系,不关注最终的存储形式 编码 字符集编码:encoding是 ...
- Unicode字符集和编码方式
通常将一个标准中能够表示的所有字符的集合称为字符集,比如ISO/Unicode所定义的字符集为Unicode.在Unicode中,每个字符占据一个码位/Unicode 编号(用4位十六进制数表示,Co ...
- 字符集和编码——Unicode(UTF&UCS)深度历险
计算机网络诞生后,大家慢慢地发现一个问题:一个字节放不下一个字符了!因为需要交流,本地化的文字需要能够被支持. 最初的字符集使用7bit来存储字符,因为那时只需要存下一些英文字母和符号.后来虽然扩展到 ...
- 字符编码和字符集和编码引出的问题_FileReader读取GBK格式的文件
字符编码 计算机中鵆的信息都是用二进制数表示的,而我们在屏幕上看到的数字.英文.标点符号.汉子等字符都是二进制数转换之后的结果.按照某种规则,将字符存储到计算机中,称为编码.反之,将存储在计算机中的二 ...
- 字符集和编码II: fat/msdos/vfat (文件名乱码的问题)
具体到文件名乱码的问题,需要明确两点 第一,文件名作为一个字符串,需要被编码后存入文件系统: 第二,Linux内核无非是个特殊的应用程序,它读取文件名,再把文件名以编码后的形式传递出去. 但Linux ...
随机推荐
- js性能优化的小知识
避免全局查找 function search() { //当我要使用当前页面地址和主机域名 alert(window.location.href + window.location.host); } ...
- poj 2186 tarjan求强连通分量
蕾姐讲过的例题..玩了两天后才想起来做 貌似省赛之后确实变得好懒了...再努力两天就可以去北京玩了! 顺便借这个题记录一下求强连通分量的算法 1 只需要一次dfs 依靠stack来实现的tarjan算 ...
- 《Java核心技术卷二》笔记(三)正则表达式
正则表达式语法 一个正则表达式描述了字符串的构成规则(模式).如果一个具体的字符串正好符合正则表达式描述的这个规则,这个字符串就是与表达式匹配的.先看一下怎么描述这种规则,也就是正则表达式语法.正则表 ...
- 《Pro Git》笔记2:Git基础操作
第二章 Git基础 Git基础包括:版本库的创建和获取,文件添加修改提交等基本操作,状态查询,远程版本库管理和同步,打标签. 1.取得项目的Git版本库 基于Git的工作流要以Git版本库为基础,即可 ...
- Ubuntu 14.04 安装 VirtualBox
参考: ubuntu14.04,安装VirtualBox 5.0(虚拟机软件)! 由于Vagrant工具的需要,安装了一下VirtualBox. 使用参考链接的法一居然在软件中心里面报错,我想可能是没 ...
- [SHELL实例] (转)最牛B的 Linux Shell 命令 (一)
本文编译自commandlinefu.com ( 应该是 Catonmat ) 的系列文章 Top Ten One-Liners from CommandLineFu Explained .作为一个由 ...
- 挑战python
00 热身 http://www.pythonchallenge.com/pc/def/0.html import math print math.pow(2,38); # 274877906944 ...
- regardless of how many processors are devoted to a parallelized execution of this program
https://en.wikipedia.org/wiki/Amdah's_law Amdahl's law is often used in parallel computing to predic ...
- jdbc 日期时间相关的类型
jdbc 日期时间相关的类型 1.sql.Date sql包中的日期类Date是util包中Date类的子类,实际上也是util.Date类的子集.它只处理年月日,而忽略小时和分秒,用以代表SQL的D ...
- 数据库主键跟外键+修改mysql的密码
update myspl.user set password=PASSWORD(设置的密码) where user='root'; 如果修改错误:先执行use mysple;再重复上面的代码. 一. ...