UTF-8(Unicode Transformation Format)

news2024/10/6 14:25:29

在这里插入图片描述

文章目录

  • 一、Unicode
    • 示例代码:
  • 二、网络传输与Unicode
  • 三、UTF-8如何编码
  • 四、使用UTF-8转换传输Unicode
  • 五、利用Java-API进行UTF8编码和解码
  • 六、利用代码输出Unicode编码和UTF8编码
  • 七、手写UTF8编码、解码
  • 八、总结UTF8

一、Unicode

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

示例代码:

package demo;

/**
 * @Date: 2023-3-17 周五 15:48
 * @Author: Special Care
 * @Description: TODO Unicode编码
 * @Version: 1.0.0
 */
public class UnicodeDemo01 {
    public static void main(String[] args) {
        /**
         * Unicode编码
         * Java中的字符存储的是一个符号的Unicode编码
         * 可以显示为10进制或16进制形式
         * Java的字符范围0~65535(FFFF)
         */
        char c1 = 'A'; // 65   41
        char c2 = '中'; // 20013   4e2d
        char c3 = '✈'; // 9992   2708
        char c4 = 'a'; // 97   61
        System.out.println((int)c1);// 65
        System.out.println(Integer.toHexString(c1));// 41
        System.out.println((int)c2);// 20013
        System.out.println(Integer.toHexString(c2));// 4e2d
        System.out.println((int)c3);// 9992
        System.out.println(Integer.toHexString(c3));// 2708
        System.out.println((int)c4);// 97
        System.out.println(Integer.toHexString(c4));// 61
    }
}

二、网络传输与Unicode

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、UTF-8如何编码

在这里插入图片描述
在这里插入图片描述

四、使用UTF-8转换传输Unicode

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、利用Java-API进行UTF8编码和解码

package demo;

import java.nio.charset.StandardCharsets;

/**
 * @Date: 2023-3-17 周五 16:44
 * @Author: Special Care
 * @Description: TODO 测试UTF-8编解码API
 * @Version: 1.0.0
 */
public class UTF8Demo {
    public static void main(String[] args) throws Exception{
        /**
         * 测试UTF-8编解码API
         */
        String str = "Javaλ表达式";
        // 将字符串中的文字进行UTF-8编码
        // str.getBytes(StandardCharsets.UTF_8)也可以写成str.getBytes("UTF_8")
        // 经过getBytes方法的转换得到了UTF-8编码的字节数组
        byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
        // bytes就可以利用网络进行传输

        // 将字节数组中的UTF-8编码的字符进行解码
        // new String(bytes, "UTF-8")
        String s = new String(bytes, StandardCharsets.UTF_8);
        System.out.println(s); // Javaλ表达式
    }
}

六、利用代码输出Unicode编码和UTF8编码

package demo;

import java.nio.charset.StandardCharsets;

/**
 * @Date: 2023-3-17 周五 16:44
 * @Author: 李林泼
 * @Description: TODO 测试UTF-8编解码API
 * @Version: 1.0.0
 */
public class UTF8Demo {
    public static void main(String[] args) throws Exception{
        /**
         * 测试UTF-8编解码API
         */
        String str = "Javaλ表达式";
        // 将字符串中的文字进行UTF-8编码
        // str.getBytes(StandardCharsets.UTF_8)也可以写成str.getBytes("UTF_8")
        // 经过getBytes方法的转换得到了UTF-8编码的字节数组
        byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
        // bytes就可以利用网络进行传输

        // 将字节数组中的UTF-8编码的字符进行解码
        // new String(bytes, "UTF-8")
        String s = new String(bytes, StandardCharsets.UTF_8);
        System.out.println(s);

        /**
         * 输出字符串中每个字符的Unicode
         * String str = "Javaλ表达式";
         */
        System.out.println("Unicode:");
        for (int i = 0; i < str.length(); i++) {
            // i = 0, 1, 2, 3, 4, ...
            char c = str.charAt(i);
            System.out.print(c);
            System.out.print(":");
            System.out.println(Integer.toBinaryString(c));
        }
        System.out.println();
        System.out.println("UTF-8:");
        for (byte b : bytes) {
            System.out.println(Integer.toBinaryString(b & 0xff));
        }

        /**
         * Javaλ表达式
         * Unicode:
         * J:1001010
         * a:1100001
         * v:1110110
         * a:1100001
         * λ:1110111011
         * 表:1000100001101000
         * 达:1000111110111110
         * 式:101111100001111
         *
         * UTF-8:
         * 1001010
         * 1100001
         * 1110110
         * 1100001
         * 11001110
         * 10111011
         * 11101000
         * 10100001
         * 10101000
         * 11101000
         * 10111110
         * 10111110
         * 11100101
         * 10111100
         * 10001111
         */
    }
}

