Java语言所使用的字符集是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java语言所使用的字符集是啥?相关的知识,希望对你有一定的参考价值。

  Java语言所使用的字符集是16位Unicode编码。另外再介绍一些常见的字符集:

  1、最早在dos下写pascal的时候,就遇到ASCII字符集,后来还是dos下写c,也是ascii字符集
  特点:目前最通用的单字节编码字符集
  表示:单字节
  最早ascii用7bit表示,总共能表示2^7=128个字符,后来扩展到8bit,就表示2^8=256个字符
  2、GB2312又称为GB2312-80字符集,全称为《信息交换用汉字编码字符集·基本集》,由原中国国家标准总局发布,1981年5月1日实施。
  特点:当然是能表示99%的中国汉字,还包括拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母等
  表示:双字节
  3、GBK是汉字编码标准之一,全称《汉字内码扩展规范》,GBK 向下与GB2312编码兼容,向上支持ISO10646.1国际标准。可以认为GBK是在GB2313基础上通过内码扩展出来的一个标准。
  特点:完全兼容GB2312标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字
  表示:双字节
  4、Big5,台湾那边使用比较多。
  5、GB 18030,全称是GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,是我国政府于2000年3月17日发布的新的汉字编码国家标准,2001年8月31日后在中国市场上发布的软件必须符合本标准。
  特点:就是强大。覆盖中文、日文、朝鲜语和中国少数民族文字。满足中国大陆、香港、台湾、日本和韩国等东亚地区信息交换多文种、大字量、多用途、统一编码格式的要求。并且与Unicode 3.0版本兼容,填补Unicode扩展字符字汇“统一汉字扩展A”的内容。并且与以前的国家字符编码标准(GB2312,GB13000.1)兼容。
  表示:单字节、双字节、四字节三种方式
  6、Unicode野心更大(当然有一个国际统一标准当然是好事)
  特点:Unicode是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
  表示:utf-8,utf-16,utf-32
  这里可能有点不好理解,举个例子
  首先,把unicode理解成对所有字符做了一个统一的编号,比如:“字”这个字符,编号是23383,这个是unicode定义的
  但是,在计算机中,如何存储这个编号呢?方式就有很多,存储unicode的方式,就是utf-8,utf-16,utf-32
  23383数值的16进制表示:0x5b57
  utf-8用3个字节来表示汉字,所以utf-8的表示为:0xE5AD97
  utf-16用2个字节来表示汉字,所以utf-16的表示为:0x5b57 刚好和数值是一样的
  utf-32用4个字节来表示汉字,所以utf-32的表示为:0x00005b57 和数值是一样的,不过浪费空间
  7、再来讲讲utf-8,它是一种变长的字符集
  表示:单字节来表示字母,双字节来表示一些希腊字母,三字节来表示汉字,当然也有四字节的
  这么做当然会增加表示和识别的难度,不过,可以节省空间。这也是为什么utf-8在网络编码中流行的原因。
  
参考技术A Unicode字符集

ASCII 字符集

1.名称的由来

ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于罗马字母表的一套电脑编码系统。

2.特点

它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO 646。

3.包含内容

控制字符:回车键、退格、换行键等。

可显示字符:英文大小写字符、阿拉伯数字和西文符号

4.技术特征

7位(bits)表示一个字符,共128字符

5.ASCII扩展字符集

7位编码的字符集只能支持128个字符,为了表示更多的欧洲常用字符对ASCII进行了扩展,ASCII扩展字符集使用8位(bits)表示一个字符,共256字符。

ASCII扩展字符集比ASCII字符集扩充出来的符号包括表格符号、计算符号、希腊字母和特殊的拉丁符号。

GB2312 字符集

1.名称的由来

GB2312又称为GB2312-80字符集,全称为《信息交换用汉字编码字符集·基本集》,由原中国国家标准总局发布,1981年5月1日实施。

2.特点

GB2312是中国国家标准的简体中文字符集。它所收录的汉字已经覆盖99.75%的使用频率,基本满足了汉字的计算机处理需要。在中国大陆和新加坡获广泛使用。

3.包含内容

GB2312收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符。其中包括6763个汉字,其中一级汉字3755个,二级汉字3008个;包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。

4.技术特征

(1)分区表示:

GB2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。

各区包含的字符如下:01-09区为特殊符号;16-55区为一级汉字,按拼音排序;56-87区为二级汉字,按部首/笔画排序;10-15区及88-94区则未有编码。

