【Java 基础】28 字符编码

news2024/11/28 8:25:55

文章目录

    • 1.字符集
    • 2.编码方式
      • 1)ASCII
      • 2)UTF-8 编码
      • 3)UTF-16 编码
      • 4)ISO-8859-1 编码
    • 3.使用样例
      • Charset 类
      • String 类
    • 4.注意事项
    • 结语

字符编码(Character Encoding)是一种将字符映射为二进制数据的规则或算法。在计算机中字符编码用于将人类可读的字符表示转换为计算机可处理的二进制形式,以便在存储、传输和处理文本数据时使用。

首先,我们先看一个现象

例如,现在有两个人在聊天,可是一个人写中文,另外一个人写英文

那么就会存在一个问题,没法聊啦!!!

在这里插入图片描述

为了避免这种不知道说啥的问题(乱码),则必须使用相同的语言(字符编码)让双方都认识。

1.字符集

字符集(Character Set)是一组字符的集合,每个字符在字符集中都有一个唯一的编号

它是字符编码的基础,为了在计算机中存储和处理文本数据,字符必须被映射到二进制表示。

在 Java 中,最常见的字符集之一是 Unicode,它是一种全球字符集,几乎包含了所有已知的字符,不论是拉丁字母、希腊字母还是汉字等。

2.编码方式

编码方式(Encoding)是将字符集中的字符映射到具体的二进制表示的过程

不同的编码方式使用不同的规则,决定了如何将字符转换为计算机可理解的二进制数据。常见的编码方式包括 ASCII、UTF-8、UTF-16、ISO-8859-1 等。

1)ASCII

ASCII(American Standard Code for Information Interchange)是最早的字符编码标准,使用 7 位二进制数表示一个字符,因此只能表示 128 个字符。ASCII 主要包含了英文字母、数字和一些常见符号。

2)UTF-8 编码

UTF-8(Unicode Transformation Format - 8-bit)是一种可变长度的字符编码,它使用 8 位、16 位和 32 位二进制数表示字符。对于英文字符,UTF-8 使用 8 位表示,对于其他字符,使用多个字节表示。UTF-8 是一种被广泛使用的 Unicode 实现方式,支持几乎所有的字符。

在 Java 中,可以使用 Charset.forName("UTF-8") 表示 UTF-8 编码。

3)UTF-16 编码

UTF-16 也是 Unicode 的一种实现方式,使用 16 位二进制数表示一个字符。它可以表示 65536 个字符,但对于一些较大的字符,需要使用两个 16 位的编码单元表示。UTF-16 适用于处理包含辅助平面字符(Supplementary Planes)的 Unicode 字符。

4)ISO-8859-1 编码

ISO-8859-1(Latin-1)是 ISO 组织制定的字符编码标准,使用 8 位二进制数表示一个字符,可以表示 256 个字符。它是 ASCII 的扩展,包含了欧洲语言中的特殊字符。在 Java 中,ISO-8859-1 编码可以通过 Charset.forName("ISO-8859-1") 来表示。

3.使用样例

Charset 类

Java 提供了 Charset 类来表示字符集,它包含了许多静态方法用于获取标准字符集

例如 Charset.forName("UTF-8"),这能让我们在编码和解码时能够方便地指定字符集。

示例代码:

import java.nio.charset.Charset;
public class Demo {
    public static void main(String[] args) {
        Charset utf8Charset = Charset.forName("UTF-8");
        System.out.println("设定字符集为: " + utf8Charset);

        Charset isoCharset = Charset.forName("ISO-8859-1");
        System.out.println("设定字符集为: " + isoCharset);
    }
}

输出结果:

设定字符集为: UTF-8
设定字符集为: ISO-8859-1

String 类

Java 中的 String 类也提供了一些方法来进行字符编码和解码。这些方法允许将字符串转换为字节数组(编码),或将字节数组转换为字符串(解码)。

import java.nio.charset.StandardCharsets;
public class Demo {
    public static void main(String[] args) {
        String str = "Hello, 中国!";
        System.out.println("输入的字符串:" + str);

        // 编码为字节数组
        byte[] utf8Bytes = str.getBytes(StandardCharsets.UTF_8);
        StringBuilder hexString = new StringBuilder();
        for (byte b : utf8Bytes) {
            hexString.append(String.format("%02X", b));
        }
        System.out.println("输出字节数组对应的十六进制字符串:" + hexString);

        // 解码字节数组为字符串
        String decodedStr = new String(utf8Bytes, StandardCharsets.UTF_8);
        System.out.println("输出解码字节数组为字符串: " + decodedStr);
    }
}

输出结果:

输入的字符串:Hello, 中国!
输出字节数组对应的十六进制字符串:48656C6C6F2C20E4B8ADE59BBDEFBC81
输出解码字节数组为字符串: Hello, 中国!

