-
2021-02-25 18:58:09
本文实现将GB2312编码转换成汉字,并简单了解一下GB2312。
GB2312是信息交换汉字编码字符集,适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆。使用区位码表示方式,对所收汉字进行了“分区”处理,每区含有94个汉字/符号。
01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。
EG:“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。
注:每个汉字及符号以两个字节来表示。
将GB2312编码转化为汉字:
public void App() throws Exception{
String string = "CCB8B9FAC6BD";
String result = stringToGbk(string);
System.out.println(result);
}
//将gbk编码转换成汉字
public String stringToGbk(String string) throws Exception{
byte[] bytes = new byte[string.length() / 2];
for(int i = 0; i < bytes.length; i ++){
byte high = Byte.parseByte(string.substring(i * 2, i * 2 + 1), 16);
byte low = Byte.parseByte(string.substring(i * 2 + 1, i * 2 + 2), 16);
bytes[i] = (byte) (high << 4 | low);
}
String result = new String(bytes, "gbk");
return result;
}
第一个字节称为“高位字节”(也称“区字节)”,第二个字节称为“低位字节”(也称“位字节”)。
“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了 0xA1-0xFE(把01-94加上 0xA0)。
由于一级汉字从16区起始,汉字区的“高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE,占用的码位是 72*94=6768。其中有5个空位是D7FA-D7FE。
EG:“啊”字以两个字节,0xB0(第一个字节) 0xA1(第二个字节)储存。
区位码=区字节+位字节(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)
更多相关内容 -
汉字GB2312编码查询工具
2020-12-08 01:53:17简单的汉字GB2312编码查询工具,暂时只支持查询汉字,能查一些中文字符,英文字符会被识别错误!!!ASCII表中包含的那些字符不可以用,适用于单片机开发者做字符取模时查询编码 -
gb2312编码与unicode编码对应表
2020-07-28 14:10:23unicode编码与gb2312编码对应表,其中unicode部分是propertises文件的key,gb2312编码是propertises文件的value部分。利用程序读取键值对,就可以找到unicode对应的gb2312编码。 -
GB2312编码对照表
2018-07-04 18:12:08GB2312简体中文编码表 GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB 2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。整个字符集... -
js对中文字符串进行gb2312编码解码
2020-07-30 12:53:28纯js对字符串进行gb2312编码解码,如“中国”编码后成为:“%D6%D0%B9%FA”,很好用的 -
php实现utf-8和GB2312编码相互转换函数代码
2020-10-27 16:35:40php实现utf-8和GB2312编码相互转换的一个函数,有需要的朋友可以参考下 -
unicode编码转GB2312编码 C代码
2019-07-09 13:42:37通过二分法查表的方法,把unicode编码转化为gbk编码。调用函数即可实现 UCToGB2312(入参unicode字符串),返回值为gbk字符串 -
解决gb2312编码导致乱码问题
2021-06-09 09:35:26使用方法见本人博客《IE中js往后台传输中文乱码》 -
JS将汉字转换为GB2312编码
2018-05-16 11:16:19js 原生只支持utf-8,扩展 js转换成GB2312,js 原生只支持utf-8,扩展 js转换成GB2312,js 原生只支持utf-8,扩展 js转换成GB2312, -
unicode编码与gb2312编码对应表
2020-07-28 14:05:09unicode编码与gb2312编码对应表,其中gb2312部分是按从小到大排列的,方便查找。主要用于C语言程序中。可以使用二分法查找,提高效率。 -
gb2312编码表
2016-11-11 21:33:29gb2312编码表 -
GBK编码表,对GB2312编码的有效扩展。
2022-06-15 14:59:19GBK编码,是对GB2312编码的扩展,因此完全兼容GB2312-80标准。GBK编码依然采用双字节编码方案,其编码范围:8140-FEFE,剔除xx7F码位,共23940个码位。共收录汉字和图形符号21886个,其中汉字(包括部首和构件)... -
unicode编码转GB2312编码
2020-06-16 22:43:47C++实现 unicode编码转GB2312编码 C++实现 unicode编码转GB2312编码 使用简单,可二次开发 -
ASP中Utf-8与Gb2312编码转换乱码问题的解决方法 页面编码声明
2020-10-28 04:21:12ASP程序在同一个站点中,如果有UTF-8编码的程序,又有GB2312编码的程序时,在浏览UTF-8编码的页面后,再浏览当前网站GB2312的页面,GB2312编码的页面就会出现乱码 -
idea中引入了gb2312编码的文件的解决方法
2020-08-25 17:17:02主要介绍了idea中引入了gb2312编码的文件的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
java 字符串转换成gb2312编码格式
2021-10-12 17:20:44public static String convertStr(String... //先把字符串按gb2312转成byte数组 byte[] bytes = msg.getBytes("gb2312"); StringBuilder gbString = new StringBuilder(); for (byte b : bytes) { // 再用Integ.public static String convertStr(String msg) throws UnsupportedEncodingException { //先把字符串按gb2312转成byte数组 byte[] bytes = msg.getBytes("gb2312"); StringBuilder gbString = new StringBuilder(); for (byte b : bytes) { // 再用Integer中的方法,把每个byte转换成16进制输出 String temp = Integer.toHexString(b); //判断进行截取 if(temp.length()>=8){ temp = temp.substring(6, 8); } gbString.append("%" + temp); } return gbString.toString(); }
再main中运行。打印如下
-
GB2312编码和UTF-8互转(c语言实现)
2013-01-01 14:55:23GB2312编码与utf-8编码的字符串的转换,主要使用windows api函数MultiByteToWideChar和WideCharToMultiByte,代码简洁,经测试可用 -
C# 实现汉字与GB2312编码的转换
2022-02-21 10:29:30} //将汉字转换成GB2312编码 private byte[] StringToBytes(string TheString) { Encoding fromEcoding = Encoding.GetEncoding("UTF-8");//返回utf-8的编码 Encoding toEcoding = Encoding.GetEncoding("gb2312");...using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace HanZiEncoding
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}//将汉字转换成GB2312编码
private byte[] StringToBytes(string TheString)
{
Encoding fromEcoding = Encoding.GetEncoding("UTF-8");//返回utf-8的编码
Encoding toEcoding = Encoding.GetEncoding("gb2312");
byte[] fromBytes = fromEcoding.GetBytes(TheString);
byte[] tobytes = Encoding.Convert(fromEcoding, toEcoding, fromBytes);//将字节数组从一种编码转换为另一种编码
return tobytes;}
//将GB2312编码转换成汉字
private string BytesToString(byte[] bytes)
{
string myString;
Encoding fromEcoding = Encoding.GetEncoding("gb2312");
Encoding toEcoding = Encoding.GetEncoding("UTF-8");
byte[] toBytes = Encoding.Convert(fromEcoding, toEcoding, bytes);
myString = toEcoding.GetString(toBytes);//将字节数组解码成字符串
return myString;
}
private void button1_Click(object sender, EventArgs e)
{
byte[] stringToByte = StringToBytes(textBox1.Text);
textBox2.Text = "";
foreach(byte myByte in stringToByte)
{
string Str = myByte.ToString("x").ToUpper();
textBox2.Text += "0x" + (Str.Length == 1 ? "0" + Str : Str) + " ";
}
}private void button2_Click(object sender, EventArgs e)
{
byte[] data = new byte[textBox3.Text.Length / 2];
int i;
try
{
string buffer = textBox3.Text;
buffer = buffer.Replace("0x", string.Empty);
buffer = buffer.Replace(" ", string.Empty);
for (i = 0; i < buffer.Length / 2; i++)
{
data[i] = Convert.ToByte(buffer.Substring(i * 2, 2), 16);
}
textBox4.Text = BytesToString(data);
}
catch (Exception)
{
MessageBox.Show("数据转换错误,请输入数字");
}
}
}
}
-
汉字编码转换工具(汉字与utf-8转换 gb2312转换 unicode 转转
2019-11-30 11:01:27汉字编码转换工具,实现了汉字与 utf-8 gb2312 unicode 互转,开发者多百多度 qq:547170882 -
unicode编码转gb2312编码并显示中文(c&java)
2020-07-28 14:30:05unicode编码转gb2312编码并显示中文(c&java) unicode编码与gb2312编码没有线性关系,只能通过使用编码表的方式查找。 C语言 编码表中,前半部分是gb2312编码,后部才是unicode编码。在程序中我们要用值来...unicode编码转gb2312编码并显示中文(c&java)
- unicode编码与gb2312编码没有线性关系,只能通过使用编码表的方式查找。
C语言
-
编码表中,前半部分是gb2312编码,后部才是unicode编码。在程序中我们要用值来寻找键。
-
C语言的思路是,把两个对应的编码表作为头文件引入到程序中。可以让我们能够,很好的使用它。在使用之前,我们需要把编码表进行处理。让unicode编码按顺序排列。
-
文字部分,我们不需要存储,当我们找出gb2312编码之后。只用把高低两个字节的16进制数,存储到两个char类型的变量中,使用%c%c进行输出。电脑会判断出是中文,会把中文显示出来。
原始设计
- 开始我的设计是unicode与gb2312都可以互相转换,但是由于时间问题。gb2312只完成了一部分,这部分代码,我注释掉了。如果想要使用,可以自行修改。
- gb2312转unicode,需要把取6位变取4位。这步完成之后,应该就可以使用了。
- 选择一次处理一位,而不是全部读取出来,是因为避免文件太大。节省空间。
吐槽
- 代码,开始只想在main中调用函数。可是由于字符串传递,不熟悉。被放弃了。导致main函数中一堆垃圾,还分出一堆子函数。传参只能传递,int类型。垃圾!!!
- 由于头文件过大,在编译时可能出现卡顿现象。别急,等等就好了。
- 建议使用我排好序的头文件,自己编写。因为代码太乱。我自己都不想看,艹。
- 程序没有鲁棒性,没有输入码的判断,最大的问题。
流程图
- 判断字符数量,主要作用为下一次的分割计算需要分割的次数。
- 每次取六位,前两位是\u,后四位是其对应的16进制编码。
- 因为unicode编码有大致的范围,所以先判断是否在gb2312与之对应的范围。如果不在,就不用查找了。减少查找的次数。
- 如果在大概范围之类,就可以进行查找。因为unicode编码是按顺序的。所以使用二分法进行查找。
源.c
#include<stdio.h> #include<string.h> #include<stdlib.h> #include"g.h" #include"u.h" //#define u_code 1 //#define g_code 2 int readfile();//读取文件,处理文件,判断大小 int isright(unsigned short origin_code,int method);//判断编码正确与否 int search_gb2132(unsigned short origin_code, int method);//搜索 void main() { int u_code=1; int some; int int_code; char str_begin[3] = { 0 }; int flag; int str_begin_num; long long_code; char str[4] = {0}; char* end; int code_right; int str_num; /* printf("1.unicode转gb2132\n2.gb2132转unicode\n输入你的选择:"); scanf("%d",&some); if (some==1) { u_code = 1; }*/ FILE* fp; fp = fopen("D:\\vs\\target.txt", "rb"); //printf("%d", flag); flag = readfile(); while (flag > 0) { flag--; //printf("%d", flag); str_begin_num = fread(str_begin, sizeof(char), 2, fp); str_num = fread(str, sizeof(char), 4, fp); long_code = strtol(str, &end, 16); int_code = (int*)long_code; code_right = isright(int_code, u_code); if (code_right == 1) { search_gb2132(int_code, u_code); } } fclose(fp);//关闭文件并保存 FILE* fpp; fpp = fopen("c:\\123.txt", "a+"); fprintf(fpp, "\n\n\n"); fclose(fpp); fclose(fp); return 0; } //搜索,处理 //method,1 u-->gb int search_gb2132(unsigned short origin_code, int method) { char code_c[2]; unsigned short end_code; int code = -1; int left = 0; int right = 7444; int num; int num2=0; FILE* fp; if (method == 1)//通过unicode,查gb2132 { while (left <= right) {//在while循环中直到有一个条件结束搜索 num = (left + right) / 2; if (uni_map[num].value > origin_code) { left = num + 1; //printf("%d\n",left); } else if (uni_map[num].value < origin_code) { right = num - 1; //printf("%d\n", right); } else { code = uni_map[num].key; break;//一定要break跳出循环 } } } //else //{ // while (left <= right) // {//在while循环中直到有一个条件结束搜索 // num = (left + right) / 2; // if (gb2312_map[num].key < origin_code) // { // left = num + 1; // //printf("%d\n",left); // } // else if (gb2312_map[num].key > origin_code) // { // right = num - 1; // //printf("%d\n", right); // } // else // { // code = gb2312_map[num].value; // break;//一定要break跳出循环 // } // } //} if (code == -1) { printf("[\\u%X编码有误]", origin_code); fp = fopen("c:\\123.txt", "a+"); fprintf(fp, "[\\u%X编码有误]", origin_code); } else { end_code = code; //printf("%x\n", a); code_c[0] = end_code & 0x0ff; //printf("%x\n",c[0]); code_c[1] = end_code >> 8 & 0x0ff; //printf("%x\n", c[1]); printf("%c%c", code_c[1], code_c[0]); fp = fopen("c:\\123.txt", "a+"); fprintf(fp, "%c%c", code_c[1], code_c[0]); } fclose(fp); return code; } //判断编码正确与否 int isright(unsigned short origin_code,int method) { FILE* fp; if (method==1) { if (origin_code < 0x00a4 || origin_code>0xffe5) { printf("[\\u%X编码有误]", origin_code); FILE* fp; fp = fopen("c:\\123.txt", "a+"); fprintf(fp, "[\\u%X编码有误]", origin_code); fclose(fp); return 0; } } /*else { if (origin_code < 0xa1a1 || origin_code > 0xf7fe) { printf("[%X编码有误]", origin_code); FILE* fp; fp = fopen("c:\\123.txt", "a+"); fprintf(fp, "[\\u%X编码有误]", origin_code); fclose(fp); return 0; } }*/ return 1; } //读取文件,处理文件,判断大小 int readfile() { int address[50]; int len=0; int flag; //printf("输入编码文件地址,注意地址最长50字节且\\需输入两次"); //gets(address); FILE* fp; fp=fopen("D:\\vs\\target.txt", "rb"); if (fp == NULL) //当文件不存在,或者无法创建时会报错; { printf("读取文件失败!!!\n"); } while (!feof(fp)) { fgetc(fp); len++; } rewind(fp);//文件指针回到开头 flag = (len - 1) / 6; fclose(fp);//关闭文件并保存 return flag; }
g.h
- gb2312按顺序排列的头文件
u.h
- unicode按顺序排列
unicode顺序排列头文件
结果展示
java
流程图
- java可以直接对gbk编码进行显示中文。但是gb2312是gbk的子集,为了避免显示出某些gb2312中没有的字符,所以还要查表。
- 把unicode作为key,把gb2312编码作为value。存储到propertises文件中,进行查找。为什么这样,因为在我脑海中这样查的快。(不知道对不对)
- 在查询到之后,在显示就好了。
吐槽
- 看起来不错,就是没有鲁棒性。一堆垃圾。
- 如果要做,建议添加一个检查模块,就可以使程序更好。本来是要做的,但是时间不够,就放弃了。
java文件
package demo; import java.io.*; import java.util.Properties; public class Demo03 { public static String stringToGbk(String string) throws Exception{ System.out.println(string); byte[] bytes = new byte[string.length() / 2]; for(int i = 0; i < bytes.length; i ++){ byte high = Byte.parseByte(string.substring(i * 2, i * 2 + 1), 16); //0 1 2 3 byte low = Byte.parseByte(string.substring(i * 2 + 1, i * 2 + 2), 16);//1 2 3 4 bytes[i] = (byte) (high << 4 | low); } String result = new String(bytes, "gbk"); return result; } public static void main(String[] args) throws Exception { Properties prop = new Properties(); //1.创建一个FileInputStream对象,构造方法中需要绑定数据源 FileInputStream fis = new FileInputStream("D:\\ja\\target.txt"); //1.创建FileOutputStream对象,构造方法中传入写入的目的地 FileOutputStream fos = new FileOutputStream("D:\\ja\\1.txt"); //2.使用FileInputStream对象中的方法,read,读取文件 int l=0; byte[] bytes = new byte[6]; while((l=fis.read(bytes,0,6))!=-1){//结束标记-1 String key = new String(bytes); //2.使用Properties集合中的load,把硬盘中的数据(键值对),读取到集合中使用 prop.load(new FileReader("D:\\idea\\ma\\untitled\\src\\demo\\utogb.properties")); //3.取出16进制数 String[] key1=key.split("u",2); //System.out.println(key1[1]); //通过键找值 String value = prop.getProperty(key1[1]); //System.out.println(key+"="+value); //判断表中是否包含此码 if(value==null){ System.out.println(key1[1]+"未找到此码"); fos.write(("["+key1[1]+"未找到此码]").getBytes()); continue; } String result = stringToGbk(value); //2.调用FileOutputStream对象中的方法write,把数据写入文件中 fos.write(result.getBytes()); System.out.println(result); } //3.释放资源 fis.close(); fos.close(); } }
propertises键值对
unicode与gb2312键值对propertises文件
结果展示
-
GB2312,UTF8,UCS2汉字编码生成与转换工具
2021-12-28 10:42:20GB2312,UTF8,UCS2汉字编码生成与转换 -
gb2312和utf-8文件编码互换工具 v1.05-ASP源码.zip
2021-12-13 22:03:30ASP源码,压缩包解压密码:www.cqlsoft.com -
GB2312编码表、字库下载以及移植教程.zip
2019-07-04 14:38:55本资源主要为GB2312编码表、字库下载以及移植教程,非常详细,分享给各位小伙伴 -
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2020-10-30 17:15:07可以把编码转换成 gb2312编码lib.UTF8toGB2312.js -
GB2312编码汉字库(16*16点阵)
2018-11-16 09:59:14GB2312编码下的16*16点阵汉字库(先左后右先上后下),宋体12号或小4字体大小(简体) -
汉字GB2312编码字符集
2019-04-22 18:19:52GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB 2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。整个字符集分成94个区,每区有94个位... -
GB2312简体中文编码表(完整版)
2017-10-31 09:17:48GB2312简体中文编码表(完整版) 所有简体汉字和英文字符的编码都有