从GB2312到Unicode转换表制作

stm32单片机平台上ASCII(GBK,GB2312)转unicode转UTF-8 问题来源 用stm32单片机接收APP发下来的汉字,并显示此汉字。 APP发下来的是UTF-8,转到服务器,因为mdk里面输入的汉字是ASCII(GBK,GB2312),所以需要服务器将UTF-8转成ASCII(GBK,GB2312)。 现在升级STM32单片机程序,发现需要UTF-8编码,APP和服务器最好不动,不然修改太大。 所以就出现了ASCII(GBK,GB2312)转unicode转UTF-8需求 以下ASCII(GBK,GB2312),统称为GBK,因为ASCII是GB2312子集,G 阅读详情

简体中文有两种常用编码:GB2312 和 Unicode. 它们的对应关系可以用
下面的程式所生成:

/**
 * GB2312Unicde.java
 * Copyright (c) 2003 by Dr. Herong Yang, http://www.herongyang.com/
 */
import java.io.*;
import java.nio.*;
import java.nio.charset.*;
class GB2312Unicde {
   static OutputStream out = null;
   static char hexDigit[] = {'0', '1', '2', '3', '4', '5', '6', '7',
                             '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
   static int b_out[] = {201,267,279,293,484,587,625,657,734,782,827,
      874,901,980,5590};
   static int e_out[] = {216,268,280,294,494,594,632,694,748,794,836,
      894,903,994,5594};
   public static void main(String[] args) {
      try {
         out = new FileOutputStream("gb2312.gb");
         writeCode();
         out.close();
      } catch (IOException e) {
         System.out.println(e.toString());
      }
   }
   public static void writeCode() throws IOException {
      boolean reserved = false;
      String name = null;
      // GB2312 is not supported by JDK. So I am using GBK.
      CharsetDecoder gbdc = Charset.forName("GBK").newDecoder();
      CharsetEncoder uxec = Charset.forName("UTF-16BE").newEncoder();
      CharsetEncoder u8ec = Charset.forName("UTF-8").newEncoder();
      ByteBuffer gbbb = null;
      ByteBuffer uxbb = null;
      ByteBuffer u8bb = null;
      CharBuffer cb = null;
      int count = 0;
      for (int i=1; i<=94; i++) {
         // Defining row settings
         if (i>=1 && i<=9) {
            reserved = false;
            name = "Graphic symbols";
         } else if (i>=10 && i<=15) {
            reserved = true;
            name = "Reserved";
         } else if (i>=16 && i<=55) {
            reserved = false;
            name = "Level 1 characters";
         } else if (i>=56 && i<=87) {
            reserved = false;
            name = "Level 2 characters";
         } else if (i>=88 && i<=94) {
            reserved = true;
            name = "Reserved";
         }
         // writing row title
         writeln();
         writeString("<p>");
         writeNumber(i);
         writeString(" Row: "+name);
         writeln();
         writeString("</p>");
         writeln();
         if (!reserved) {
            writeln();
            writeHeader();
           // looping through all characters in one row
            for (int j=1; j<=94; j++) {
               byte hi = (byte)(0xA0 + i);
               byte lo = (byte)(0xA0 + j);
               if (validGB(i,j)) {
                  // getting GB, UTF-16BE, UTF-8 codes
                  gbbb = ByteBuffer.wrap(new byte[]{hi,lo});
                  try {
                     cb = gbdc.decode(gbbb);
                     uxbb = uxec.encode(cb);
                     cb.rewind();
                     u8bb = u8ec.encode(cb);
                  } catch (CharacterCodingException e) {
                     cb = null;
                     uxbb = null;
                     u8bb = null;
                  }
               } else {
                  cb = null;
                  uxbb = null;
                  u8bb = null;
               }
               writeNumber(i);
               writeNumber(j);
               writeString(" ");
               if (cb!=null) {
                  writeByte(hi);
                  writeByte(lo);
                  writeString(" ");
                  writeHex(hi);
                  writeHex(lo);
                  count++;
               } else {
                  writeGBSpace();
                  writeString(" null");
               }
               writeString(" ");
               writeByteBuffer(uxbb,2);
               writeString(" ");
               writeByteBuffer(u8bb,3);
               if (j%2 == 0) {
                  writeln();
               } else {
                  writeString("   ");
               }
            }
            writeFooter();
         }
      }
      System.out.println("Number of GB characters worte: "+count);
   }
   public static void writeln() throws IOException {
      out.write(0x0D);
      out.write(0x0A);
   }
   public static void writeByte(byte b) throws IOException {
      out.write(b & 0xFF);
   }
   public static void writeByteBuffer(ByteBuffer b, int l)
      throws IOException {
      int i = 0;
      if (b==null) {
           writeString("null");
           i = 2;
      } else {
    for (i=0; i<b.limit(); i++) writeHex(b.get(i));
      }
      for (int j=i; j<l; j++) writeString("  ");
   }
   public static void writeGBSpace() throws IOException {
      out.write(0xA1);
      out.write(0xA1);
   }
   public static void writeString(String s) throws IOException {
      if (s!=null) {
         for (int i=0; i<s.length(); i++) {
            out.write((int) (s.charAt(i) & 0xFF));
         }
      }         
   }
   public static void writeNumber(int i) throws IOException {
      String s = "00" + String.valueOf(i);
      writeString(s.substring(s.length()-2,s.length()));
   }
   public static void writeHex(byte b) throws IOException {
      out.write((int) hexDigit[(b >> 4) & 0x0F]);
      out.write((int) hexDigit[b & 0x0F]);
   }
   public static void writeHeader() throws IOException {
      writeString("<pre>");
      writeln();
      writeString("Q.W. ");
      writeGBSpace();
      writeString(" GB   Uni. UTF-8 ");
      writeString("   ");
      writeString("Q.W. ");
      writeGBSpace();
      writeString(" GB   Uni. UTF-8 ");
      writeln();
      writeln();
   }
   public static void writeFooter() throws IOException {
      writeString("</pre>");
      writeln();
   }
   public static boolean validGB(int i,int j) {
      for (int l=0; l<b_out.length; l++) {
         if (i*100+j>=b_out[l] && i*100+j<=e_out[l]) return false; 
      }
      return true;
   }
}

探索GB2312与UNICODE转换方法及嵌入式系统实现 本文还有配套的精品资源,点击获取 简介:字符编码是IT领域文本数据处理的基础。本文详细解析GB2312和UNICODE这两种编码标准之间的转换过程,尤其关注嵌入式系统中的实现。GB2312是中国简体中文字符集,而UNICODE是一种国际通用字符集。转换通常需要使用转换表,因为它们的编码空间不同。嵌入式系统中,转换需要优化资源使用,提高速度,减少内存占用。源代码文件 ... 阅读详情

相关推荐

Unicode对应GBK编码范围详细整理

这是我整理了一星期,记过了好多测试、修改得出的结果,相信可以帮助在编写Unicode对应GBK编码的正则表达式的程序员一些帮助!

GB2312 Unicode转换表

源程序编辑软件将中文转化为GB2312编码,再下列的GB2312 Unicode转换表转为unicode。 实现2维数值,GB2312编码为递增,适合用二分法查找由GB2312码找Unicode码。 只含基本的汉字,符号未包括。 说明unit16 为16位的无符号整数unsigend short int #typedef  unsigned short int   u

瑞风轻拂 1万+

Unity3D用c#脚本调用前端javascript函数:H5获取unity - webgl 加载并初始化完成的消息

unity3d发布的Webgl 可以作为静态文件加载到H5页面中,并通过javascript 调用unity内置的C#脚本函数,详见Webgl调用unity api。而往往我们需要知道Webgl ready的消息,本文将给出unity 内部调用javascript函数的方案加以解决。

Bravo 2476

C/C++中,GB2312转Unicode

