首页 技术 正文
技术 2022年11月18日
0 收藏 833 点赞 4,320 浏览 4339 个字

C#

char 关键字用于声明 .NET framework 使用 Unicode 字符表示 System.Char 结构的实例。 Char 对象的值是 16 位数字 (序号值。)将字符表示为 UTF-16 代码单位。

Unicode 字符在世界上表示大多数书面语言。

类型

范围

大小

.NET Framework 类型

char

U+0000 到 U+FFFF

16 位 Unicode 字符

System.Char

char 可以隐式转换为 ushortintuintlongulongfloatdouble 或 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代码页区别

1、对于CJK(多字节编码)的环境(泰文,日文,韩文,中文),CP_ACP与CP_OEMCP没有区别。2、对于非 CJK(单字节编码)的环境这两个代码页不同1)对应的实际代码页不同,例如English-US的环境,ACP对应1252,OEMCP而437。2)一个字节能表示的数值范围是(0-255),对于小于128的编码,437和1252对应的字符是一样的。3)对于大于128的编码,是不一样的,有可能有些OEM字符(大于128的编码)在437中不存在,有些ASCII(大于128的编码)字符在1252中不存在。4)相同的编码,对应的字符有可能不同。5)同理,相同的字符对应的编码有可能不同。3、windows的文件操作的API默认使用ASCII代码页(即CP_ACP),设备的操作的函数使用OEM代码页(即CP_OEMCP)。结论: 如果与设备没有关系(即不读写设备)那么使用ACP,否则使用OEMCP(注意读写console的函数是对console设备的操作,所以默认使用OEMCP)。文件读写API使用的代码页可以通过调用API来实现在CP_ACP与CP_OEMCP更替的。Console的操作也可以通过API来实现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;
//附图:

 C#和VC++字符集和编码

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朝鲜语

下一篇: box2d.js
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,983
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,500
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,344
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,127
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,761
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,838