繁简体(GBBig5)字符串转化的JAVA方式实现

繁体简体转换的4中方法 1、API方法,这是Windows下开发最常用最简单的方法,利用Windows系统自带的API函数,寥寥数行代码即可完成,典型的例子就是 Windows2000自带的例子,核心代码可以简单列一个 function GB2312ToBIG5(GB2312Str: string): AnsiString; var iLen: Integer; PGBCHSStr: PChar; //G 阅读详情
  http://www.zeali.net/entry/19

本文提供一个java实现中文字符繁简体互换的zip包以及主要的源代码实现说明。

繁简体(GB<=>Big5)中文字符的转化实现原理很简单,就是根据两种码表的编码规则,创建两者之间的字符对应关系表,通过程序读取这个映射表来自动查出另一种编码方式下对应字符的字节编码,从而进行逐字节的内容替换。

主功能实现的GB2Big5.java源代码如下: 已经加入里系统支持的一个类库的源代码,这个是完整版。

  1. package net.java2000.tools;
  2. import java.io.BufferedOutputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. /**
  7.  * 用来处理GB2312/BIG5码字符互相转换的类.<br>
  8.  * 需要两个码表文件: gb-big5.table,/zeal/util/big5-gb.table.<br>
  9.  * 这两个码表可以根据具体情况补充映射不正确的码.
  10.  */
  11. public class GB2Big5 {
  12.   private static GB2Big5 pInstance = null;
  13.   private String s_big5TableFile = null;
  14.   private String s_gbTableFile = null;
  15.   private byte[] b_big5Table = null;
  16.   private byte[] b_gbTable = null;
  17.   /** 指定两个码表文件来进行初始化 */
  18.   private GB2Big5(String sgbTableFile, String sbig5TableFile) throws NullPointerException {
  19.     s_big5TableFile = sbig5TableFile;
  20.     s_gbTableFile = sgbTableFile;
  21.     if (null == b_gbTable) {
  22.       b_gbTable = getBytesFromFile(sgbTableFile);
  23.     }
  24.     if (null == b_big5Table) {
  25.       b_big5Table = getBytesFromFile(sbig5TableFile);
  26.     }
  27.     if (null == b_gbTable) {
  28.       throw new NullPointerException("No gb table can be load");
  29.     }
  30.     if (null == b_big5Table) {
  31.       throw new NullPointerException("No big5 table can be load");
  32.     }
  33.   }
  34.   public static synchronized GB2Big5 getInstance() {
  35.     // return getInstance("d://gb-big5.table","d://big5-gb.table");
  36.     return getInstance("/net/java2000/tools/gb-big5.table", "/net/java2000/tools/big5-gb.table");
  37.   }
  38.   public static synchronized GB2Big5 getInstance(String sgbTableFile, String sbig5TableFile) {
  39.     if (null == pInstance) {
  40.       try {
  41.         pInstance = new GB2Big5(sgbTableFile, sbig5TableFile);
  42.       } catch (Exception e) {
  43.         System.err.println(e.toString());
  44.         pInstance = null;
  45.       }
  46.     }
  47.     return pInstance;
  48.   }
  49.   /**
  50.    * 把gbChar对应的big5字符替换掉,用来更新码表文件. 一般当发现字符映射不正确的时候可以通过这个方法来校正.
  51.    */
  52.   protected synchronized void resetBig5Char(String gbChar, String big5Char) throws Exception {
  53.     byte[] Text = new String(gbChar.getBytes(), "GBK").getBytes("GBK");
  54.     byte[] TextBig5 = new String(big5Char.getBytes(), "BIG5").getBytes("BIG5");
  55.     int max = Text.length - 1;
  56.     int h = 0;
  57.     int l = 0;
  58.     int p = 0;
  59.     int b = 256;
  60.     for (int i = 0; i < max; i++) {
  61.       h = (int) (Text[i]);
  62.       if (h < 0) {
  63.         h = b + h;
  64.         l = (int) (Text[i + 1]);
  65.         if (l < 0) {
  66.           l = b + (int) (Text[i + 1]);
  67.         }
  68.         if (h == 161 && l == 64) {
  69.           ; // do nothing
  70.         } else {
  71.           p = (h - 160) * 510 + (l - 1) * 2;
  72.           b_gbTable[p] = TextBig5[i];
  73.           b_gbTable[p + 1] = TextBig5[i + 1];
  74.         }
  75.         i++;
  76.       }
  77.     }
  78.     BufferedOutputStream pWriter = new BufferedOutputStream(new FileOutputStream(s_gbTableFile));
  79.     pWriter.write(b_gbTable, 0, b_gbTable.length);
  80.     pWriter.close();
  81.   }
  82.   /**
  83.    * 把big5Char对应的gb字符替换掉,用来更新码表文件. 一般当发现字符映射不正确的时候可以通过这个方法来校正.
  84.    */
  85.   protected synchronized void resetGbChar(String big5Char, String gbChar) throws Exception {
  86.     byte[] TextGb = new String(gbChar.getBytes(), "GBK").getBytes("GBK");
  87.     byte[] Text = new String(big5Char.getBytes(), "BIG5").getBytes("BIG5");
  88.     int max = Text.length - 1;
  89.     int h = 0;
  90.     int l = 0;
  91.     int p = 0;
  92.     int b = 256;
  93.     for (int i = 0; i < max; i++) {
  94.       h = (int) (Text[i]);
  95.       if (h < 0) {
  96.         h = b + h;
  97.         l = (int) (Text[i + 1]);
  98.         if (l < 0) {
  99.           l = b + (int) (Text[i + 1]);
  100.         }
  101.         if (h == 161 && l == 64) {
  102.           ; // do nothing
  103.         } else {
  104.           p = (h - 160) * 510 + (l - 1) * 2;
  105.           b_big5Table[p] = TextGb[i];
  106.           b_big5Table[p + 1] = TextGb[i + 1];
  107.         }
  108.         i++;
  109.       }
  110.     }
  111.     BufferedOutputStream pWriter = new BufferedOutputStream(new FileOutputStream(s_big5TableFile));
  112.     pWriter.write(b_big5Table, 0, b_big5Table.length);
  113.     pWriter.close();
  114.   }
  115.   /** 把gb2312编码的字符串转化成big5码的字节流 */
  116.   public byte[] gb2big5(String inStr) throws Exception {
  117.     if (null == inStr || inStr.length() <= 0) {
  118.       return "".getBytes();
  119.       // return "";
  120.     }
  121.     byte[] Text = new String(inStr.getBytes(), "GBK").getBytes("GBK");
  122.     int max = Text.length - 1;
  123.     int h = 0;
  124.     int l = 0;
  125.     int p = 0;
  126.     int b = 256;
  127.     byte[] big = new byte[2];
  128.     for (int i = 0; i < max; i++) {
  129.       h = (int) (Text[i]);
  130.       if (h < 0) {
  131.         h = b + h;
  132.         l = (int) (Text[i + 1]);
  133.         if (l < 0) {
  134.           l = b + (int) (Text[i + 1]);
  135.         }
  136.         if (h == 161 && l == 64) {
  137.           big[0] = big[1] = (byte) (161 - b);
  138.         } else {
  139.           p = (h - 160) * 510 + (l - 1) * 2;
  140.           try {
  141.             big[0] = (byte) (b_gbTable[p] - b);
  142.           } catch (Exception e) {
  143.             big[0] = 45;
  144.           }
  145.           try {
  146.             big[1] = (byte) (b_gbTable[p + 1] - b);
  147.           } catch (Exception e) {
  148.             big[1] = 45;
  149.           }
  150.         }
  151.         Text[i] = big[0];
  152.         Text[i + 1] = big[1];
  153.         i++;
  154.       }
  155.     }
  156.     return Text;
  157.     // return new String(Text);
  158.   }
  159.   /** 把big5码的字符串转化成gb2312码的字符串 */
  160.   public String big52gb(String inStr) throws Exception {
  161.     if (null == inStr || inStr.length() <= 0) {
  162.       return "";
  163.     }
  164.     byte[] Text = new String(inStr.getBytes(), "BIG5").getBytes("BIG5");
  165.     int max = Text.length - 1;
  166.     int h = 0;
  167.     int l = 0;
  168.     int p = 0;
  169.     int b = 256;
  170.     byte[] big = new byte[2];
  171.     for (int i = 0; i < max; i++) {
  172.       h = (int) (Text[i]);
  173.       if (h < 0) {
  174.         h = b + h;
  175.         l = (int) (Text[i + 1]);
  176.         if (l < 0) {
  177.           l = b + (int) (Text[i + 1]);
  178.         }
  179.         if (h == 161 && l == 161) {
  180.           big[0] = (byte) (161 - b);
  181.           big[1] = (byte) (64 - b);
  182.         } else {
  183.           p = (h - 160) * 510 + (l - 1) * 2;
  184.           try {
  185.             big[0] = (byte) (b_big5Table[p] - b);
  186.           } catch (Exception e) {
  187.             big[0] = 45;
  188.           }
  189.           try {
  190.             big[1] = (byte) (b_big5Table[p + 1] - b);
  191.           } catch (Exception e) {
  192.             big[1] = 45;
  193.           }
  194.         }
  195.         Text[i] = big[0];
  196.         Text[i + 1] = big[1];
  197.         i++;
  198.       }
  199.     }
  200.     return new String(Text);
  201.   }
  202.   /** 把文件读入字节数组,读取失败则返回null */
  203.   private static byte[] getBytesFromFile(String inFileName) {
  204.     try {
  205.       InputStream in = GB2Big5.class.getResourceAsStream(inFileName);
  206.       byte[] sContent = StreamConverter.toByteArray(in);
  207.       in.close();
  208.       return sContent;
  209.       /*
  210.        * java.io.RandomAccessFile inStream = new java.io.RandomAccessFile(inFileName,"r"); byte[] sContent = new byte[ (int)
  211.        * (inStream.length())]; inStream.read(sContent); inStream.close(); return sContent;
  212.        */
  213.     } catch (Exception e) {
  214.       e.printStackTrace();
  215.       return null;
  216.     }
  217.   }
  218.   public static void main(String[] args) throws Exception {
  219.     if (args.length < 2) {
  220.       System.out.println("Usage: net.java2000.tools.GB2Big5 [-gb | -big5] inputstring");
  221.       System.exit(1);
  222.       return;
  223.     }
  224.     boolean bIsGB = true;
  225.     String inStr = "";
  226.     for (int i = 0; i < args.length; i++) {
  227.       if (args[i].equalsIgnoreCase("-gb")) {
  228.         bIsGB = true;
  229.       } else if (args[i].equalsIgnoreCase("-big5")) {
  230.         bIsGB = false;
  231.       } else {
  232.         inStr = args[i];
  233.       }
  234.     }
  235.     GB2Big5 pTmp = GB2Big5.getInstance();
  236.     String outStr = "";
  237.     if (bIsGB) {
  238.       outStr = pTmp.big52gb(inStr);
  239.     } else {
  240.       outStr = new String(pTmp.gb2big5(inStr), "BIG5");
  241.     }
  242.     System.out.println("String [" + inStr + "] converted into:/n[" + outStr + "]");
  243.   }
  244. }
  245. class StreamConverter {
  246.   public StreamConverter() {
  247.   }
  248.   public static byte[] toByteArray(InputStream input) throws IOException {
  249.     int status = 0;
  250.     int totalBytesRead = 0;
  251.     int blockCount = 1;
  252.     byte dynamicBuffer[] = new byte[5000 * blockCount];
  253.     byte buffer[] = new byte[5000];
  254.     boolean endOfStream = false;
  255.     do {
  256.       if (endOfStream)
  257.         break;
  258.       int bytesRead = 0;
  259.       if (input.available() != 0) {
  260.         status = input.read(buffer);
  261.         endOfStream = status == -1;
  262.         if (!endOfStream)
  263.           bytesRead = status;
  264.       } else {
  265.         status = input.read();
  266.         endOfStream = status == -1;
  267.         buffer[0] = (byte) status;
  268.         if (!endOfStream)
  269.           bytesRead = 1;
  270.       }
  271.       if (!endOfStream) {
  272.         if (totalBytesRead + bytesRead > 5000 * blockCount) {
  273.           blockCount++;
  274.           byte newBuffer[] = new byte[5000 * blockCount];
  275.           System.arraycopy(dynamicBuffer, 0, newBuffer, 0, totalBytesRead);
  276.           dynamicBuffer = newBuffer;
  277.         }
  278.         System.arraycopy(buffer, 0, dynamicBuffer, totalBytesRead, bytesRead);
  279.         totalBytesRead += bytesRead;
  280.       }
  281.     } while (true);
  282.     byte result[] = new byte[totalBytesRead];
  283.     if (totalBytesRead != 0)
  284.       System.arraycopy(dynamicBuffer, 0, result, 0, totalBytesRead);
  285.     return result;
  286.   }
  287. }

