汉字编码实验

news2024/11/25 0:21:08

Logisim的简介和安装

首先要知道什么是logisim?

Logisim是一种用于数字电路设计和模拟的开源工具,Logisim在2014年10月11日无限期暂停。因它足够简单,可以帮助学习逻辑电路相关的基本概念而闻名。Logisim被世界各地大学的学生在课程中使用。

Logisim的特性

  • 开源免费
  • 绘画界面直观简洁
  • 可以在任何支持Java 5或更高版本的机器上运行,同时针对MacOS X和Windows发布了特殊版本

由于Logisim现在已经停止更新了,我这里提供两种安装方式
官方网站:http://www.cburch.com/logisim/

汉字的编码

首先我们应该了解汉字是如何编码的?我们为什么要将汉字进行编码?

我们知道,汉字的特点是数量庞大、字形复杂,并且存在大量一音多字和一字多音的现象。由于汉字编码的诸多问题,导致汉字很难进入计算机。为了解决这个汉字输入输出的问题,于是就衍生出了汉字编码的概念。

汉字编码的分类

计算机中汉字的表示也是用二进制编码,同样是人为编码的。根据应用目的的不同,汉字编码分为外码、交换码、机内码和字形码。

我这里仅简单介绍,交换码(国标码)和机内码,想要了解更多的可以自行百度

交换码(国标码)

计算机内部处理的信息,都是用二进制代码表示的,汉字也不例外。而二进制代码使用起来是不方便的,于是需要采用信息交换码。中国标准总局1981年制定了中华人民共和国国家标准GB2312–80《信息交换用汉字编码字符集–基本集》,即国标码。

而区位码是国标码的另一种表现形式,把国标GB2312–80中的汉字、图形符号组成一个94×94的方阵,分为94个“区”,每区包含94个“位”,其中“区”的序号由01至94,“位”的序号也是从01至94。94个区中位置总数=94×94=8836个,其中7445个汉字和图形字符中的每一个占一个位置后,还剩下1391个空位,这1391个位置空下来保留备用。

机内码

根据国标码的规定,每一个汉字都有了确定的二进制代码,在微机内部汉字代码都用机内码,在磁盘上记录汉字代码也使用机内码。

汉字编码的字符集

我们要知道什么是汉字编码的字符集?

汉字编码的字符集是一套系统或规范,用于将汉字和其他字符以数字的形式进行编码,使得计算机系统能够存储、处理和显示这些字符。由于汉字的数量庞大且具有复杂的结构,不同的字符集有不同的设计和目标,来满足各种技术和语言需求

GB2312

  • 定义:GB2312是中国国家标准的简化汉字字符集,首次发布于1980年。
  • 内容:包含了6763个汉字和682个其它符号,涵盖了中国大陆使用的大部分简体汉字。
  • 用途:这是最早的汉字编码标准之一,广泛用于早期的电脑和网络系统中。

GBK

  • 定义:GBK是对GB2312的扩展,首次发布于1995年。
  • 内容:包含了所有GB2312字符,并新增了近20000个汉字和符号,支持繁体汉字和少数民族文字。
  • 用途:GBK编码兼容GB2312,大幅扩展了汉字的覆盖范围,适用于需要处理多种汉字形式的应用。

GB18030

  • 定义:GB18030是一种更为全面的汉字编码系统,发布于2000年,并在2005年进行了更新。
  • 内容:它是一个多字节字符集,不仅包括GBK、GB2312的所有字符,还加入了更多的少数民族字符以及所有Unicode的字符。
  • 用途:GB18030是中国的国家标准,所有在中国销售的软件和操作系统都必须支持此编码,确保字符编码的国际兼容性和全面性。

Big5

  • 定义:Big5是台湾地区使用的繁体汉字字符集,首次发布于1984年。
  • 内容:主要包括繁体汉字,广泛应用于台湾及香港等地区。
  • 用途:虽然主要用于繁体字环境,但在一些历史应用和地区性软件中仍然非常重要。