七、手写UTF8编码、解码

package demo;

import java.util.Arrays;

/**
 * @Date: 2023-3-17 周五 17:15
 * @Author: 李林泼
 * @Description: TODO 手工编写UTF-8编码、解码
 * @Version: 1.0.0
 */
public class UTF8Coding {
    /**
     * 手工编写UTF-8编码
     * Char. number range  |    UTF-8 octet sequence
     *    (hexadecimal)    |           (binary)
     * --------------------+------------------------------
     * 0000 0000-0000 007F | 0xxxxxxx
     * 0000 0000-0000 07FF | 110xxxxx 10xxxxxx
     * 0000 0000-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
     * 0000 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
     */
    /**
     * 将一个字符串编码为UTF-8字节数组
     * @param str 被编码的字符串
     * @return 经过UTF-8编码以后字节数组
     */
     public static byte[] getBytes(String str){
         // 预估一下返回值的最大情况
         byte[] bytes = new byte[str.length() * 4];
         // index代表bytes数组中数据的存储位置
         int index = 0;
         // 遍历字符串中每个字符,根据字符的Unicode编码范围,进行编码
         // 将编码存储到bytes,bytes中就是返回值UTF-8数据
         for (int i = 0; i < str.length(); i++) {
             char c = str.charAt(i);
             // 判断c范围,根据范围进行编码
             if (c <= 0x7F){
                 // c在0~0x7F范围内,是1字节编码,1字节编码添加到bytes
                 bytes[index++] = (byte) c;
             }else if (c <= 0x7FF){
                 // c在0x80~0x7FF范围内,处理两个字节的UTF-8编码
                 //    b1       b2
                 // 110xxxxx 10xxxxxx
                 // 截取字符的后6位
                 //            0b111111
                 int b2 = (c & 0x3F) | 0b10000000;
                 //                    0b11111
                 int b1 = ((c >>> 6) & 0x1F) | 0b11000000;
                 bytes[index++] = (byte) b1;
                 bytes[index++] = (byte) b2;
             }else if (c < 0xFFFF){
                 // 处理3字节编码
                 // 1110xxxx 10xxxxxx 10xxxxxx
                 int b3 = (c & 0b111111) | 0b10000000;
                 int b2 = ((c >>> 6) & 0b111111) | 0b10000000;
                 int b1 = ((c >>> 12) & 0b1111) | 0b11100000;
                 bytes[index++] = (byte) b1;
                 bytes[index++] = (byte) b2;
                 bytes[index++] = (byte) b3;
             }
         }
         return Arrays.copyOf(bytes,index);
     }

    /**
     * 将UTF-8编码的字节数组解码为字符串(Unicode字符)
     * @param bytes UTF-8编码的字节
     * @return 解码以后的字符串
     */
     public static String decode(byte[] bytes){
         char[] chs = new char[bytes.length];
         int index = 0;
         // 遍历字节数组,检查每个字节
         // 如果字节以0开头,则是单字节编码
         // 如果是以110开头,则是双字节编码
         // 如果是以1110开头,则是三字节编码
         for (int i = 0; i < bytes.length; ) {
             int b1 = bytes[i++] & 0xff;
             if ((b1 >>> 7) == 0){
                 // 检查01001010是否为单字节编码0xxxxxxx
                 // b1      00000000 00000000 00000000 01001010
                 // b1>>>7  000000000000000 00000000 00000000 0
                 chs[index++] = (char)b1;
             }else if ((b1 >>> 5) == 0b110){
                 // 检查是否为双字节编码 b1 11001110 b2 10111011
                 // b1 -> int
                 // b1      00000000 00000000 00000000 11001110
                 // b1>>>5  0000000000000 00000000 00000000 110
                 int b2 = bytes[i++] & 0xff;
                 // b1      00000000 00000000 00000000 11001110
                 // b2      00000000 00000000 00000000 10111011
                 // c       00000000 00000000 0000001110 111011
                 int c = ((b1 & 0b11111)<<6) | (b2 & 0b111111);
                 chs[index++] = (char) c;
             }else if ((b1 >>> 4) == 0b1110){
                 // 检查是否为三字节编码:11101000 10100001 10101000
                 int b2 = bytes[i++] & 0xff;
                 int b3 = bytes[i++] & 0xff;
                 int c = ((b1 & 0b1111)<<12) | ((b2 & 0b111111)<<6) | (b3 & 0b111111);
                 System.out.println("b1:" + Integer.toBinaryString(b1));
                 System.out.println("b2:" + Integer.toBinaryString(b2));
                 System.out.println("b3:" + Integer.toBinaryString(b3));
                 System.out.println("c:" + Integer.toBinaryString(c));
                 chs[index++] = (char) c;
             }
         }
         return new String(chs,0,index);
     }

