`
逆风的香1314
  • 浏览: 1432217 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
 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"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
分享到:
评论

相关推荐

    gb2big5_java.rar_GB-BIG5 java_java big5_简体 繁体

    这个压缩包中的文件“繁简体(GB=Big5)字符串转化的JAVA方式实现”很可能是一个Java源代码文件或一个包含多个源代码文件的项目,它可能提供了以下功能: 1. **GB2312到BIG5的转换**:使用Java的`CharsetEncoder`和`...

    繁简体转换代码繁简体转换

    "gb2big5.js"则很可能是一个JavaScript文件,它的功能可能是实现GBK到Big5的字符编码转换。JavaScript是一种广泛使用的客户端脚本语言,常用于网页交互和数据处理。在这个场景下,该文件可能包含了一个函数或类,...

    易语言繁简字体转换源代码

    3. 繁简体字库:实现繁简字体转换,关键在于拥有正确的字库。易语言社区中,有一些开发者提供了转换字库,如“神2”提供的转换类,就是基于这样的字库进行开发的。这些字库包含了简体字到繁体字,以及繁体字到简体字...

    繁简体转换词库.zip

    训练完成后,模型可以集成到各种应用程序中,实现高效准确的繁简体转换。同时,对于学术研究者来说,这个数据集也可用于评估和比较不同转换算法的性能,推动NLP技术的发展。总之,“繁简体转换词库.zip”提供了一个...

    swift-Swift繁简对照字符串函数

    提到的压缩包中的文件`RockfordWei-GBig-eb3c5c7`可能是一个名为`GBig`的第三方Swift库,它专门用于字符串的繁简体转换。使用这样的库可以简化代码,并提供更便捷的API。不过,由于没有具体的库代码,这里无法给出...

    繁简体互换

    在IT领域,文本处理是一项重要的任务,特别是在处理中文文本时,由于存在繁体中文和简体中文的区别,有时需要进行繁简体之间的转换。"繁简体互换"就是一个专门解决这个问题的小软件,它能够方便地帮助用户在繁体中文...

    VB6内置的内码转换功能(中文繁简体转换)

    在VB6(Visual Basic 6)编程环境中,开发者可以利用内置的内码转换功能来实现中文繁简体的转换。这种转换是通过处理字符编码来完成的,涉及到字符集、编码方式以及字符串处理等核心概念。以下是关于VB6中中文繁简体...

    繁简体转换程序

    繁简体转换程序 欢迎使用。。。。

    一个非常好用繁简体转换js

    一个非常好用繁简体转换js 调用方法。 JS繁简切换 Code By Sundj. 网络上有一个Edited by tMosport写的JS繁简切换的脚本,我觉得不太方便用 参考了tMosport的代码重写了这个脚本。希望对你有所有帮助。 用法: ...

    EXCEL繁简体互转工具

    "EXCEL繁简体互转工具"就是专门为此设计的实用软件,它能够方便快捷地帮助用户完成Excel表格中文字的繁简转换,提高工作效率。 简体中文和繁体中文虽然都是汉字,但在字形、用词和书写习惯上存在一定的差异。简体...

    java android 繁简体互转jar包

    android java 繁简体互相转换jar包

    汉字繁简体对照表(总数2574)

    5. **编程开发**:在开发支持繁简体转换的软件或应用时,对照表是重要的参考资源,可以提高转换算法的精确度。 总的来说,这份“汉字繁简体对照表”是学习和使用汉字的重要辅助工具,不仅方便了日常的繁简转换需求...

    繁简体转换方法

    本文将深入探讨繁简体转换的方法,包括技术实现与显示编码问题,以及如何确保数据在数据库中正确存储。 ### 一、繁简体转换的技术实现 #### 使用Microsoft.VisualBasic.dll实现繁简转换 在.NET框架下,利用`...

    万能字符串转换软件工具_45软件 v1.2.zip

    16进制转字符串,字符串转Unicode,Unicode转字符串,简体转繁体(GB2312转GBK),繁体转简体(GBK转GB2312),繁体转BIG5(GBK转BIG5),BIG5转繁体(BIG5转GBK),字符串转UTF8,UTF8转字符串,各种格式化操作,删空格,删句号...

    中文繁简体转换器

    一个js做的中文繁简体转换,就一个html使用非常方便

    数据库资料繁简体互转

    - **从简体到繁体转换**:当`@toBIG`为1时,函数遍历`codetable`中的每一对繁简体字符,使用`REPLACE`函数将`@str`中的所有简体字符替换为其对应的繁体字符。 - **从繁体到简体转换**:当`@toBIG`不等于1时,进行...

    JavaScript在网站中繁简字体转换的应用.pdf

    繁简字体转换算法有很多,最简单的就是将body的innerHTML中的每个字符都进行检查。但是,这种算法的效率非常低,遇到复杂一点的网页甚至会假死。因此,这种算法不可取。研究了网上相关的算法,认为将针对Windows对象...

    Java 正则表达式判断字符串是否包含中文

    ### Java正则表达式判断字符串是否包含中文 在日常的软件开发过程中,我们经常会遇到需要对输入的字符串进行校验的情况。例如,在处理用户输入、文本分析或数据清洗时,可能需要判断一个字符串中是否包含中文字符。...

    ALiBaBar ie繁简转换,快速网页切换繁简体

    同时,"Readme-Big5.txt"、"Readme-GBK.txt"和"Readme-Eng.txt"这三份文件则是软件的使用说明,分别对应Big5编码(常用于繁体中文)、GBK编码(简体中文扩展)和英文版本的阅读指南,帮助用户了解软件的详细信息和...

Global site tag (gtag.js) - Google Analytics