.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 ...
随机推荐
- ceph存储池基本管理
一,设置默认存储池的pg或pgp的值(推荐100左右),在ceph.conf文件里增加: osd pool default pg num = osd pool default pgp num = 二, ...
- Base Class 慎用箭头函数
在项目中,child继承base的时候,需要重新修改base.fun的逻辑,但是有些情况下面并不是简单的覆盖,而是在base.fun的逻辑基础上进行加工处理. 刚开始接触es6的时候也许都遇到过,ch ...
- day4迭代器&生成器&正则表达式
一.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不能后退,不过这也没什么,因为人们很少在迭代途中后退.另外,迭代器的一大优点 ...
- 超简教程:Xgboost在Window上的安装(免编译)
Xboost在windows安装需要自己编译,编译的过程比较麻烦,而且需要复杂的软件环境.为了免去编译,我这里把编译好的文件上传到网盘供大家下载安装.有了编译好的文件,xgboost的安装变得超级简单 ...
- poj2243 Knight Moves(BFS)
题目链接 http://poj.org/problem?id=2243 题意 输入8*8国际象棋棋盘上的两颗棋子(a~h表示列,1~8表示行),求马从一颗棋子跳到另一颗棋子需要的最短路径. 思路 使用 ...
- 基于Ubuntu系统搭建以太坊go-ethereum源码的开发环境
第一.先安装geth的CLI环境sudo apt-get install geth,这个很重要 第二.下载源代码 git clone https://github.com/ethereum/go-et ...
- [转]SharePoint 2010 Powershell Feature Cmdlets
In this installment its time to look at the various cmdlets that have to do with Features. Of course ...
- Python 函数系列 - Str对path的处理
由此可见,“\”是转义字符,它能够将第2个“\”从转义字符转回普通字符,从而“\n”就不再起到换行符的作用. 这样操作虽然简单,但是遇到下方这个路径,看起来就会有些麻烦! path = 'D:\new ...
- Redis学习篇(十)之排序
SORT 按照键值从小到大或者从大到小的顺序进行排序 对数字进行排序 语法:SORT key [DESC] 默认情况下,是升序排序,可以指定DESC进行降序排序 对字母进行排序 语法:SORT key ...
- CF617/E XOR and Favorite Number
题目链接:http://codeforces.com/contest/617/problem/E 题意:给出一个长度为n(1e5)的序列,有m(1e5)次操作,每次操作选择一个L-R区间,然后输出符合 ...