自定义函数--将汉字转换为拼音首字母+唯一编号

楼主
我是社区第75451位番薯,欢迎点我头像关注我哦~
适合初学者
引入类库:fr-core-8.0.jar
code:
  1. //my frist code for fr 2016-11-28;
  2. package com.fr.function;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Calendar;
  5. import java.util.Date;
  6. import com.fr.script.*;
  7. public class Cny extends AbstractFunction {
  8.   @Override
  9. public Object run(Object[] args) {
  10. Object para;//接收参数
  11. String Cnys="";
  12. for (int i = 0; i < args.length; i++) {  
  13.           para = args;  
  14.   Cnys =para.toString();//取出参数
  15. }
  16. if (Cnys==""){
  17.   Cnys="ppp";
  18. } //参数为空
  19.   Cnys =Cpy(Cnys);//调用函数
  20.   return Cnys;
  21.   }
  22. //用于测试输出
  23. // public static void main(String[] args) {  
  24.   // String p="Cnys";
  25.    //Lib cn1=new Lib();
  26.   // System.out.println(Cpy(p));
  27.    //  }
  28. //}
  29. //用于测试输出
  30.   // class Lib{
  31. private static int BEGIN = 45217;
  32. private static int END = 63486;
  33. // 按照声 母表示,这个表是在GB2312中的出现的第一个汉字,也就是说“啊”是代表首字母a的第一个汉字。
  34. // i, u, v都不做声母, 自定规则跟随前面的字母
  35. private static char[] chartable = { '啊', '芭', '擦', '搭', '蛾', '发', '噶', '哈', '哈', '击', '喀', '垃', '妈', '拿', '哦', '啪',
  36.    '期', '然', '撒', '塌', '塌', '塌', '挖', '昔', '压', '匝', };
  37. // 二十六个字母区间对应二十七个端点
  38. // GB2312码汉字区间十进制表示
  39. private static int[] table = new int[27];
  40. // 对应首字母区间表
  41. private static char[] initialtable = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'h', 'j', 'k', 'l', 'm', 'n', 'o',
  42.    'p', 'q', 'r', 's', 't', 't', 't', 'w', 'x', 'y', 'z', };
  43. // 初始化
  44. static {
  45.   for (int i = 0; i < 26; i++) {
  46.    table = gbValue(chartable);// 得到GB2312码的首字母区间端点表,十进制。
  47.   }
  48.   table[26] = END;// 区间表结尾
  49. }
  50. public static String Dms(String pk) {
  51.   Date date = new Date();
  52.   pk = (new SimpleDateFormat("yyyyMMddhhmmssSSS")).format(date);
  53.   return pk;
  54. }
  55. // ------------------------public方法区------------------------
  56. // 根据一个包含汉字的字符串返回一个汉字拼音首字母的字符串 最重要的一个方法,思路如下:一个个字符读入、判断、输出
  57. public static String Cpy(String SourceStr) {
  58.   String Result = "";
  59.     int StrLength = SourceStr.length();
  60.   int i;
  61.   try {
  62.    for (i = 0; i < StrLength; i++) {
  63.     Result += Caz(SourceStr.charAt(i));
  64.    }
  65.   } catch (Exception e) {
  66.    Result = "";
  67.    e.printStackTrace();
  68.   }
  69.   return Result + Dms("now");
  70. }
  71. // ------------------------private方法区------------------------
  72. /**
  73.   * 输入字符,得到他的声母,英文字母返回对应的大写字母,其他非简体汉字返回 '0' *
  74.   */
  75. private static char Caz(char ch) {
  76.   // 对英文字母的处理:小写字母转换为大写,大写的直接返回
  77.   if (ch >= 'a' && ch <= 'z') {
  78.    return (char) (ch - 'a' + 'A');
  79.   }
  80.   if (ch >= 'A' && ch <= 'Z') {
  81.    return ch;
  82.   }
  83.   // 对非英文字母的处理:转化为首字母,然后判断是否在码表范围内,
  84.   // 若不是,则直接返回。
  85.   // 若是,则在码表内的进行判断。
  86.   int gb = gbValue(ch);// 汉字转换首字母
  87.   if ((gb < BEGIN) || (gb > END)) // 在码表区间之前,直接返回
  88.   {
  89.    return ch;
  90.   }
  91.   int i;
  92.   for (i = 0; i < 26; i++) {// 判断匹配码表区间,匹配到就break,判断区间形如“[,)”
  93.    if ((gb >= table) && (gb < table[i + 1])) {
  94.     break;
  95.    }
  96.   }
  97.   if (gb == END) {// 补上GB2312区间最右端
  98.    i = 25;
  99.   }
  100.   return initialtable; // 在码表区间中,返回首字母
  101. }
  102. /**
  103.   * 取出汉字的编码CN 汉字
  104.   */
  105. private static int gbValue(char ch) {// 将一个汉字(GB2312)转换为十进制表示。
  106.   String str = new String();
  107.   str += ch;
  108.   try {
  109.    byte[] bytes = str.getBytes("GB2312");
  110.    if (bytes.length < 2) {
  111.     return 0;
  112.    }
  113.    return (bytes[0] << 8 & 0xff00) + (bytes[1] & 0xff);
  114.   } catch (Exception e) {
  115.    return 0;
  116.   }
  117. }  
  118.   
  119. }
复制代码

分享扩散:
参与人数 +3 F豆 +755 +10 F币 +10 理由
星痕 + 88 很棒!顺便提一下,漩涡可是大神啊
传说哥 + 666 + 10 + 10 感谢分享
windy_gui + 1 很给力!

查看全部评分

沙发
发表于 2016-11-28 15:06:09
感谢论坛番薯:漩涡 的帮助,完成该函数;
板凳
发表于 2016-12-29 14:15:44
支持一下,不错
地板
发表于 2017-5-6 14:22:50
6666666666666666666666666666666666
5楼
发表于 2019-5-21 09:26:06
6666666666666666
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

5回帖数 1关注人数 7593浏览人数
最后回复于:2019-5-21 09:26

返回顶部 返回列表