Unicode

  • 定义:Unicode是一个国际标准,旨在为全世界所有的书写系统提供唯一的编码。
  • 内容:包括从世界上每一种已知的字符和文字系统的字符,其中包括所有类型的汉字。
  • 用途:Unicode是目前最广泛使用的编码系统,它使得跨语言、跨平台的数据处理和交换变得可能,是现代软件和网络环境的核心组成部分。

汉字编码的转换原理

转换关系:设转换为16进制的区位码为区位码I

  • 区位码I = 区位码的区码(前两位)和位码(后两位)分别转十六进制按原顺序组合起来
  • 国标码 = 区位码I + 2020H
  • 机内码 = 国标码 + 8080H
  • 机内码 = 区位码I + A0A0H

转换示例:
假设我们有一个区位码为"0101",我们可以按照以下步骤进行转换:

  1. 区位码"0101"转换为区位码I(十六进制不变)是"0101"
  2. 区位码I"0101"加上2020H得到国标码为"2121"
  3. 机内码可以有两种计算方式:
    1. 从国标码"2121"加上8080H得到机内码"A1A1"
    2. 直接将区位码I"0101"加上A0A0也得到机内码"A1A1"

转换样例:
例如,我们已知华的机内码是BBAA(GB2312),根据上面的结论可以知道华的区位码I就是BBAA-A0A0=1B0AH
image.png
根据GB2312编码的特点,把2个字节的最高位都设置为1,(5F60改为D),使得计算结果的两个字节,最高位也是1
image.png
如果我们在一个两字节(16位)的编码中操作,其中每个字节包含8位,那么:

  • 第一个字节(位号字节):XXXX XXXX
  • 第二个字节(区号字节):XXXX XXXX

在一个16位的表示中,这就成为:XXXX XXXX XXXX XXXX
这里,位号可以取自最右边的7位(0到6)。
区号可以取自接下来的7位(8到14),因为从0开始计数的话,第一个字节是0到7位,第二个字节是8到15位。

程序设计

对应的c++程序设计

#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
#include <locale>
#include <codecvt>

std::string convertStr(const std::string& msg) {
    // C++11之后可以使用codecvt_utf8库来进行编码转换
    std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> cv;
    std::wstring wide_string = cv.from_bytes(msg);

    // 使用vector来存储每个字符的GB2312编码
    std::vector<int> gb2312_bytes;

    for (wchar_t wc : wide_string) {
        // 如果是ASCII字符,直接加入
        if (wc < 128) {
            gb2312_bytes.push_back(wc);
        } else {
            // 非ASCII字符,转为GB2312
            // 这里需要一个GB2312编码器,C++标准库中没有直接支持,可能需要第三方库或平台特定的API
            // 这是一个示意,实际上可能需要更复杂的操作
            int converted = /* 转换wc到GB2312 */;
            gb2312_bytes.push_back(converted);
        }
    }

    std::ostringstream gbString;
    int i = 0;
    for (int b : gb2312_bytes) {
        // 将每个字节转换为16进制
        gbString << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << (b & 0xFF) << "\t";
        i++;
        if (i == 6) {
            i = 0;
            gbString << "\n";
        }
    }

    return gbString.str();
}

int main() {
    std::string msg = "华您好。我是测试001";
    // 使用cout来输出信息
    std::cout << "请在下一行,输入一个字符串:" << std::endl;

    std::string input;
    std::cin >> input;

    std::string converted_msg = convertStr(input);
    std::cout << converted_msg << std::endl;

    return 0;
}

Java代码

package Test;

import java.io.UnsupportedEncodingException;
import java.util.Scanner;

public class Test03 {

	public static void main(String[] args) throws UnsupportedEncodingException {
		// TODO Auto-generated method stub
		String msg = "华您好。我是测试001";
		//msg = "。";  //中文名号,两个字节。
		
		System.out.println("请在下一行,输入一个字符串:");
		Scanner reader=new Scanner(System.in);
		msg = reader.next();
		msg = convertStr(msg);
		System.out.println(msg);
	}
	
