文件编码 ANSI、GBK、GB2312、MS936、MS932、SJIS、Windows-31 、EUC-JP 、EBCDIC 等等之间的区别与联系_sun0322的博客-程序员秘密

技术标签: 算法  windows 配置,服务器配置  c语言  # 编码  windows  开发语言  

文件编码 ANSI、GBK、GB2312、MS936、MS932、SJIS、Windows-31 、EUC-JP 、EBCDIC 等等之间的区别与联系_sun0322的博客-程序员秘密_sjis编码格式

目录

■前言

■分步说明

■分步说明1

■分步说明2

●GB2312与GBK的区别

●MS932,SJIS(SHIFT JIS),Windows-31J,Cp943 之间的关系

●windows-31J

●SJIS(SHIFT JIS) ,chcp 932

●Cp943

■分步说明3

■分步说明4

■知识扩展

■UTF-8 编码原理

UTF-8用1到4个字节编码Unicode字符。

单字节

多字节

java代码解析

■更多编码 IOS-8859-1等


■前言

暂且不谈 UTF-8,Unicode (UTF-8只是Unicode字符集的一种编码实现方式)

Unicode字符集
国际化组织制定的,为各种语言的每一个字符制定了统一的并且是唯一的数学编号。

( 格式 :U+xxxx,格式里的 xxxx 代表四到六个十六进制的数。)

Unicode字符集有多种编码方式:Unicode,UTF-8,UTF-16,UTF-32,UnicodeLittle, UnicodeBig 等。
编码方式(Unicode):使用2个字节为每个字符编码。
编码方式(UTF-8)使用1到6个字节为每个字符编码。 128 个 ASCII 字符只需一个字节编码;如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节,而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。

・UTF-8编码,一个汉字(包括中文形式下的符号)一般是3个字节,
一个英文(包括英文下的符号)1个字节,一个数字1个字节;

・GBK和GB2312编码,一个汉字(包括中文形式下的符号)是2个字节,
一个英文(包括英文下的符号)1个字节,一个数字1个字节;

・Unicode编码一个汉字(包括中文形式下的符号)和
一个英文(包括英文下的符号)一个数字都是2个字节;

(Java 中的 char , 就是采用 Unicode 来存储字符的。)

win10 以 十六进制 形式(方式) 查看文件 内容_sun0322-程序员秘密  ← win10下,以十六进制形式查看文件

关于文件编码的描述,有很多种描述方式

中文:ANSI,GBK,GB2312, MS936

日文:ANSI, MS932,SJIS(SHIFT JIS),Windows-31J,EUC-JP,ISO-2022-JP,Cp943

英文:ANSI, ASCII,MS437

还有IBM 大机 Mainframe : EBCDIC

         (EBCDIC有好多种编码:1140,500,20290 )

■分步说明

■分步说明1

先理解什么是 ANSI 

我们使用记事本保存文件时,都有这么一个选项。

不论你的系统时中文系统,或者日文系统。

ANSI 是 的缩写 (美国国家标准学会(American National Standards Institute: ANSI))

ANSI是一种字符代码,为使计算机支持更多语言,

通常使用 0x00~0x7f 范围的1 个字节来表示 1 个英文字符。

超出此范围的使用0x80~0xFFFF来编码

不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。

也就是说,

 ・在中文系统中,使用ANSI保存,编码集是 GBK(MS936)

 ・在日文系统中,使用ANSI保存,编码集是 Shift_JIS(MS932)

即,对于不同语言来说,ANSI对应的编码是不同的   !!!

ANSI(一种字符代码)_百度百科 ← ANSI 百度百科

ANSI是什么编码? - malecrab - 博客园 ← 什么时ANSI编码 各个国家语言的ANSI编码

ANSI对应的是 cmd 命令行中 chcp 的编码code。

windows中,页面编码集一览 (chcp code)_sun0322-程序员秘密 ← 各个语言的,页面编码一览 chcp一览

这也是,为社么有的文件,我们使用chcp后,再次查看,就不再乱码的原因

■分步说明2