    public static void main(String[] args) {
        String str = "Javaλ表达式";
        System.out.println("Unicode:");
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            System.out.print(c);
            System.out.print(":");
            System.out.println(Integer.toBinaryString(c));
        }
        // 调用手写UTF-8编码方法
        byte[] bytes = getBytes(str);
        for (byte b : bytes) {
            System.out.println(Integer.toBinaryString(b & 0xff));
        }

        // 检查手写的UTF-8解码运算
        String s = decode(bytes);
        System.out.println(s);
    }

    /**
     * Unicode:
     * J:1001010
     * a:1100001
     * v:1110110
     * a:1100001
     * λ:1110111011
     * 表:1000100001101000
     * 达:1000111110111110
     * 式:101111100001111
     * 1001010
     * 1100001
     * 1110110
     * 1100001
     * 11001110
     * 10111011
     * 11101000
     * 10100001
     * 10101000
     * 11101000
     * 10111110
     * 10111110
     * 11100101
     * 10111100
     * 10001111
     * b1:11101000
     * b2:10100001
     * b3:10101000
     * c:1000100001101000
     * b1:11101000
     * b2:10111110
     * b3:10111110
     * c:1000111110111110
     * b1:11100101
     * b2:10111100
     * b3:10001111
     * c:101111100001111
     * Javaλ表达式
     */
}

八、总结UTF8

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【Ubuntu安装选项】

关于Ubuntu系统安装选项 [TOC](关于Ubuntu系统安装选项) 安装选项选择 一、*Try or Install Ubuntu 二、Ubunru (safe graphics) 三、OEM install &#xff08;for manufacturers&#xff09; 四、Test memory 总结 安装选项选择 在安装Ubuntu系统时会有四个选项&#xff0c;搜…

模型部署学习--有三AI(视频要收费So没学完)

视频地址&#xff1a;深度学习之模型部署 模型的整个使用流程 从模型训练到部署 一 部署平台选择&#xff1a; 1、在线服务器端部署&#xff0c;精度优先&#xff1a; 大模型/分布式&#xff08;如千亿级参数模型GPT-3&#xff09; 延迟不敏感&#xff08;如以图搜图应用&am…

chatgpt批量写作-chatgpt批量生成文章

cchatgpt写作 ChatGPT是一种基于Transformer架构的自然语言处理技术&#xff0c;它可以用于文本生成和对话场景&#xff0c;可以辅助写作、创作等任务。以下是一些使用ChatGPT进行写作的方法和技巧&#xff1a; Fine-tuning预训练模型&#xff1a;ChatGPT模型预训练时需要大量…

数字孪生卫星:概念、关键技术及应用

源自&#xff1a;软件定义世界 摘 要 在分析卫星产业发展趋势与升级转型新需求后&#xff0c;为推动卫星与新技术融合发展&#xff0c;提升大型卫星工程的整体管理水平与流程管控能力&#xff0c;促进卫星产业数字化、网络化、智能化、服务化转型升级&#xff0c;将数字孪生技…

百度天工AIoT设备应用使能平台助力企业低成本开发

数字中国建设的顶层文件《数字中国建设整体布局规划》&#xff08;以下简称《规划》&#xff09;于近日印发&#xff0c;作为数字中国建设的重要基础&#xff0c;《规划》指出&#xff0c;要全面赋能经济社会发展&#xff0c;推动数字技术和实体经济的深度融合&#xff0c;产业…

C++语法(15)---- 继承

C语法&#xff08;14&#xff09;---- 模板进阶_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130092939?spm1001.2014.3001.5501 目录 1.继承概念和定义 1.概念 2.定义 1.格式 2. 继承关系和访问限定符 2.基类和派生类对象赋值转换 3.…

ERTEC200P-2 PROFINET设备完全开发手册(5-2)