上述示例演示了如何将字符串使用 UTF-8 编码为字节数组,并再次使用 UTF-8 解码为字符串。其中又将字节数组转换为十六进制字符串,以便更好地展示字节内容。

4.注意事项

  • 选择合适的字符集和编码方式: 根据应用的需求选择合适的字符集和编码方式,以确保文本数据正确存储和传输。推荐使用 UTF-8 ,因为它能够支持几乎所有的字符。
  • 处理异常: 在进行字符编码和解码时,要注意处理可能抛出的异常,如 UnsupportedEncodingException。合理的异常处理有助于增强程序的健壮性。
  • 文件编码: 在处理文件时,了解文件的编码方式是很重要的。特别是在读取外部文本文件时,要确保使用正确的字符集进行解码,以避免乱码问题。
  • 避免混淆: 在不同系统和环境中,字符集和编码的默认值可能不同。明确指定字符集有助于避免因环境差异而导致的问题。

结语

字符编码是 Java 编程中不可忽视的重要概念。了解不同的字符集和编码方式,以及如何在 Java 中进行字符编码和解码,对于处理文本数据至关重要。通过正确地选择字符集和编码方式,可以确保应用在处理多语言和国际化文本时能够稳健地运行。在实际开发中,始终保持对字符编码的关注,并采用良好的编码实践,将有助于提高应用的可维护性和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1300365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何理解 RPC 远程服务调用?

本文主要讲解 RPC 远程服务调用相关的知识。 RPC 远程服务调用是分布式服务架构的基础,无论微服务设计上层如何发展,讨论服务治理都绕不开远程服务调用,那么如何理解 RPC、有哪些常见的 RPC 框架、实现一款 RPC 框架需要哪些技术呢&#xff…

macos下安装科研绘图软件Origin

科研人必备软件Origin,主要是考虑到很多期刊都要求绘制origin可编辑的图,所以有些时候必须用这个软件,但是这个软件macos并不支持,所以必须考虑其他的方案,我没有安装虚拟机,而是使用crossover 安装crosso…

Vue 静态渲染 v-pre

v-pre 指令&#xff1a;用于阻止 Vue 解析这个标签&#xff0c;直接渲染到页面中。 语法格式&#xff1a; <div v-pre> {{ 数据 }} </div> 基础使用&#xff1a; <template><h3>静态渲染 v-pre</h3><p v-pre>静态渲染&#xff1a;{{ n…

Java中的IO流②——字符集、字符流、缓冲流

主要的编码规范&#xff1a; GBK编码 Windows自带 Unicode编码 为什么会有乱码&#xff1f; 原因一 原因二 编码和解码的代码实现 字符流 FileReader read()细节&#xff1a; 一&#xff1a;默认也是一个字节一个字节的读取&#xff0c;如果遇到中文就会一次读取多个 二&a…

Terminator的layout设置(一个新的一键启动思路)

首先你得有terminator&#xff1a; sudo apt install terminator然后就能使用了&#xff0c;我一般喜欢修改它原本的水平和垂直分割&#xff1a;用ctrlshifta和ctrlshifts 把屏幕先分成多块&#xff1a; 比如是这样的&#xff0c;接下来 右键->点击Preference 弹框中上方标…

pdi-ce-9.4.0.0-343.zip和pentaho-server-ce-9.4.0.0-343.zip区别及简单使用

目录 &#x1f351;一、概述&#x1f34a;1.1、pdi-ce-9.4.0.0-343.zip&#x1f34a;1.2、pentaho-server-ce-9.4.0.0-343.zip &#x1f351;二、简单使用&#x1f34a;2.1、pdi-ce-9.4.0.0-343&#x1f34a;2.2、pentaho-server-ce-9.4.0.0-343&#x1f34a;2.3、联合使用 &am…

MongoDB的连接数据库,创建、删除数据库,创建、删除集合命令

本文主要介绍MongoDB的连接数据库&#xff0c;创建、删除数据库&#xff0c;创建、删除集合命令。 目录 MongoDB连接数据库连接到本地 MongoDB 实例连接到远程 MongoDB 实例 MongoDB创建和删除数据库MongoDB创建和删除集合创建集合删除集合 MongoDB连接数据库 连接 MongoDB 数…

报表生成器Stimulsoft用户手册:预览中具有动态数据排序的报告

Stimulsoft Reports 是一款报告编写器&#xff0c;主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署&#xff0c;如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等&#xff0c;在你的应用程序中嵌入报告设计器…

[香橙派]Orange pi zero 3命令行配网方法——建立ssh连接——Ubuntu配置WIFI自动连接

一、前言 前面我们给Orange Pi安装了Ubuntu系统&#xff0c;并通过MobaXterm进行了串口连接&#xff0c;但其实并不方便&#xff0c;在日常开发中&#xff0c;我们希望能够使用更方便的ssh连接来进行操作&#xff0c;因此配置网络是必要的。 本章介绍的方法无需网线、HDMI线等&…