	public static String convertStr(String msg) throws UnsupportedEncodingException {
	    //先把字符串按gb2312转成byte数组
	    byte[] bytes = msg.getBytes("gb2312");
	    StringBuilder gbString = new StringBuilder();
	    
	    int i=0;
	    for (byte b : bytes)
	    {
	        // 再用Integer中的方法,把每个byte转换成16进制输出
	        String temp = Integer.toHexString(b);
	        //判断进行截取
	        if(temp.length()>=8){
	            temp = temp.substring(6, 8);  //取第7个和第8个
	        }
	        gbString.append("%" + temp + "\t");
	        i++;
	        if(i==6) {    
	        	i=0;    
	        	gbString.append("\n");    
	        }
	    }
	   return gbString.toString();
	}

}

国标转区位码电路设计

从上面的转换原理可以得出,机内码 = 区位码I + A0A0H,那么区位码I = 机内码 - A0A0H,这样的话我们就可以使用一个加法器来实现从国标码到区位码的转换。从上面的转换原理可以知道-A0A0H的补码是:5F60H,这样我们就可以设计出转换电路
image.png
将电路封装
image.png

汉字编码测试

编辑存储内容,相应内容在GB2312可以查到
image.png
进行数据修改
image.png
最后附上GB2312编码表GB2312编码表zt.docx

总结

在本实验中我学会了汉字编码的转换,国标转区位码的电路设计等等。最初让我感到困惑的就是汉字编码的一些概念,对机内码和国标码的理解还不到位导致后面设计困难。

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

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

相关文章

有回显命令执行-命令拼接+关键字绕过

[题目信息]&#xff1a; 题目名称题目难度有回显命令执行-命令拼接&#xff08;训练题&#xff09;2 [题目考点]&#xff1a; 远程命令执行漏洞&#xff0c;用户通过浏览器提交执行命令&#xff0c;由于服务器端没有针对执行函数做过滤&#xff0c;导致在没有指定绝对路径的…

快速切换node.js版本方法(使用开源项目方便切换版本)

1、安装nvm nvm下载地址&#xff1a;https://github.com/coreybutler/nvm-windows/ 2、输入nvm -v 3、查看可以安装的node.js版本 4、安装你想要的版本 5、查看是否安装成功&#xff08;*表示目前你使用的版本&#xff09; 6、切换版本 7、查询当前使用的版本

使用docker配置DSP-SLAM

一.Docker环境配置 1.简单介绍 –docker容器技术–。 简单理解&#xff1a;Anaconda用于隔离不同的python环境&#xff1b;docker可以理解成在你的机器里面安装了一个独立的系统&#xff0c;因此它可以隔离不同的CUDA环境&#xff0c;还有着独立的文件系统&#xff0c;防止别…

Matlab方程组拟合【案例源码+视频教程】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法&#xff0c;并提供所有案例完整源码&#xff1b;2.…

记一次Mysql数据库宕机This could be because you hit a bug.

Hi I’m Shendi 今天收到消息说所有软件不能用了&#xff0c;网页都打不开&#xff0c;遇到了问题&#xff0c;于是在这里记录一下 记一次Mysql数据库宕机This could be because you hit a bug. 起因 为了节省成本&#xff0c;对于小公司而言服务器数量通常不会太多&#xff…

HTTP协议安全传输教程

HTTP协议有多个版本&#xff0c;包括但不限于HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2和HTTP/3。这些版本各自具有不同的特点和改进&#xff0c;以适应网络技术的发展和满足不同的需求。例如&#xff0c;HTTP/1.0使用文本格式传输数据&#xff0c;简单易用且兼容性好&#xff0c;…

OpenCV基本图像处理操作(六)——直方图与模版匹配

直方图 cv2.calcHist(images,channels,mask,histSize,ranges) images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的…

热门动画插件DoTween的使用

热门动画插件DoTween的使用 做游戏基本都会用到插件&#xff0c;它能让你的效率更高&#xff0c;因为它里面都是写好了的方法&#xff0c;只要用就可以了。在众多动画插件中&#xff0c;DoTween脱颖而出&#xff0c;因为它用起来很简单也很方便&#xff0c;自然用的人就多了。…

计算机视觉动作识别——YOWO用于实时时空动作定位与识别的算法解析

摘要 时空动作定位要求将两种信息源整合到设计的架构中&#xff1a;(1) 来自先前帧的时间信息和(2) 来自关键帧的空间信息。当前的最先进方法通常使用单独的网络提取这些信息&#xff0c;并使用额外的机制进行融合以获得检测结果。YOWO是一个用于视频流中实时时空动作定位的统…

