.NET:字符集和编码学习总结
背景
一直没有深入的学习字符集和编码的知识(现在也没有深入),今天查阅了一些资料,弄明白了一些事情,本文就简单记录一下。
字符集和编码
字符集是指一些符号组成的集合,编码是对指定字符集如何表示为字节的一种规则,一个字符集可以由多种编码。
参考文章:http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html。
.NET支持多少种编码?默认编码是什么?
测试程序
public static void 打印所有编码规则总数()
{
Console.WriteLine(string.Format("系统支持【{0}】条编码规则。", Encoding.GetEncodings().Count()));
} public static void 打印默认编码规则()
{
Console.WriteLine(string.Format("系统默认编码规则:【{0}】。", Encoding.Default.EncodingName));
}
输出结果

注:系统的默认编码和操作系统的语言环境有关系,我是中文操作系统,所以这里的输出是:GB2312。
.NET中使用何种编码表示字符串?
这个问题和源代码所在的文件的编码没有任何关系,文件的格式只是影响开发期间的编程工作,如:采用ASCII编码的文件不能使用中文变量名。
因为Char的内部表示和Short是一样的,所以不难想象.NET使用的是Unicode的16位编码,让我们测试一下。
测试程序
public static void 语言的字符串采用的编码()
{
Console.WriteLine("\n***" + System.Reflection.MethodInfo.GetCurrentMethod().Name + "***"); string originalString = "hi 段"; Console.WriteLine(
String.Join(
",",
originalString
.SelectMany(x => new byte[] { (byte)(x), (byte)(x >> ) })
.Select(x => Convert.ToString(x, ))
)
); Console.WriteLine(
String.Join(
",",
Encoding.Unicode
.GetBytes(originalString)
.Select(x => Convert.ToString(x, ))
)
); Console.WriteLine(
String.Join(
",",
Encoding.UTF8
.GetBytes(originalString)
.Select(x => Convert.ToString(x, ))
)
); Console.WriteLine(
String.Join(
",",
Encoding.UTF32
.GetBytes(originalString)
.Select(x => Convert.ToString(x, ))
)
);
}
输出结果

一些错误的编码使用场景
编码和解码使用不同的规则
测试代码
public static void 将string转换为byte数组和将byte数组转换为string采用不同的编码规则()
{
Console.WriteLine("\n***" + System.Reflection.MethodInfo.GetCurrentMethod().Name + "***"); string originalString = "Hello Test, 测试!"; byte[] utf8Bytes = Encoding.UTF8.GetBytes(originalString);
string errorString = Encoding.ASCII.GetString(utf8Bytes); Console.WriteLine("原始字符串:【{0}】。", originalString);
Console.WriteLine("用UTF8编码,用ASCII解码后的错误字符串:【{0}】。", errorString);
}
输出结果

使用的编码规则对应的字符集不支持字符串拥有的字符
测试程序
public static void 将string转换为byte数组使用了错误了编码规则()
{
Console.WriteLine("\n***" + System.Reflection.MethodInfo.GetCurrentMethod().Name + "***"); string originalString = "Hello Test, 测试!"; byte[] asciiBytes = Encoding.ASCII.GetBytes(originalString);
string errorString = Encoding.ASCII.GetString(asciiBytes); Console.WriteLine("原始字符串:【{0}】。", originalString);
Console.WriteLine("用ASCII编码,用ASCII解码后的错误字符串:【{0}】,因为字符串中包含非ASCII字符。", errorString);
}
输出结果