由于这里不能上传附件,所需要的2个字体对照表,请到这里下载,或者到原作者的网页下载。那里还有完整的项目包

http://www.java2000.net/p8902















<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
big5gb类库 立即下载

相关推荐

繁体BIG5编码表

繁体BIG5编码表,可用于查看繁体BIG5编码号或对应汉字。

java big5_使用java将BIG5繁体转GBK繁体

现在项目需求是使用java将BIG5繁体转GBK的繁体、我看了一下文档发现是GBK-3是繁体、找了一份源码。但是不知道怎么改,无从下手请大家帮我看看,谢谢了。package com.big;import java.io.DataInputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotF...

weixin_31967551的博客 788

通过EMIF接口实现FPGA与DSP的高速连接(方法)

请注意,具体的连接细节和步骤可能会根据所使用的FPGA和DSP型号以及特定的应用需求而有所不同。开发DSP和FPGA上的软件,以实现数据交换和处理。根据系统的具体需求,对FPGA和DSP的接口逻辑进行优化,以减少延迟、提高数据吞吐量或降低资源消耗。它通常支持多种类型的存储器,如SRAM、DRAM、ROM等,以及通过特定的接口与FPGA连接。对于FPGA,需要编程来实现与DSP的接口逻辑,包括地址译码、数据传输、时序控制等。在连接完成后,进行详细的调试和测试,以确保数据能够在DSP和FPGA之间正确传输。

