目录
●MS932,SJIS(SHIFT JIS),Windows-31J,Cp943 之间的关系
・保存文件时,有Unicode和UTF-8选项,他们保存的文件有什么不同
==
■前言
暂且不谈 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-CSDN博客 ← 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-CSDN博客 ← 各个语言的,页面编码一览 chcp一览
这也是,为社么有的文件,我们使用chcp后,再次查看,就不再乱码的原因
■分步说明2
●GB2312与GBK的区别
・GB2312 :前面的一个字节(高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样就可以组合出大约7000多个简体汉字了
・GBK: 不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,
GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。
--- 比如下面的【天】,GB2312 编码表中查得,可以看到编码表,低字节 从A1 开始
GBK编码表_sun0322-CSDN博客_gbk码表 ← GB2312 编码表
天
CC EC
---
编码格式简介(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)_ldanduo的专栏-CSDN博客_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-CSDN博客_shift-jis ← 个人对Shift_JIS 的理解
http://una.soragoto.net/topics/13.html ← 此文章中,记述了Shift-JIS的发展 (日文原文)
---
●SJIS(SHIFT JIS) ,chcp 932
windows中,页面编码集一览 (chcp code)_sun0322-CSDN博客 ← 各个语言的,页面编码一览 chcp一览
・它被命名为答Shift_JIS的原因,是它在放置全角字符时,要避开原本在0xA1-0xDF放置的半角假名字符。
・在微软及IBM的日语电脑系统中,即使用了这个编码表。这个编码表称为CP932。
文字コード表 シフトJIS(Shift_JIS) ← SJIS编码集
---
●Cp943
ibm java 编码_关于Java中编码的问题_朕说的博客-CSDN博客
IBM OS/2 Japanese, superset of Cp932 and Shift-JIS
■分步说明3
●SJIS以外的日文编码
・EUC-JP是被Linux和Solaris广泛地使用的文字编码。 chcp 20932
windows中,页面编码集一览 (chcp code)_sun0322-CSDN博客 ← 各个语言的,页面编码一览 chcp一览
・ISO-2022-JP主要被Email使用的文字编码。 只使用7个bit,第8个bit不使用,所以不适合程序中的字符串处理,主要使用在网络中的数据交换中。
■分步说明4
EBCDIC
IBM 大机的编码语言
诞生于 1963 - 1964
早于 ASCII 编码,与ASCII是不同的编码,(英文数字对应的二进制是不相同的)
ASCII 诞生于 1967, 最后一次修正在1986年
EBCDIC、ASCII与EBCDIC的关系及相互转化_司马懿的西山居-CSDN博客_ebcdic码
chcp 500
chcp 20290
windows中,页面编码集一览 (chcp code)_sun0322-CSDN博客 ← 各个语言的,页面编码一览 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-CSDN博客 ← 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编码兼容,虽然是国家标准,但是实际应用系统中使用得并不广泛。
===
■比较
・Unicode 和 UTF8 之间的关系
Unicode是一个字符集,定义了每个字符的唯一码点。UTF-8是Unicode的一种编码方式,用来表示Unicode字符。
==
Unicode字符集中的每个字符都被分配了一个唯一的码点,这个码点是一个用16进制表示的数字。例如,字符'A'的Unicode码点是U+0041,字符'中'的码点是U+4E2D。
==
UTF-8编码是一种变长字节编码方式,可以用来将Unicode字符转换成字节序列。UTF-8编码使用1到4个字节来表示不同的字符,其中ASCII字符使用1个字节表示,而其他字符使用多个字节表示。UTF-8编码的好处是可以在保持向后兼容性的同时支持更广泛的字符范围。
==
例如,字符'A'在UTF-8编码中是用一个字节表示的,即0x41。而字符'中'在UTF-8编码中需要使用3个字节表示,即0xE4 0xB8 0xAD。
==
因此,可以说UTF-8是Unicode的一种具体实现方式,它通过将Unicode字符转换成字节序列来实现字符的存储和传输。UTF-8编码使得Unicode字符可以在计算机系统中进行处理,并且具有较好的兼容性和扩展性。
==
・保存文件时,有Unicode和UTF-8选项,他们保存的文件有什么不同
本文前言里面的内容。。。
Unicode和UTF-8都是用于字符编码的标准,但它们有一些不同之处。
==
Unicode是一个字符集,它包含了几乎所有世界上使用的字符。每个字符都被分配一个唯一的编号,称为码点。Unicode字符集包括了ASCII字符集的所有字符,因此所有ASCII字符都是Unicode字符的一部分。当您选择将文件保存为Unicode时,文件将以编码方式存储,以便包含特殊字符,如非拉丁字母、符号和表情符号。
==
UTF-8是Unicode的一种编码方式。它是一种变长编码,即不同的字符使用不同长度的字节来表示。UTF-8编码适用于多种语言,并且可以在一个文件中同时包含ASCII和非ASCII字符。相比Unicode,UTF-8在存储字符时可以更有效地使用空间。也就是说,UTF-8编码的文件通常比Unicode编码的文件更小。
==
当您选择将文件保存为UTF-8时,您可以在许多不同的操作系统和应用程序中进行交互。UTF-8已成为互联网上使用最广泛的字符编码之一,因此,如果您打算与他人分享或共享文件,通常建议将文件保存为UTF-8编码。
・SJIS 是字符集 还是 编码方式
SJIS代表Shift-JIS,是一种字符编码方式,而不是字符集。Shift-JIS是一种针对日文字符的编码方式,它使用单字节和双字节编码来表示不同的字符。Shift-JIS编码最常用于日本操作系统和应用程序中,可以支持包括平假名、片假名和汉字在内的全日文字符范围。然而,需要注意的是Shift-JIS编码并不涵盖整个Unicode字符集,它仅针对特定的字符集。
===
・EUC-JP 编码 和 IBM-943
EUC-JP 和 IBM-943 都是针对日语的字符编码。
===
EUC-JP 是一种变长编码,用于在 Unix 和 Linux 等操作系统上处理日语文本。它支持日语中的汉字、假名和片假名等字符。EUC-JP 编码的范围是 0x00 到 0xFF,其中包括 ASCII 字符和日语字符。EUC-JP 编码的优点是简单、高效,并且在 Unix 和 Linux 等系统上广泛使用。
===
IBM-943 是 IBM 公司开发的日语字符编码,也称为 CP943 或 IBM 日语扩展字符集。它是一种双字节编码,支持日语中的汉字、假名和片假名等字符。IBM-943 编码的范围是 0x81 到 0xFC,其中包括 ASCII 字符和日语字符。IBM-943 编码的优点是适用于 IBM 系统和软件,与 EUC-JP 编码兼容性较好。
===
总的来说,EUC-JP 编码和 IBM-943 编码都是用于处理日语字符的编码,具有各自的优点和适用场景。
・SJIS编码 和 EUC-JP编码的区别
SJIS(Shift-JIS)和EUC-JP(Extended Unix Code-JP)是两种日语编码格式。
===
SJIS是一种双字节编码,它使用1个字节来表示ASCII字符,使用2个字节来表示其他字符。它最初是由日本的日本电气公司和微软共同开发的,并在Windows操作系统中得到广泛使用。
===
EUC-JP也是一种双字节编码,但是它使用了不同的字节分配方式。它使用1个字节来表示ASCII字符,使用2个字节来表示日语汉字和假名等其他字符。它最初是由Unix操作系统开发者开发的。
===
因此,SJIS和EUC-JP的主要区别在于它们用于表示非ASCII字符的方式不同。在实际应用中,两种编码格式都能够正确地表示日语字符,但是在不同的操作系统和应用程序中可能会有一些兼容性问题。
・CP943C和EUC-JP
CP943C和EUC-JP都是亚洲语言编码格式。其中,CP943C是IBM公司开发的,主要用于支持日语和韩语的文字显示和输入。而EUC-JP是由日本电气公司(NEC)和日本电子工业发展协会(JEIDA)共同开发的,主要用于支持日语的文字显示和输入。
====
区别主要在于编码方式和字符集。CP943C采用了双字节编码方式,其中第一字节的高位为0x81至0x9F和0xE0至0xFC,第二字节的高位为0x40至0x7E和0x80至0xFC。字符集包括了JIS X 0208、JIS X 0212和KSC 5601-1987等。而EUC-JP采用了三字节编码方式,其中第一字节的范围为0xA1至0xFE,第二字节的范围为0xA1至0xFE,第三字节的范围为0x21至0x7E和0x80至0xFE。字符集包括了JIS X 0201和JIS X 0208等。
===
总体来说,CP943C和EUC-JP都是用于日语的编码格式,但采用了不同的编码方式和字符集。
・CP943C和IBM-943
CP943C和IBM-943都是日本的字符编码标准,但是它们之间有一些区别。
====
CP943C是日本的EUC编码,最初由NEC公司开发,现已成为JIS X 0212的一部分。它是一种双字节编码,它可以表示日本语中的汉字、平假名、片假名和罗马字符。
====
IBM-943也是一种日本字符编码标准,它是IBM公司开发的。它也是一种双字节编码,它可以表示日本语中的汉字、平假名、片假名和罗马字符。IBM-943与CP943C之间的主要区别在于它们的字符映射表略有不同。IBM-943采用了一些IBM特定的字符编码,而CP943C则更加符合日本国内的标准。
===
・SJIS 和 EUC-JP 编码的区别
===
SJIS(Shift-JIS)和EUC-JP(Extended Unix Code-JP)是两种常用的日语字符编码方案。
字符集范围:
- SJIS:由日本电脑制造商开发,支持日语中的大部分字符,包括假名、汉字、罗马字等。
- EUC-JP:也是由日本开发,与SJIS类似,支持日语字符集,包括假名、汉字、罗马字等。
编码方式:
- SJIS:采用双字节编码方式,每个字符占用2个字节,其中第一个字节的范围是0x81-0x9F和0xE0-0xFC,第二个字节的范围是0x40-0xFC。
- EUC-JP:同样采用双字节编码方式,每个字符也占用2个字节,第一个字节的范围是0xA1-0xFE,第二个字节的范围也是0xA1-0xFE。
兼容性:
- SJIS:在Windows系统中广泛使用,支持大部分的软件和应用程序。
- EUC-JP:在Unix/Linux等操作系统中常用,也有一些应用程序和工具支持该编码。
其他区别:
- SJIS有时会产生字节流冲突的问题,因为某些字符在不同的上下文中有不同的编码,这可能导致乱码或无法正确解码。
- EUC-JP在一些应用中可能会有更好的兼容性和处理效果。
总的来说,SJIS和EUC-JP都是常见的日语字符编码方案,具有相似的字符集支持,但在具体的应用环境和兼容性方面可能有一些差异。选择哪种编码方案应基于具体的需求和应用场景进行判断。
===
例子:日文长音字符【ー】的编码
(图片来源)
Unix_Linux_AIX_常用命令总结_aix与unix_sun0322的博客-CSDN博客
===
echo "ー" | od -t x1
上面命令执行前,指定对应的字符集
java运行结果
java代码
package com.sxz.test;
import java.io.UnsupportedEncodingException;
public class CharUTF8 {
public static void main(String[] args) throws UnsupportedEncodingException {
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));
System.out.println("==============UTF8================");
bytes = "ー".getBytes("UTF-8");
for (byte b : bytes) {
System.out.println(b);
System.out.println(Integer.toBinaryString(b & 0xFF));
}
System.out.println("==============SJIS================");
bytes = "ー".getBytes("SJIS");
for (byte b : bytes) {
System.out.println(b);
System.out.println(Integer.toBinaryString(b & 0xFF));
}
System.out.println("==============EUC-JP================");
bytes = "ー".getBytes("EUC-JP");
for (byte b : bytes) {
System.out.println(b);
System.out.println(Integer.toBinaryString(b & 0xFF));
}
}
}
===
■其他
1.BOM
在某些文本编辑器或应用程序中,当选择使用 Unicode 编码保存文件时,可能会出现一个 BOM 选项。这个选项是用来决定是否在保存文件时添加 BOM(Byte Order Mark)。
===
如果选择勾选了 BOM 选项,则在将 Unicode 文本保存到文件时,会在文件开头添加相应编码的 BOM 字符,用于标识字节顺序及编码方式。这样做的目的是为了帮助其他应用程序或解析器正确地识别和处理文件的编码。
===
如果不选择勾选 BOM 选项,则在保存文件时不会添加 BOM 字符,文件开头直接是文本内容,这样在解析或处理文件时,其他应用程序或解析器需要自行判断文本编码和字节顺序。
总之,BOM 选项在保存 Unicode 文本文件时决定是否在文件开头添加字节顺序标记,以帮助其他应用程序或解析器正确识别文件的编码和字节顺序。
BOM 字符是一个特殊的字符,用于标识 Unicode 编码和字节顺序。具体来说,BOM 字符是一个由特定字节组成的序列,它根据编码不同而有所差异。
在 UTF-8 编码中,BOM 字符由三个字节组成:EF BB BF。 在 UTF-16 编码中,BOM 字符由两个字节组成,分为大端序和小端序:
- 当保存为大端序(Big Endian)时,BOM 字符是FE FF。
- 当保存为小端序(Little Endian)时,BOM 字符是FF FE。
BOM 字符位于文件的开头,在以 Unicode 编码保存的文件中,起到标识该文件编码和字节顺序的作用。应用程序和解析器可以根据 BOM 字符确定文件的编码方式和字节顺序,以正确读取和处理文件内容。
2.什么叫做大端序 和 小端序
大端序(Big Endian)和小端序(Little Endian)是两种不同的字节顺序方式,用于指示在多字节数据中,最低有效字节和最高有效字节的存储顺序。
==
在大端序列中,最高有效字节被存储在最低内存地址上,最低有效字节被存储在最高内存地址上,符合人类阅读的顺序。它类似于将多位整数按照从高位到低位的顺序写下来,例如,十进制数12345在大端序列中被存储为
00 00 48 39
。==
而在小端序列中,最低有效字节被存储在最低内存地址上,最高有效字节被存储在最高内存地址上,与我们平时阅读和写出的顺序相反。它类似于将多位整数按照从低位到高位的顺序写下来,例如,十进制数12345在小端序列中被存储为
39 48 00 00
。==
大端序列和小端序列主要用于计算机系统中处理多字节数据(如整数、浮点数等)的存储和传输。具体使用哪种字节顺序由硬件、操作系统或编程语言决定。
===