我的NPI项目之Android 安全系列 -- Android Strongbox 初识

从Android9(Pie)开始,Google强烈建议支持Strongbox. 具体描述如下: 一直到目前的Android14. 对应的内容也一并贴出来: 说人话就是Android开始通过独立于主SoC的单元进行密钥存储了。 通常&#xff0c;这样的单元就是我们通常称作的Secure Element&#xff08;SE&#xff09;&am…

关于优雅的使用SQL多行转多列的记录(doris)

文章目录 应用需求场景记录过程1. 准备数据2. 给数据根据姓名分组&#xff0c;加上序号.3. 根据name分组成map结构4. 拆分map 应用需求场景 准备的数据是这样的&#xff1a; 需要将每个人的成绩显示在一行上&#xff0c;需要的结果如下&#xff0c;但是我的情况是课程有非常…

【MySQL进阶】索引使用

一、索引使用 1.验证索引效率 tb_sku 这张表中准备了 1000w 的记录。 我用夸克网盘分享了「1000w的模拟数据」链接&#xff1a;https://pan.quark.cn/s/15cf665202b2 这张表中id为主键&#xff0c;有主键索引&#xff0c;而其他字段是没有建立索引的。 我们先来查询其中的…

阿里内部教程Jmeter 性能测试常用图表、服务器资源监控

性能测试常用图表 插件安装 步骤 1&#xff1a;安装插件管理器 在 Jmeter 官网上下载插件管理器 Plugins-manager-1.3.jar将 jar 包放入到 lib\ext 目录下重启 Jmeter&#xff0c;可以在选项下看到 Plugins Manager 选项 步骤 2&#xff1a;安装指定的插件 打开 Plugins Ma…

常见web漏洞的流量分析

常见web漏洞的流量分析 文章目录 常见web漏洞的流量分析工具sql注入的流量分析XSS注入的流量分析文件上传漏洞流量分析文件包含漏洞流量分析文件读取漏洞流量分析ssrf流量分析shiro反序列化流量分析jwt流量分析暴力破解流量分析命令执行流量分析反弹shell 工具 攻击机受害机wi…

【论文笔记】Gemini: A Family of Highly Capable Multimodal Models——细看Gemini

Gemini 【一句话总结&#xff0c;对标GPT4&#xff0c;模型还是transformer的docoder部分&#xff0c;提出三个不同版本的Gemini模型&#xff0c;Ultra的最牛逼&#xff0c;Nano的可以用在手机上。】 谷歌提出了一个新系列多模态模型——Gemini家族模型&#xff0c;包括Ultra…

SSD数据在写入NAND之前为何要随机化?-part2

接part1介绍&#xff1a; 如何达到这个目的&#xff1f;业内常用的是对写入数据的数据进行随机化处理&#xff0c;这部分主要在SSD控制器中通过硬件实现。 上图b/c&#xff1a;在控制器芯片通过硬件方式实现随机化的读写流程&#xff0c;这个也是业内通常做法。随机化处理是在写…

TypeScript 之 console的使用

语言&#xff1a; TypeScript 在线工具&#xff1a; PlayGround console console 对象是一个非常强大的控制台日志显示工具&#xff0c; 可以帮助我们在浏览器中调试代码。 注&#xff1a; console不属于TypeScript的语法&#xff0c;而是由JavaScript封装的内置对象。 简单的…

Ubuntu下安装SDL

源码下载地址&#xff08;SDL version 2.0.14&#xff09;&#xff1a;https://www.libsdl.org/release/SDL2-2.0.14.tar.gz 将源码包拷贝到系统里 使用命令解压 tar -zxvf SDL2-2.0.14.tar.gz 解压得到文件夹 SDL2-2.0.14 进入文件夹 执行命令 ./configure 执行命令 make…

原来JMeter 结果处理常见问题这么简单,可惜没早点看到!

1. 前言 工作中用 jmeter 请求一个接口对谈得上会 jmeter 的人似乎都是可以做出来的&#xff0c;但是实际难点是参数化&#xff0c;结果的断言&#xff0c;结果的汇总等。本文将针对结果过滤有效性的情况展开分析。 示例场景&#xff1a;一个接口需要对入参1000多个数据做测试…

【亲测有效】支持横竖屏 微信小程序video禁止进度条拖动,微信小程序遮罩进度条,

背景&#xff1a;部分课程禁止客户拖动视频进度条直至播放结束 红色是遮罩区域遮罩区域 实际遮罩效果&#xff08;有一个很浅的阴影区域&#xff09; 实现代码 .wxml文件 <video enable-progress-gesture"false" ><cover-view class"cover">…