软件杯 深度学习图像修复算法 - opencv python 机器视觉

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步&#xff1a;将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…

解剖this指针

目录 this指针的理解 1. this指针的用处 2.this指针的使用 3.this指针的使用 this指针来源 this指针的理解 通常在class定义时要用到类型变量自身时&#xff0c;因为这时候还不知道变量名&#xff08;为了通用也不可能固定实际的变量名&#xff09;&#xff0c;就用this这样…

【前端】1. HTML【万字长文】

HTML 基础 HTML 结构 认识 HTML 标签 HTML 代码是由 “标签” 构成的. 形如: <body>hello</body>标签名 (body) 放到 < > 中大部分标签成对出现. <body> 为开始标签, </body> 为结束标签.少数标签只有开始标签, 称为 “单标签”.开始标签和…

微软正式发布Copilot for Security

微软公司近日宣布&#xff0c;其备受期待的安全自动化解决方案——Copilot for Security现已全面上市&#xff0c;面向全球用户开放。这一创新工具的推出标志着微软在提升企业安全防护能力方面迈出了重要一步&#xff0c;同时也为安全专业人士提供了强大的支持。 Copilot for …

深入理解插入排序:直接插入排序与希尔排序

文章目录 深入理解插入排序&#xff1a;直接插入排序与希尔排序直接插入排序算法描述工作原理性能分析 希尔排序算法描述实现代码性能分析 比较直接插入排序与希尔排序结论 深入理解插入排序&#xff1a;直接插入排序与希尔排序 排序算法是计算机科学中的基石之一&#xff0c;…

【芯片介绍】中微半导高性能车规级MCU BAT32A233

中微半导体&#xff08;深圳&#xff09;股份有限公司已推出车规MCU新品——BAT32A233&#xff0c;该产品具有小资源、高性能、支持硬件LIN2.2接口的性能优势&#xff0c;非常适合汽车的门、窗、灯、传感器、控制面板、组合开关等小巧、灵活的部件应用场景。 BAT32A233基于Ar…

无线网络安全之WiFi Pineapple初探

背景 WiFi Pineapple&#xff08;大菠萝&#xff09;是由国外无线安全审计公司Hak5开发并售卖的一款无线安全测试神器。集合了一些功能强大的模块&#xff0c;基本可以还原钓鱼攻击的全过程。在学习无线安全时也是一个不错的工具&#xff0c;本文主要讲WiFi Pineapple基础配置…

使用SpringBoot3+Vue3开发公寓管理系统

项目介绍 公寓管理系统可以帮助公寓管理员更方便的进行管理房屋。功能包括系统管理、房间管理、租户管理、收租管理、房间家具管理、家具管理、维修管理、维修师傅管理、退房管理。 功能介绍 系统管理 用户管理 对系统管理员进行管理&#xff0c;新增管理员&#xff0c;修改…

数据分析(2)

数据分析&#xff08;2&#xff09; 本文介绍pandas的另一种数据类型DataFrame,中文叫数据框 DataFrame 定义&#xff1a; DataFrame是一个二维的矩阵数据表&#xff0c;通过行和列&#xff0c;可以定位一个值。 在某种程度上&#xff0c;可以认为DataFrame是“具有相同ind…

C语言单向链表的经典算法

1.分割链表 2.移除链表元素 3.反转链表 4.合并两个有序链表 5.链表的中间结点 6.环形链表的约瑟夫问题 1.分割链表: 1.思路&#xff1a;创建新链表&#xff0c;小链表和大链表。如图 代码如下 /*** Definition for singly-linked list.* struct ListNode {* int val…

JVM虚拟机(九)如何开启 GC 日志

目录 一、引言二、开启 GC 日志三、解析 GC 日志四、优化建议 一、引言 在 Java 应用程序的运行过程中&#xff0c;垃圾收集&#xff08;Garbage Collection&#xff0c;简称 GC&#xff09;是一个非常重要的环节。GC 负责自动管理内存&#xff0c;回收不再使用的对象所占用的…