(2)双字节表示

两个字节中前面的字节为第一字节,后面的字节为第二字节。习惯上称第一字节为“高字节” ,而称第二字节为“低字节”。

“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。

5.编码举例

以GB2312字符集的第一个汉字“啊”字为例,它的区号16,位号01,则区位码是1601,在大多数计算机程序中,高字节和低字节分别加0xA0得到程序的汉字处理编码0xB0A1。计算公式是:0xB0=0xA0+16, 0xA1=0xA0+1。

BIG5 字符集

1.名称的由来

又称大五码或五大码,1984年由台湾财团法人信息工业策进会和五间软件公司宏碁 (Acer)、神通 (MiTAC)、佳佳、零壹 (Zero One)、大众 (FIC)创立,故称大五码。

Big5码的产生,是因为当时台湾不同厂商各自推出不同的编码,如倚天码、IBM PS55、王安码等,彼此不能兼容;另一方面,台湾政府当时尚未推出官方的汉字编码,而中国大陆的GB2312编码亦未有收录繁体中文字。

2.特点

Big5字符集共收录13,053个中文字,该字符集在中国台湾使用。耐人寻味的是该字符集重复地收录了两个相同的字:“兀”(0xA461及0xC94A)、“嗀”(0xDCD1及0xDDFC)。

3.字符编码方法

Big5码使用了双字节储存方法,以两个字节来编码一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。高位字节的编码范围0xA1-0xF9,低位字节的编码范围0x40-0x7E及0xA1-0xFE。

各编码范围对应的字符类型如下:0xA140-0xA3BF为标点符号、希腊字母及特殊符号,另外于0xA259-0xA261,存放了双音节度量衡单位用字:兙兛兞兝兡兣嗧瓩糎;0xA440-0xC67E为常用汉字,先按笔划再按部首排序;0xC940-0xF9D5为次常用汉字,亦是先按笔划再按部首排序。

4.Big5 的局限性

尽管Big5码内包含一万多个字符,但是没有考虑社会上流通的人名、地名用字、方言用字、化学及生物科等用字,没有包含日文平假名及片假名字母。

例如台湾视“着”为“著”的异体字,故没有收录“着”字。康熙字典中的一些部首用字(如“亠”、“疒”、“辵”、“癶”等)、常见的人名用字(如“堃”、“煊”、“栢”、“喆”等) 也没有收录到Big5之中。

GB18030 字符集

1.名称的由来

GB 18030的全称是GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,是我国政府于2000年3月17日发布的新的汉字编码国家标准,2001年8月31日后在中国市场上发布的软件必须符合本标准

2.特点

GB 18030字符集标准的出台经过广泛参与和论证,来自国内外知名信息技术行业的公司,信息产业部和原国家质量技术监督局联合实施。

GB 18030字符集标准解决汉字、日文假名、朝鲜语和中国少数民族文字组成的大字符集计算机编码问题。该标准的字符总编码空间超过150万个编码位,收录了27484个汉字,覆盖中文、日文、朝鲜语和中国少数民族文字。满足中国大陆、香港、台湾、日本和韩国等东亚地区信息交换多文种、大字量、多用途、统一编码格式的要求。并且与Unicode 3.0版本兼容,填补Unicode扩展字符字汇“统一汉字扩展A”的内容。并且与以前的国家字符编码标准(GB2312,GB13000.1)兼容。

3.编码方法

GB 18030标准采用单字节、双字节和四字节三种方式对字符编码。单字节部分使用0×00至0×7F码(对应于ASCII码的相应码)。双字节部分,首字节码从0×81至0×FE,尾字节码位分别是0×40至0×7E和0×80至0×FE。四字节部分采用GB/T 11383未采用的0×30到0×39作为对双字节编码扩充的后缀,这样扩充的四字节编码,其范围为0×81308130到0×FE39FE39。其中第一、三个字节编码码位均为0×81至0×FE,第二、四个字节编码码位均为0×30至0×39。

4.包含的内容

双字节部分收录内容主要包括GB13000.1全部CJK汉字20902个、有关标点符号、表意文字描述符13个、增补的汉字和部首/构件80个、双字节编码的欧元符号等。 四字节部分收录了上述双字节字符之外的,包括CJK统一汉字扩充A在内的GB 13000.1中的全部字符。

Unicode字符集

1.名称的由来

