.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 ...
随机推荐
- C/C++面试题目一
C/C++开发工程师面试题目(一)(附答案分析) 推荐:自己根据在面试中碰到做过的一些题目以及总结的题目,希望对面试的同学有所帮助. 一. 选择题 1. 下列类中( )不是输入输出流类iostrea ...
- thinkphp5.1使用phpstudy隐藏index.php
apache的重写规则如下: <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine on R ...
- HDU - 4777 离线树状数组
离线树状数组搞一搞. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #de ...
- 使用minikube在windows构建kubernetes群集
只建议在开发环境中使用,不建议在windows下使用docker或者kubernetes. 1. 安装VirtualBox或者Hyper-v(安装步骤略) 2. 下载kubectl和minikube工 ...
- JavaScript最全编码规范
转载: JavaScript最全编码规范 类型 ●基本类型:访问基本类型时,应该直接操作类型值 ●string ●number ●boolean ●null ●undefined var foo = ...
- AngularJS Intellisense in Visual Studio 2012
Recently, a lot of people have asked for Intellisense support for AngularJS in the Visual Studio HTM ...
- Anaconda 安装 OpenCV 遇到的问题
1. 使用 pip install 安装 OpenCV 2. 对于 Ananconda 安装 OpenCV ,通常会遇到无法 import 的情况, 这是由于 anaconda 本身没有遵循 PE ...
- Windows 消息循环(1) - 概览
本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍. 使用 EN5 课件获得更好的阅读体验: [希沃白板5]课件分享 : <Windows培训 - 消息循环> ...
- asp.net core结合Gitlab-CI实现自动化部署
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言 在之前的文章中写过k8s+Jenkins+GitLab-自动化部署asp.net core项目 的topic,这次讲解一 ...
- 使用matplotlib绘图(三)之饼图
# 使用matplotlib绘制饼图 import numpy as np import matplotlib.pyplot as plt # 设置全局字体 plt.rcParams['font.sa ...