●GB2312与GBK的区别

・GB2312 :前面的一个字节(高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样就可以组合出大约7000多个简体汉字了
・GBK: 不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,
            GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。

---  比如下面的【天】,GB2312 编码表中查得,可以看到编码表,低字节 从A1 开始

GBK编码表_sun0322-程序员秘密_gbk码表 ← GB2312 编码表

天 

CC EC

---

编码格式简介(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)_ldanduo的专栏-程序员秘密_ansi gb2312区别 ← 此文章中,记述了GB2312 与 GBK 的区别

●MS932,SJIS(SHIFT JIS),Windows-31J,Cp943 之间的关系

●windows-31J

Shift_JIS 的文字集合基本是按照JIS X 0208规定的。
但实际上各个厂商各自进行扩展,包含了大量重复的、规格以外的文字。
因此Windows在本来的 Shift_JIS的文字集合之外,又增加了NEC扩展、IBM扩展所包含的文字。
这种规格和实际情况的分歧长期存在,随着windows-31J的规格化,混乱情况有所改善。

https://www.iteye.com/blog/gohands-937775 ← Shift_JIS、EUC-JP、ISO-2022-JP这三种编码的区别

对于 Shift-JIS 编码的理解 (win10中 查看 Shift-JIS 编码 コード)_sun0322-程序员秘密_shift-jis  ← 个人对Shift_JIS 的理解

http://una.soragoto.net/topics/13.html ← 此文章中,记述了Shift-JIS的发展 (日文原文)

---

●SJIS(SHIFT JIS) ,chcp 932

    windows中,页面编码集一览 (chcp code)_sun0322-程序员秘密 ← 各个语言的,页面编码一览 chcp一览
・它被命名为答Shift_JIS的原因,是它在放置全角字符时,要避开原本在0xA1-0xDF放置的半角假名字符。
・在微软及IBM的日语电脑系统中,即使用了这个编码表。这个编码表称为CP932。

 文字コード表 シフトJIS(Shift_JIS)  ← SJIS编码集

---

●Cp943

ibm java 编码_关于Java中编码的问题_朕说的博客-程序员秘密

IBM OS/2 Japanese, superset of Cp932 and Shift-JIS

■分步说明3

●SJIS以外的日文编码 

・EUC-JP是被Linux和Solaris广泛地使用的文字编码。 chcp 20932

     windows中,页面编码集一览 (chcp code)_sun0322-程序员秘密  ← 各个语言的,页面编码一览 chcp一览
・ISO-2022-JP主要被Email使用的文字编码。 只使用7个bit,第8个bit不使用,所以不适合程序中的字符串处理,主要使用在网络中的数据交换中。

■分步说明4

EBCDIC

IBM 大机的编码语言 

   诞生于 1963 - 1964

早于 ASCII 编码,与ASCII是不同的编码,(英文数字对应的二进制是不相同的)

           ASCII 诞生于 1967, 最后一次修正在1986年

EBCDIC、ASCII与EBCDIC的关系及相互转化_司马懿的西山居-程序员秘密_ebcdic码

chcp 500

chcp 20290

 windows中,页面编码集一览 (chcp code)_sun0322-程序员秘密  ← 各个语言的,页面编码一览 chcp一览

■知识扩展

・Solaris 是Sun Microsystems研发的计算机操作系统。它被认为是UNIX操作系统的衍生版本之一

Solaris [soʊˈlɛrɪs]  当然,sun被oracle收购后,已经是oracle的东西了。

・6个Unix的变种 

linux与UNIX(solaris/aix/hp-ux)的比较-天鹰cool-ChinaUnix博客  ← linux与UNIX(solaris/aix/hp-ux)的比较

===

SGI Irix、
IBM AIX、
Compaq Tru64 Unix、
Hewlett-Packard HP-UX、
SCO UnixWare、
Sun Solaris

===

・linux不是Unix,Unix是商业软件,Linux是开源的

初次安装Linux(Ubuntu)(ssh,ftp服务安装)_sun0322-程序员秘密  ← Linux Unix之间的区别

■UTF-8 编码原理

UTF-8用1到4个字节编码Unicode字符。

单字节

对于单字节,字节第一位是0,后面7位为这个符号的unicode码。因此对于英语字母,
UTF-8编码和ASCII码是相同的。
例如:
   「h」的编码是1101000
   注意这里是7位,完整的应该是01101000


多字节

对于多字节,
   第一个字节:前n位都设为1,第n+1位设为0
   后面字节的前两位一律设为10。

   剩下的没有提及的二进制位,全部为这个符号的unicode码。

例如:"你"的编码是

===

11100100 10111101 10100000

第一个字节前面有三个1,代表是由三个字节编码。后面两个字节的前两位为10

===

java代码解析

package com.sxz.test;

public class CharUTF8 {

	public static void main(String[] args) {
		String fileEncoding = System.getProperty("file.encoding");
		System.out.println(fileEncoding); // UTF-8
		byte[] bytes = "你".getBytes();
		for (byte b : bytes) {
			System.out.println(b);
			System.out.println(Integer.toBinaryString(b & 0xFF));
		}
		
		System.out.println("=====");
		Character unicodeChar = '你';
		System.out.println(Integer.toBinaryString(unicodeChar));
		
	}

}

===

UTF-8
-28
11100100
-67
10111101
-96
10100000
=====
100111101100000

===========================

UTF-8
-28
11100100
-67
10111101
-96
10100000
=====
100111101100000
===========================

更多编码 IOS-8859-1等

1.ASCLL码
ASCLL码共有128个,用一个字节(byte)的低七位表示,0到31是控制字符如换行、回车、删除等,32到126是打印字符,可以通过键盘输入并且能够显示出来。

2.ISO-8859-1
128个字符显然是不够用的,于是ISO组织在ASCII码基础上又制定了一系列标准用来扩展ASCII编码,它们是ISO-8859-1~ISO-8859-15,其中ISO-8859-1涵盖了大多数西欧语言字符,所以应用得最广泛。ISO-8859-1仍然是单字节编码,它总共能表示256个字符。

3.GB2312
全称是《信息交换用汉字编码字符集基本集》,它是双字节编码,总的编码范围是A1~F7,其中从A1~A9是符号区,总共包含682个符号,从B0~F7是汉字区,包含6763个汉字。

4.GBK
全称叫《汉字内码扩展规范》,是国家技术监督局为Windows 95所制定的新的汉字内码规范,它的出现是为了扩展GB2312,加入更多的汉字,它的编码范围是8140~FEFE(去掉XX7F),总共有23940个码位,它能表示21003个汉字,它的编码是和GB2312兼容的,也就是说用GB2312编码的汉字可以用GBK来解码,并且不会有乱码。

5.GB18030
全称是《信息交换用汉字编码字符集》,是我国的强制标准,它可能是单字节、双字节或者四字节编码,它的编码与GB2312编码兼容,虽然是国家标准,但是实际应用系统中使用得并不广泛。

===

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sxzlc/article/details/106203495

智能推荐

电子商务笔记_aoxiangguanjun的博客-程序员秘密

电子商务笔记 (一)1,电子商务(Electronic Commerce,简称EC),它是指在全球各地广泛的商业贸易活动中,在因特网开放的网络环境下,基于浏览器/服务器应用方式,买卖双方不谋面地进行各种商贸活动,实现消费者的网上购物、商户之间的网上交易和在线电子支付以及各种商务活动、交易活动、金融活动和相关的综合服务活动的一种新型的商业运营模式。(电子是手段,商务是目的)2,...

判断浮点数溢出的方法_如何判断浮点数计算溢出_(涉及版权请私聊我,立马删)的博客-程序员秘密

出处:http://blog.csdn.net/delphiwcdj/article/details/6261931方法1:判断是否溢出,一是使用函数判断,二是与最大最小值比较#include #include #include int main(){// double类型double dval1 = 1.2;double dval2 = 1.2*p

AWD-----监控&不死马&垃圾包&资源库_awd不死马_暮w光的博客-程序员秘密

1.知识:AWD规则:2.防守-----流量监控-----实时获取访问数据包流量利用 WEB 访问监控配合文件监控能实现 WEB 攻击分析及后门清除操作,确保写入后门操作失效,也能确保分析到无后门攻击漏洞的数据包便于后期利用分析有后门或无后门的攻击行为数据包找到漏洞进行修复分析到成功攻击的数据包进行自我利用,用来攻击其他队伍安恒的awf部署比较麻烦,比赛时系统日志不太好用,因此用日志分析监控的脚本好,可以实时生成日志。推荐项目:AWD_Hunter-master3.攻击-----

TCP的三次握手和四次挥手 跟图详细解释_AllardZhao的博客-程序员秘密

1.TCP三次握手过程 TCP三次握手,状态转换。用 wireshark 抓包更直观。 记住重要两点,第一状态转换,第二就是发包的内容。SYN 同步标志位,SYN_SENT同步已发送状态ACK 确认标志位,SYN_RECV 同步收到状态ESTABLISHED 已建立连接状态 CLOSED 关闭状态 LISTEH 收听状态TCP连接的建...

PAT 甲级 1138 Postorder Traversal (25 分)_Yuhan の Blog的博客-程序员秘密

思路:根据两个序列遍历这颗树,有左子树就遍历左子树,没有左子树就遍历右子树,找到的第一个叶子结点即题目所求的结点;代码:#include<iostream>#include<vector>#include<unordered_map>using namespace std;vector<int> order[2];unordered_...

Go语言数组及遍历_go遍历数组_深漂小码哥的博客-程序员秘密

package mainimport "fmt"func main() { // 二维数组 var arr [4][6]int arr[1][2] = 1 arr[2][1] = 2 arr[2][3] = 3 fmt.Println(arr) // 遍历二维数组 for for i := 0; i < 4; i++ { for j := 0; j < 6; j++ { fmt.Print(arr[i][j], " ") } fmt.Println(.

随便推点

SpringBoot_集成Shiro后获取当前用户_dongchan1847的博客-程序员秘密

//SecurityUtils.getSubject().getPrincipal(); 就可以获取了protected User getCurrentUser(){ return (User) SecurityUtils.getSubject().getPrincipal();}转载于:https://www.cnblogs.com/Amos-Turing/p/872516...

华三 h3c Vlan静态路由_华三交换机查看静态路由_余为安的博客-程序员秘密

Vlan静态路由 先把基本的配置配完,按照图上的标识,把端口划入到对应的vlan中去,此时注意如果要配置交换机端口的IP地址,有俩种方法,第一种就是我这种方法,把端口加入到vlan中去,然后配置vlan的ip地址,第二种就是把端口类型改为三层接口,命令为:[SWC]int g 1/0/24[SWC-GigabitEthernet1/0/24]port link-mode route[SWC-GigabitEthernet1/0/24]ip address 1.1.1.1 24...

vue中格式化json数据输出到html中_仙女爱吃鱼的博客-程序员秘密

格式化json数据输出到html中最近在整理公司的hybrid协议和demo,其中有一个代码展示,因为是直接把在js部分的代码通过vue填到了html中,所以格式全变了,然后就开始尝试 格式化json,写了很多方法,也百度了很多,那些方法使用document.write()输出就是想要的格式,但一使用vue的filter返回就不管用,最后偶然发现了一个超级nb的属性:white-space: p...

用非递归来实现归并排序_非递归利用栈实现归并排序_Wmx-98的博客-程序员秘密

文章目录一、原理二、代码实现1.实现代码2.main函数部分验证总结使用非递归来实现归并排序一、原理 使用一个栈,来模拟递归的过程 本质:二叉树的非递归先序遍历: 创建一个栈根节点入栈 取栈顶元素访问元素右子树入栈左子树入栈二、代码实现代码如下(示例):1.实现代码//使用非递归来实现快速排序 public static void quickSortByLoop(int[] arr){ //1.创建一个栈,栈里面存放要去处理的区间 .

推荐文章

热门文章

相关标签