5.2 TIA 数据记录操作 在PLC的程序中&#xff0c;可以通过指令RDREC和WRREC读写数据记录&#xff0c;在参考代码里可以看到读写操作都实现了index 2的记录数据&#xff0c;并且初始化为&#xff1a; #define DEMO_RECORD "ABCDEFGH" 首先定义要写入和读出的数据…

【LeetCode】剑指 Offer(26)

目录 题目&#xff1a;剑指 Offer 51. 数组中的逆序对 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;剑指 Offer 51. 数组中…

数据库MySQL —— 锁

目录 一、概述 二、全局锁 三、表级锁 1. 表锁 2. 元数据锁 3. 意向锁 四、行级锁 1. 行锁 2. 间隙锁 / 临键锁 一、概述 锁 是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O)的争用以外&…

channel 源码解析(5问)

目录 1.channel底层数据结构是什么 2.channel创建的底层实现 3.channel 的发送过程 4.channel的接受过程 5.关闭 channel 1.channel底层数据结构是什么 channel底层的数据结构是hchan,包括一个循环链表和2个双向链表 type hchan struct {qcount uint // tota…

Linux命令·route

Linux系统的route命令用于显示和操作IP路由表&#xff08;show / manipulate the IP routing table&#xff09;。要实现两个不同的子网之间的通信&#xff0c;需要一台连接两个网络的路由器&#xff0c;或者同时位于两个网络的网关来实现。在Linux系统中&#xff0c;设置路由通…

BGP小型实验

实验分析 1.主要考察的是对BGP配置的熟练 2.实验需要在R1与R5分别发布一条路由可以在BGP 中使用network 网段 掩码命令 3.R1与R2,R4与R5是EBGP&#xff0c;而R2,R3,R4是IBGP 实验操作 1.配置接口ip,与环回路由 以R1为例 2.AS内部需要实现非直连的建立是需要保证IBGP内部是通的所…

网络编程之IP协议

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

ChatGPT 存在很大的隐私问题

当 OpenAI 发布时 2020 年 7 月的 GPT-3&#xff0c;它提供了用于训练大型语言模型的数据的一瞥。 根据一篇技术论文&#xff0c;从网络、帖子、书籍等中收集的数百万页被用于创建生成文本系统。 在此数据中收集的是您在网上分享的一些关于您自己的个人信息,这些数据现在让 O…

YGG 代表 Web3 Gaming 参加 2023 年游戏开发者大会

Yield Guild Games&#xff08;YGG&#xff09;在 2023 年 3 月 20 日至 24 日在加州旧金山举行的游戏开发者大会&#xff08;GDC&#xff09;上大显身手&#xff0c;这是游戏开发者的重要交流学习活动。虽然 GDC 本身提供了多种多样的活动&#xff0c;包括讲座、小组讨论、圆桌…

基于html+css的盒子展示6

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

无公网IP?教你在外远程访问本地wamp服务器「内网穿透」

目录 前言 1.Wamp服务器搭建 1.1 Wamp下载和安装 1.2 Wamp网页测试 2. Cpolar内网穿透的安装和注册 2.1 本地网页发布 2.2 Cpolar云端设置 2.3 Cpolar本地设置 3. 公网访问测试 4. 结语 前言 软件技术的发展日新月异&#xff0c;各种能方便我们生活、工作和娱乐的新…

OA系统的功能和作用是什么(OA系统百科)

OA系统的功能和作用是什么&#xff08;OA系统百科&#xff09;。OA系统是一种非常实用的企业内部管理系统&#xff0c;它可以帮助公司实现各项管理工作&#xff0c;可以说是整个公司和团队的纽带&#xff0c;有助于提高工作效率和管理水平。 具体来说&#xff0c;OA系统的作用…

Linux运维进阶之路

前言 首先在我看来&#xff0c;不论你以后是做运维亦或者是做后端开发&#xff0c;云计算等。只要和后端搭边&#xff0c;Linux都是必会的基础知识。所以说Linux是伴随我们工作中一个特别重要的知识。 不过很多同学在初学Linux的时候&#xff0c;始终不得其法&#xff0c;发现…

科技赋能文旅:蓝海创意云携手苏州乐园打造“元宇宙灯会”

4月8日&#xff0c;苏州乐园“欢乐寻梦季”元宇宙灯会即将正式亮灯&#xff0c;这是一场以元宇宙技术为核心&#xff0c;结合现代灯展、数字科技、潮玩游乐等元素&#xff0c;打造的一场大型的沉浸式数字光影体验。 蓝海创意云作为苏州高新区元宇宙龙头企业&#xff0c;以多年…