Unicode字符集编码是Universal Multiple-Octet Coded Character Set 通用多八位编码字符集的简称,是由一个名为 Unicode 学术学会(Unicode Consortium)的机构制订的字符编码系统,支持现今世界各种不同语言的书面文本的交换、处理及显示。该编码于1990年开始研发,1994年正式公布,最新版本是2005年3月31日的Unicode 4.1.0。

2.特征

Unicode是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

3.编码方法

Unicode 标准始终使用十六进制数字,而且在书写时在前面加上前缀“U+”,例如字母“A”的编码为 004116 和字符“?”的编码为 20AC16。所以“A”的编码书写为“U+0041”。

4.UTF-8 编码

UTF-8是Unicode的其中一个使用方式。 UTF是 Unicode Translation Format,即把Unicode转做某种格式的意思。

UTF-8便于不同的计算机之间使用网络传输不同语言和编码的文字,使得双字节的Unicode能够在现存的处理单字节的系统上正确传输。

UTF-8使用可变长度字节来储存 Unicode字符,例如ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。

5.UTF-16 和 UTF-32 编码

UTF-32、UTF-16 和 UTF-8 是 Unicode 标准的编码字符集的字符编码方案,UTF-16 使用一个或两个未分配的 16 位代码单元的序列对 Unicode 代码点进行编码;UTF-32 即将每一个 Unicode 代码点表示为相同值的 32 位整数
参考技术B java 中用的是Unicode字符集 包含$美元符号 绝大部分汉字一个字符占两个字节 ,所以汉字 在Java中也可以当做变量 ,但一般都不这么用 ,很容易出错 参考技术C 这个看项目需求,一般常用的是 utf-8,gbk,iso-8859-1 参考技术D Java程序都是用Unicode字符集本回答被提问者和网友采纳

遍历 Java 字符串行的最佳方法是啥?

【中文标题】遍历 Java 字符串行的最佳方法是啥?【英文标题】:What is the best way to iterate over the lines of a Java String?遍历 Java 字符串行的最佳方法是什么? 【发布时间】:2012-03-04 18:56:44 【问题描述】:

目前我正在使用类似的东西:

String[]lines = textContent.split(System.getProperty("line.separator"));
for(String tmpLine : lines)
   //do something

我对这种方法不太满意,因为它创建了一个沉重的数组(假设textContent 可以包含一本书)。

有没有更好的解决方案来遍历String 的行?

【问题讨论】:

现在也使用 JDK/11,可以make use of String.lines 提供比拆分更好的性能。 【参考方案1】:

你可以使用:

BufferedReader bufReader = new BufferedReader(new StringReader(textContent));

并使用readLine() 方法:

String line=null;
while( (line=bufReader.readLine()) != null )



【讨论】:

感谢您的回答。此解决方案是否提供更好的性能?我注意到这个解决方案使用 3 对象。我想限制创建对象有足够的内存,那么BufferedReaderStringReader比String数组轻吗? 正如 BufferedReader 的 javadoc 所述,使用所述类是包装成本高昂的读取方法以实现具有成本效益的读取的有效方法。见docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html【参考方案2】:

为这个问题添加 Java 8 方式:

Arrays.stream(content.split("\\r?\\n")).forEach(line -> /*do something */)

当然,如果您确定文件来自与 vm 运行相同的平台,您也可以使用 System.lineSeparator() 进行拆分。

或者甚至更好地使用带有过滤器、映射和收集的流 api 甚至更具侵略性:

String result = Arrays.stream(content.split(System.lineSeparator()))
                     .filter(/* filter for lines you are interested in*/)
                     .map(/*convert string*/)
                     .collect(Collectors.joining(";"));

【讨论】:

真正的java8方式可能会直接使用System.lineSeparator()而不是属性 @xenoterracide 你是对的!相应地更改了答案。 @Torque 我解决了这个问题。 此解决方案的缺点是 split 方法将处理整个字符串,因此它可以在返回之前构建所有行的完整数组。如果您的字符串很大,您将创建一个包含大量对象的巨型数组,这很昂贵。【参考方案3】:

我相信您从 Java-11 开始有更好的 API 可用,您可以使用 String.lines() API 执行相同操作,该 API 返回从由行终止符分区的该字符串中提取的字符串流。

public Stream<String> lines()

同样的用法可以是:-