ANSI在中文操作系统下原来是GB2212
昨晚以为ANSI是采用ASCII编码,早上经群里的朋友斧正,原来是根据不同的环境会采用不同的编码,中文操作系统多少是GB2312。
测试程序
public static void 读取包含了ANSI字符的ANSI编码文件()
{
Console.WriteLine("\n***" + System.Reflection.MethodInfo.GetCurrentMethod().Name + "***"); var file = @"E:\Coding\HappyStudy\EncodingStudy\EncodingStudy\ANSI.txt";
Console.WriteLine("使用GB2312编码读取的内容:" + File.ReadAllText(file, Encoding.GetEncoding("GB2312")));
}
如何在不同的编码规则之间进行转换呢?
程序中的字符串使用是采用Unicode进行编码的,我们指的编码转换多少是指不同的IO流之间的转换,简单的思路是:
- 将“源流”转换为.NET字符串(Unicode)编码。
- 将.NET字符串以目标编码写入“目标流”。
注:应该有快捷的算法在字节级别直接在两种编码规则之间做映射的,这里没有深究。
能自动识别文件编码吗?
为什么.NET没有提供自动识别文件编码的功能?估计是没法支持,现实确实是没法支持,具体来说是只能支持个别编码的自动识别,原理参考这篇文章:http://blog.csdn.net/lipeijs3/article/details/5062243。
备注
.NET中处理编码还是比较舒服的,改天得看看动态语言是如何处理的,等几天写一篇Ruby相关的编码文章。
.NET:字符集和编码学习总结的更多相关文章
- Ruby:字符集和编码学习总结
背景 Ruby直到1.9版本才很好的支持了多字节编码,本文简单总结了今天学习的关于Ruby编码方面的知识. 字符串可以使用不同的编码 在.NET中字符串的编码是一致的,Ruby允许字符串有不同的编码, ...
- WEB开发中的字符集和编码
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- java中的字符集和编码
前言 上次对计算机中的“字符集”和“编码”分别进行了总结,并指出二者之间的区别,不要搞混了,不清楚的再回到上一章看一下.今天再总结下java中是如何使用字符集(主要是Unicode字符集,其他常用字符 ...
- Linux字符集和编码
计算机内部,所有信息最终都是一个二进制值形式存放 字符集 字符集:charset是character set的简写,即二进制和字符的对应关系,不关注最终的存储形式 编码 字符集编码:encoding是 ...
- C#和VC++字符集和编码
C# char 关键字用于声明 .NET framework 使用 Unicode 字符表示 System.Char 结构的实例. Char 对象的值是 16 位数字 (序号值.)将字符表示为 UTF ...
- Unicode字符集和编码方式
通常将一个标准中能够表示的所有字符的集合称为字符集,比如ISO/Unicode所定义的字符集为Unicode.在Unicode中,每个字符占据一个码位/Unicode 编号(用4位十六进制数表示,Co ...
- 字符集和编码——Unicode(UTF&UCS)深度历险
计算机网络诞生后,大家慢慢地发现一个问题:一个字节放不下一个字符了!因为需要交流,本地化的文字需要能够被支持. 最初的字符集使用7bit来存储字符,因为那时只需要存下一些英文字母和符号.后来虽然扩展到 ...
- 字符编码和字符集和编码引出的问题_FileReader读取GBK格式的文件
字符编码 计算机中鵆的信息都是用二进制数表示的,而我们在屏幕上看到的数字.英文.标点符号.汉子等字符都是二进制数转换之后的结果.按照某种规则,将字符存储到计算机中,称为编码.反之,将存储在计算机中的二 ...
- 字符集和编码II: fat/msdos/vfat (文件名乱码的问题)
具体到文件名乱码的问题,需要明确两点 第一,文件名作为一个字符串,需要被编码后存入文件系统: 第二,Linux内核无非是个特殊的应用程序,它读取文件名,再把文件名以编码后的形式传递出去. 但Linux ...
随机推荐
- hdu 5912(迭代+gcd)
Fraction Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- 双系统卸载linux和装双系统的方法
卸载linux系统: 因为本人装的是windows和Ubuntu,所以引导程序在linux系统里,linux系统可以引导windows系统,而Windows不能引导linux,所以需要修改引导程序,使 ...
- Web开发:URL编码与解码
通常如果一样东西需要编码,说明这样东西并不适合传输.原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义. 例如Url参数字符串中使用key= ...
- 2.4G无线模块NRF2401
RF24L01+,是工作在2.4~2.5GHz 频段的,具备自动重发功能,6 个数据传输通道,最大无线传输速率为2Mbits.MCU 可与该芯片通过SPI 接口访问芯片的寄存器进行配置,达到控制模块. ...
- [翻译]HLS实践
最近公司项目没事做,课余实践研究一下技术,算是积累,也可以用到项目里,从零开始记录 HLS:Http Live Streaming 官方文档 https://developer.apple.com/s ...
- AC日记——松江1843路 洛谷七月月赛
松江1843路 思路: 三分: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define ...
- 使用递归计算n的阶乘n!
计算n! 观察公式2可以直接使用递归求解 C++代码如下: #include <iostream> using namespace std; unsigned func(unsigned ...
- NoSql数据库 设计上面的一些心得
NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 用户信息表,书籍信息表,用户为书籍打分信 ...
- EditText属性描述
android:layout_gravity="center_vertical"//设置控件显示的位置:默认top,这里居中显示,还有bottom android:hint=&qu ...
- ubuntu怎么连接centos远程桌面
1.系统软件设置CentOS端:查看是否安装了vnc软件# rpm -q vnc vnc-serverpackage vnc is not installedvnc-server-4.1.2-14.e ...