AigcFox的博客 4584

Discuz字符编码转换类2

*/ define('CODETABLE_DIR', DISCUZ_ROOT.'./source/include/table/'); class Chinese { var $table = ''; var $iconv_enabled = false; var $convertbig5 = false; var $unicode_table = array(); var $config = array ( 'SourceLang' =&gt; '

hudeyong926的专栏 254

用angr找到strcpy的栈溢出漏洞

这篇文章其实是分析angr文档里给出的一个挖漏洞的小例子。 原文链接在此:https://docs.angr.io/examples#beginner-vulnerability-discovery-example-strcpy_find 这是第一个用angr在二进制里找可利用条件的教程。第一个例子是一个非常简单的程序。这个angr脚本会从程序的entry到strcpy找到一条路径。(只有我们能够控制strcpy的参数的时候) 为了找到正确的路径,angr需要去算一个密码参数,算这个密码,angr只要2s

^_^ 1220

【UV打印机】PrintExp打印软件教程(六)-高级模式(马达)

输入高级模式密码进入高级模式高级模式界面有操作栏、控制栏、参数栏及参数界面操作栏名称功能说明文件加载数据从板卡加载参数保存将参数保存到主板退出退出高级模式固件导入固件导入配套版本下的固件配置*xpcfx导出固件导出当前使用的固件配置*xpcfx导入波形文件导入对应的波形文件*waf操作初始化系统继续初始化动作复位X轴复位回原点控制栏可进行小车运动、闪喷操作(此闪喷为点击进行闪喷,不受平台位置限制),无清洗功能。

Print World的专栏 3112

php gb2312转big5 函数

本文章来至源码世界 http://www.ymsky.net/views/51397.shtml function GB2312toBIG5($c) { $f = fopen(CODETABLE_DIR.$this->config['GBtoBIG5_table'], ‘r’); $max=strlen($c)-1; for($i = 0;$i =160) { $l=ord($

凡仔科技的专栏 961

算法笔记 经典取石子游戏总结 博弈论

经典取石子游戏总结 1.巴什博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个,最多取m个,先取完者获胜(即没有石子取的人失败)。A与B都足够聪明,问A能否获胜。 结论:当n%(m+1)!=0时A必胜,否则必败。 2.斐波那契博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个。第一次不能取完。从第二次开始,每个人取的石子数至少为1,至多为前一个人取的石子数的2倍。先取完者获胜。...

CraigMC的博客 2934

discuz各文件目录及修改参照

  discuz!x1.5 介绍   作为一款以社区为基础的专业建站平台, Discuz! X1 社区平台系统让论坛( BBS ) 、社交网   络 (SNS) 、门户( Portal ) 、群组 (Group) 、开放平台 (Open Platform) 充分融合于一体,帮助网   站实现一站式服务。   ———————————————————————————...

weixin_33916256的博客 1093

三种1:4传输线变压器巴伦的分析

满足多模多馈天线系统匹配要求的传输线变压器巴仑有:双线传输线变压器( 见图1) 、三线传输线变压器( 见图4) 和四线传输线变压器( 见图5) 。尽管3 者的结构不同, 但都可实现1∶4 阻抗变换和不平衡-平衡转换。下面就应用电报方程对它们的阻抗变换特性和输出平衡特性进行分析。

weixin_42407808的博客 8041

基于Python的信用卡欺诈检测机器学习案例报告

当今时代,在线支付已成为一种高效便捷的支付方式,我们可以突破时间和空间的限制,输入我们的信用卡各项信息就可以完成在线支付。但随之而来的是这种支付方式也具备一定的风险性,我们无法辨别对方是否是恶意套取我们资金的非法分子。当信用卡信息数据泄露导致金钱失窃并最终失去客户忠诚度和公司声誉时,组织、消费者、银行和商家都会面临风险。2017 年,未经授权的信用卡操作达到了惊人的 1670 万受害者。此外,据美国联邦贸易委员会 (FTC) 报告,2017 年信用卡欺诈索赔数量比上一年高出 40%。

weixin_45673389的博客 6689

gb2big php,PHP编码变换类3

PHP编码转换类3PHP编码转换类请下载附件,包含文件:converter.class.php/tables/BIG2GB.Table/tables/BIG2UNI.Table/tables/big5-unicode.table/tables/GB2BIG.Table/tables/gb-big5.table/tables/GBK2PY.Table/tables/GBK2UNI.Table/tab...

weixin_29168393的博客 172

汽车诊断之UDS入门-0x19 0x0A服务

0x19 0x0A解析

weixin_44842720的博客 3833

繁简体(GB<=>Big5)字符串互转的JAVA方式实现

本文提供一个java实现中文字符繁简体互换的zip包以及主要的源代码实现说明。 繁简体(GBBig5)中文字符的转化实现原理很简单,就是根据两种码表的编码规则,创建两者之间的字符对应关系表,通过程序读取这个映射表来自动查出另一种编码方式下对应字符的字节编码,从而进行逐字节的内容替换。 主功能实现的GB2Big5.java源代码如下: 查看复制到剪切板打印 1.  pac

vicle的专栏 2044

31、自然语言生成中的流畅度评估

本博客探讨了自然语言生成(NLG)中流畅度评估的重要性和方法。文章详细介绍了流畅度的定义及其影响因素,包括句法结构、词汇选择、语义一致性和段落组织。同时,讨论了自动评估和人工评估两种主要方法,并以机器翻译、自动摘要和对话系统为例分析了流畅度评估的应用场景。最后,文章提出了提升流畅度的技术策略以及未来研究方向,为相关领域的研究者和开发者提供了有价值的参考。

h9j8k7l6m5n的博客 273

VC中sqlite的使用

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

java 中判断字符是否为big5码_Java 编码与字符(1)

一、字符集介绍ANSI:American National Standards Institute。中文:美国国家标准学会不同国家的和地区为此制定了不同标准,由此产生了 GB2312、GBK、Big5、Shift_JIS等各自的编码标准。这些使用 1 至 4 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在日...

weixin_35374026的博客 1040

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java ios乱码_相同的后台java代码,txt文件解析,安卓解析正常,IOS却是乱码,PC解析也正常.......

中文乱码,之所以出现这种现象,根本原因是解析和编码所按照的字符集不 同,而字符集是什么呢?```字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。...

weixin_39875031的博客 397

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: Quartz Job Scheduling Framework中文版文档发布
下一篇: Java侦听系统终止事件,做好扫尾工作
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值