Stream<String> linesFromString = textContent.lines();
linesFromString.forEach(l ->   //do sth );

重要的 API 说明:-

@implNote This method provides better performance than
          split("\R") by supplying elements lazily and
          by faster search of new line terminators.

【讨论】:

【参考方案4】:

你可以使用 String.indexOf()/String.substring()

String separator = System.getProperty("line.separator");
int index = textContent.indexOf(separator);

while (index > 0)

  int nextIndex = textContent.indexOf(separator, index + separator.length());
  String line = textContent.substring(index + separator.length(), nextIndex);

  // do something with line.

【讨论】:

【参考方案5】:

Guava 的Splitter 运行良好。特别是你可以删除空行

Splitter splitter = Splitter.on(System.getProperty("line.separator"))
                            .trimResults()
                            .omitEmptyStrings();
for (String line : splitter.split(input))
   // do work here

【讨论】:

来自guava的源代码:Splitter.on(Pattern.compile("\r?\n")).split(entireFile) 更准确地说,它在Splitter#on的Javadoc中:google.github.io/guava/releases/snapshot/api/docs/com/google/…【参考方案6】:

Scanner

Java 1.5 中添加的java.util.Scanner 类呢?

总结:

一个简单的文本扫描器,可以解析原始类型和字符串 使用正则表达式。

扫描器使用分隔符模式将其输入分解为标记, 默认情况下匹配空格。然后生成的令牌可能是 使用各种 next 转换为不同类型的值 方法。

对于你的场景值得注意:

扫描器还可以使用空格以外的分隔符。这 示例从字符串中读取多个项目:

     String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
     System.out.println(s.nextInt());
     System.out.println(s.nextInt());
     System.out.println(s.next());
     System.out.println(s.next());
     s.close();

【讨论】:

【参考方案7】:

您实际上可以争吵Scanner 以允许您使用普通的for 循环:

import java.util.Scanner;
public class IterateLines 
    public static void main(String[] args) 
        Iterable<String> sc = () ->
            new Scanner("foo bar\nbaz\n").useDelimiter("\n");
        for (String line: sc) 
            System.out.println(line);
        
    

给我们:

$ javac IterateLines.java && java IterateLines 
foo bar
baz

【讨论】:

这会将字符串拆分为空格和换行符,这不是问题所要寻找的。​​span> 感谢@Zulakis - 我已更正代码以使用显式分隔符。 我认为使用 System.getProperty("line.separator") 会有所改进。【参考方案8】:

结合java.io.StringReaderjava.io.LineNumberReader

【讨论】:

感谢您的回答。其他建议BufferedReaderjava.io.LineNumberReader有什么优势? 其实我只是没有意识到 BufferedReader 也实现了 readLine() 方法。 对于未来的读者:LineNumberReader 扩展了 BufferedReader,因此 LineNumberReader 是 BufferedReader 的直接替代品,具有跟踪您刚刚阅读的行的行号的附加行为。见docs.oracle.com/javase/8/docs/api/java/io/LineNumberReader.html。【参考方案9】:

如果您使用的是 Java 1.8(或 Android),请尝试以下操作:

new BufferedReader(new StringReader(str)).lines().forEachOrdered((line) -> 
    // process each line as you like
);

Docs state

Stream 是惰性填充的,即在终端流操作期间只读发生。

这意味着这比在迭代开始之前首先生成大量字符串数组的其他解决方案运行得更快。

如果您使用的是 Java 11 或更高版本,那么 @Naman 给出的推荐 String#lines() 方法的答案也更加简洁和快速,请参阅 https://***.com/a/50631579/215266

【讨论】:

【参考方案10】:

使用带有 StringReader 参数的 BufferedReader。 BufferedReader 有一个方法 readLine() 所以你可以逐行读取你的字符串。

    StringReader reader = new StringReader(myBigTextString);
    BufferedReader br = new BufferedReader(reader);
    String line;
    while((line=br.readLine())!=null)
    
        //do what you want
    

【讨论】:

@alain.janinm,当您保留一个分割线数组时,该数组会占用您所说的大量内存。在这种情况下,文本的所有行都不会加载到内存中。 BufferedReader 只记住最后一个读取点,当您调用 readLine() 方法时,它只会读取字符串的下一行(在 StringReader 的帮助下)。因此,在每次迭代中,内存中只有一行文本(在 line 变量中)而不是所有行。

以上是关于Java语言所使用的字符集是啥?的主要内容,如果未能解决你的问题,请参考以下文章

java语言,取字符串第一个字母最简单的方法是啥?

java语言中集合与数组的区别是啥?

java语言中的scanner是啥意思用来干嘛

java中byte是啥类型

java 中的空格的转义字符是啥

java是啥语言?