    嵌入到多个系统编程时常常出现编码问题,特别是中文,并且对于国标GB2312来说,不像UTF-8那样可以用算法直接转为unicode(传说是这么说的,我也没试过),所以GB到Unicode只能是一对一的转换。以前碰到过GB转为Unicode的难题,在网上找到了源码,我只是修改了一下查找的代码,将查找算法改为二分查找。   主要函数为:unsigned int gb_uni(uns

letterb的专栏 2390

OI 生涯回忆录 《Pilgrimage》

前言 于 NOI2020 后写下本文。 本文简单提及了在写作时尚能回忆起来的,在我的 OI 生涯中对我的影响重大的人、事、比赛等。 写作本文,旨在在回忆允许的范围内,对 OI 生涯进行一定程度上的梳理,总结。 开端 入门 我最早接触计算机程序设计,是在小学。 那时候,我的数学成绩不错,就被老师推荐去学习编程。 就这样,我在局前街小学的何静老师的指导下,走上了编程的道路。 小学时的编程,与其说是 “竞赛” ,不如说是 “兴趣班” 。 当时,包括我在内,很多小孩子天性是浮躁的。支撑我对着无聊的代码学下去的,并不

cz_xuyixuan的博客 1万+

深入解析MATLAB四旋翼仿真案例asbQuadcopter的核心模块与优化技巧

本文深入解析了MATLAB/Simulink中的四旋翼无人机官方案例asbQuadcopter,详细拆解了其指令、传感器、控制器、本体与环境等核心模块的工作原理。重点探讨了经典的PID双环控制结构、传感器噪声模拟、模型替换方法以及系统化的PID参数调优技巧,旨在帮助用户从“开箱即用”过渡到深度定制与优化,构建更精准的仿真模型。

weixin_29171087的博客 361

utf-8和gbk之间相互转换

经过项目测试时正确的:#include //Added for convert between utf-8 to gbk 20110314 by XYang int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen) { iconv_t cd; int rc; char **pin = &inbuf; char **pou

大象大象啥模样。。。 1953

3GPP协议解读_物理层系列(一)_物理层协议怎么看?

5G NR相关协议一般都在38系列,点进去以后可以看到,38.2xx系列为物理层相关协议,为了掌握物理层相关知识,应该怎么看协议呢?我建议从38.201读起,对38.2xx系列协议有一个整体的把握。

JCMLSY的博客 1329

从 GB2312 到 Unicode 转换表制作程式(JAVA)

/** * GB2312Unicde.java * Copyright (c) 1997-2003 by Dr. Herong Yang */import java.io.*;import java.nio.*;import java.nio.charset.*;class GB2312Unicde {   static OutputStream out = null;   static char

yanwenyuan0102的专栏 1338

基于 Vivado HLS 的 AC97 音频系统设计

介绍一种基于 FPGA 的 AC97 音频系统设计。系统的核心部件采用 Xilinx Atlys 的板载 Spartan6 XCSLX45 芯片,使用的工具为 Xilinx 的高层 次 综 合 技 术 Vivado HLS。首先使用 C /C + + 代码编写的算法描述系统的 FIR 滤波器; 然后按 照 Vivado HLS 编译工具的规范,将程序代码转换为 RTL 模型,快速、直接地生成对 应左右声道的 FIR IP 核和综合结果; 再结合互连的 MicroBlaze 处理器 IP 核,处理 一段立体声

qq_43416206的博客 327

高通平台N4单路输入的720P相机预览

N4的一路720P Camera作为MIPI摄像头使用

llw21680的专栏 165

和荣笔记 -- 从 Unicode 到 GB2312 转换表制作程式

在我发表了 GB2312 到 Unicode 的转换表以后,收到了读者信件,寻求 Unicode 到 GB2312 的转换表。 下面的程式便可以用来制作这样的转换表。程式的输出结果收入下一章之中。 1/***//**2*UnicodeGB2312.java3*Copyright(c)1997-2003byDr.HerongYang4*/5impor...

weixin_33686714的博客 132

车载网络测试实操源码_使用CAPL脚本进行UDS刷写及其自动化测试

本文主要讲解如何使用CAPL脚本进行UDS刷写及其自动化测试,并结合了几个测试实例进行介绍,希望对大家有所帮助。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 1554

和荣笔记 -- 从 GB2312 到 Unicode 转换表制作程式

这本手册里的字符与汉字编码列表由下面的程式所生成。   1/** *//**  2* GB2312Unicde.java  3* Copyright (c) 1997-2003 by Dr. Herong Yang  4*/  5import java.io.*;  6import java.nio.*;  7import java.nio.charset.*;  8class GB2...

weixin_34151004的博客 98

ComfyUI整合包、秋叶ComfyUI、Florence节点报错下载并加载Florence2模型No module named ‘timm.layers‘、ComfyUI报错解决

步骤操作1打开2地址栏输入cmd并回车3输入命令:4安装完成后重新打开 ComfyUI,执行工作流,即可解决报错。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1243

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

GB2312 和 UNICODE 映射表(1)

GB2312 和 UNICODE 映射表

bkspiderx的博客 1733

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Erlang 中文简体字 GB2312 转 unicode 的办法(2)

建立编码转换表,可用任何支持unicode的语言,我用的是Python。def to_unicode():    f = open(gb2u.erl,w)    for row in range(176,248):        for col in range(1,95):            ch1 = chr(row)            ch2 = ch

lawme的专栏 2645

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

GB2312 Unicode转换表实现跨平台utf8转码unicode

在GSM模块中,为发送中文短信,采用pdu发送,需要unicode编码。源程序编辑软件将中文转化为GB2312编码,再下列的GB2312 Unicode转换表转为unicode。 实现2维数值,GB2312编码为递增,适合用二分法查找由GB2312码找Unicode码。 只含基本的汉字,符号未包括。 说明unit16 为16位的无符号整数unsigend short int ht

ghevinn欢迎您光临 2126

GB2312转unicode

实现2维数值,GB2312编码为递增,适合用二分法查找由GB2312码找Unicode码。 只含基本的汉字,符号未包括。 说明unit16 为16位的无符号整数unsigend short int #typedef  unsigned short int   uint16;   #define MAX_UNI_INDEX  6768 const uint16 GB_

a369000753的博客 1万+

ASCII,UNICODE,UTF,GB2312,GBK详解

 一、概念                  1,ASCII         ASCII(American Standard Code for Information Interchange),中文名称为美国信息交换标准代码。是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统。ASCII码又分为标准ASCII码和扩展ASC

passion_wu128的专栏 2252

Erlang 中文简体字 GB2312 转 unicode 的办法(1)

这些天,一直在琢磨Erlang中文简体字转unicode的办法。想到过,用 port,C或Python外部模块;用erts,dict,array,但不仅都太烦琐,甚至没怎么看懂。编程需要考虑的两大问题:功能与效率。效率,不仅是程序运行效率,还有编程工作效率。代码越简单效率越高。用简单的工具和办法,显不出学术理论水平,所以,常见玩高深的。中文简体字转unicode,不是高深的问题,涉

lawme的专栏 4638

.NET Compact Framework中解码GB2312

昨天在制作“掌上IP通”调用纯真IP数据库的时候,遇到了GB2312解码的问题。我想,在.NET平台上本来可以用System.Text.Encoding.GetEncoding("GB2312")得到GB2312的解码器的,在.NET Compact Framework中也可以使用这个方法。查阅MSDN,也确实能够支持。但十分遗憾的是,当在PDA上执行此条语句的时候,返回的却是null。如果直接使...

weixin_34419321的博客 201

UTF8 到GB2312 的 转换

这段代码不仅仅是含有UTF8到Unicode的转换,还包括Gb2312,Unicode 到Gb2312 如过不使用Windows API的话,那么自己因该建立一个转化表,这样效率才会好,因为我一时没有找到这种表。如果谁有请贴上来。谢谢。#include string.h>#include tchar.h>using namespace std;int GetNo(char ch)...{ 

zwh37333的专栏 1378
上一篇: gb2312和UTF-8的区别
下一篇: Unsupported major.minor version 49.0
2022_test_2022
博客等级 码龄22年 28粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值