• JAVA获取中文名字的首字母


    1. package com.test;
    2. public class Test {
    3. //简体中文的编码范围从B0A145271)一直到F7FE(63846
    4. private static int BEGIN = 45217;
    5. private static int END = 63486;
    6. // 按照声母表示,这个表是在GB2312中的出现的第一个汉字,也就是说“啊”是代表首字母a的第一个汉字。
    7. // i, u, v都不做声母, 自定规则跟随前面的字母
    8. private static char[] chartable = {'啊', '芭', '擦', '搭', '蛾', '发', '噶', '哈',
    9. '哈', '击', '喀', '垃', '妈', '拿', '哦', '啪', '期', '然', '撒', '塌', '塌',
    10. '塌', '挖', '昔', '压', '匝',};
    11. // 二十六个字母区间对应二十七个端点
    12. // GB2312码汉字区间十进制表示
    13. private static int[] table = new int[27];
    14. // 对应首字母区间表
    15. private static char[] initialtable = {'a', 'b', 'c', 'd', 'e', 'f', 'g',
    16. 'h', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
    17. 't', 't', 'w', 'x', 'y', 'z',};
    18. // 初始化
    19. static {
    20. for (int i = 0; i < 26; i++) {
    21. table[i] = gbValue(chartable[i]); //得到GB2312码的首字母区间端点表,十进制。
    22. }
    23. table[26] = END;// 区间表结尾
    24. }
    25. public static void main(String[] args) {
    26. System.out.println(getFirstLetter("符串返回一个汉字拼音首字母的字符串 最重要"));
    27. }
    28. /**---------------------------------- public 方法 ----------------------------------------------**/
    29. /**
    30. * 根据一个包含汉字的字符串返回一个汉字拼音首字母的字符串 最重要的一个方法,
    31. * 思路如下:一个个字符读入、判断、输出
    32. */
    33. public static String getFirstLetter(String sourceStr) {
    34. String result = "";
    35. String str = sourceStr.toLowerCase();
    36. int StrLength = str.length();
    37. int i;
    38. try {
    39. for (i = 0; i < StrLength; i++) {
    40. result += Char2Initial(str.charAt(i));
    41. }
    42. } catch (Exception e) {
    43. result = "";
    44. }
    45. return result;
    46. }
    47. // ------------------------- private 方法区 -------------------------------
    48. /**
    49. * 输入字符,得到他的声母,英文字母返回对应的大写字母,其他非简体汉字返回 '0'
    50. */
    51. private static char Char2Initial(char ch) {
    52. // 对英文字母的处理:小写字母转换为大写,大写的直接返回
    53. if (ch >= 'a' && ch <= 'z') {
    54. return ch;
    55. }
    56. if (ch >= 'A' && ch <= 'Z') {
    57. return ch;
    58. }
    59. // 对非英文字母的处理:转化为首字母,然后判断是否在码表范围内,
    60. // 若不是,则直接返回。
    61. // 若是,则在码表内的进行判断。
    62. int gb = gbValue(ch);// 汉字转换首字母
    63. if ((gb < BEGIN) || (gb > END))// 在码表区间之前,直接返回
    64. {
    65. return ch;
    66. }
    67. int i;
    68. for (i = 0; i < 26; i++) {// 判断匹配码表区间,匹配到就break,判断区间形如“[,)”
    69. if ((gb >= table[i]) && (gb < table[i + 1])) {
    70. break;
    71. }
    72. }
    73. if (gb == END) {//补上GB2312区间最右端
    74. i = 25;
    75. }
    76. return initialtable[i]; // 在码表区间中,返回首字母
    77. }
    78. /**
    79. * 取出汉字的编码 cn 汉字
    80. */
    81. private static int gbValue(char ch) {// 将一个汉字(GB2312)转换为十进制表示。
    82. String str = new String();
    83. str += ch;
    84. try {
    85. byte[] bytes = str.getBytes("GB2312");
    86. if (bytes.length < 2) {
    87. return 0;
    88. }
    89. return (bytes[0] << 8 & 0xff00) + (bytes[1] & 0xff);
    90. } catch (Exception e) {
    91. return 0;
    92. }
    93. }
    94. }

  • 相关阅读:
    flask+pycharts可视化(已经fork过来备份了)
    nrf52840烧录配置(协议栈+APP)
    精选历年大厂高频Java面试真题集锦(含答案),助力面试一路开挂
    网页整体如何实现网页变灰效果
    百人研发团队百亿销售规模的技术架构实践分享
    SpringBoot:Web开发之三大组件详解
    PostgreSQL之数据类型及开发技巧
    树莓派 3b+ 没有 /dev/i2c-*
    asp.net core之HttpClient
    OpenCV 11(图像金字塔)
  • 原文地址:https://blog.csdn.net/weixin_41796956/article/details/128084401