最近的项目需要一个功能,将城市名称按首字母查询并加入索引,百度、谷歌了好久,看到的文章解决方案大概相同,就是:通过汉字对应的国际一级汉字区位码进行获取首字母,但是目前一级区位码收录的汉字并不是特别多,有很多汉字还是无法通过此方法获取,具体请查看:GBK2312编码范围,GBK编码范围

1.方式一

根据GBK2312编码范围记载

通过国标一级区位码获取首字母时,只有在16-55区的一级汉字是通过拼音排序,并且能得到首字母,不在此区域的汉字也就无法获取了。

推荐一篇文章帮助学习用此方式来获取首字母:

https://blog.csdn.net/u012532559/article/details/51312820

还有一篇文章与这个类似,找不到原文了,贴一下他的源码吧(如果原博主看到,可以联系换成原文链接,实在不好意思,多谢多谢)

代码如下:

private static final int GB_SP_DIFF = 160;
// 存放国标一级汉字不同读音的起始区位码
private static final int[] secPosValueList = {1601, 1637, 1833, 2078, 2274, 2302,2433, 2594, 2787, 3106, 3212, 3472, 3635, 3722, 3730, 3858, 4027,4086, 4390, 4558, 4684, 4925, 5249, 5600};
private final static String[] lc_FirstLetter = {"a", "b", "c", "d", "e","f", "g", "h", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s","t", "w", "x", "y", "z"};/*** 获取一个汉字的拼音首字母。 GB码两个字节分别减去160,转换成10进制码组合就可以得到区位码* 例如汉字“你”的GB码是0xC4/0xE3,分别减去0xA0(160)就是0x24/0x43* 0x24转成10进制就是36,0x43是67,那么它的区位码就是3667,在对照表中读音为‘n’*/private static char convert(byte[] bytes) {char result = '-';int secPosValue = 0;int i;for (i = 0; i < bytes.length; i++) {bytes[i] -= GB_SP_DIFF;}secPosValue = bytes[0] * 100 + bytes[1];for (i = 0; i < 23; i++) {if (secPosValue >= secPosValueList[i]&& secPosValue < secPosValueList[i + 1]) {result = firstLetter[i];break;}}return result;}/*** 调用方法* @param str 中文串* @return 声母串*/public static String getAllFirstLetter(String str) {if (str == null || str.trim().length() == 0) {return "";}String _str = "";for (int i = 0; i < str.length(); i++) {_str = _str + getFirstLetter(str.substring(i, i + 1));}return _str;}/*** 每个字的首字母** @param chinese 汉字* @return 返回声母*/public static String getFirstLetter(String chinese) {if (chinese == null || chinese.trim().length() == 0) {return "";}chinese = conversionStr(chinese, "GB2312", "ISO8859-1");if (chinese.length() > 1){ // 判断是不是汉字int li_SectorCode = (int) chinese.charAt(0); // 汉字区码int li_PositionCode = (int) chinese.charAt(1); // 汉字位码li_SectorCode = li_SectorCode - 160;li_PositionCode = li_PositionCode - 160;int li_SecPosCode = li_SectorCode * 100 + li_PositionCode; // 汉字区位码if (li_SecPosCode > 1600 && li_SecPosCode < 5590) {for (int i = 0; i < 23; i++) {if (li_SecPosCode >= secPosValueList[i]&& li_SecPosCode < secPosValueList[i + 1]) {chinese = lc_FirstLetter[i];break;}}} else {// 非汉字字符,如图形符号或ASCII码chinese = conversionStr(chinese, "ISO8859-1", "GB2312");chinese = chinese.substring(0, 1);}}return chinese;}/*** 字符串编码转换* @param str           要转换编码的字符串* @param charsetName   原来的编码* @param toCharsetName 转换后的编码* @return 经过编码转换后的字符串*/private static String conversionStr(String str, String charsetName, String toCharsetName) {try {str = new String(str.getBytes(charsetName), toCharsetName);} catch (UnsupportedEncodingException ex) {System.out.println("字符串编码转换异常:" + ex.getMessage());}return str;}

2.方式二

GitHub上的项目:https://github.com/promeG/TinyPinyin

因为我的项目中只使用到的是字符串的首字母,我是通过截取的方式拿到的。具体实现方法可以查看原文,集成到项目中使用就行了。

多谢指教!

Android 获取一段字符串的首字母的解决方案相关推荐

  1. 根据汉字获取它的字符串拼音首字母(大写),含多音字

    /// <summary>         /// 根据汉字获取它的字符串拼音首字母(大写),含多音字         /// </summary>         /// & ...

  2. java 汉字 字母_JAVA获取中文汉字字符串拼音首字母,英文字符不变的工具类

    java在处理项目需求时,有时需要排序,尤其是中文名字按0-9,A-Z进行首字母排序,这时候就需要首先要得到中文字符串的首字母,然后按照字母顺序进行排序,不多说,直接上代码,看java如何获取中文字符 ...

  3. java首字母大写工具类_StringUtil 字符串工具类 将一个字符串的首字母改为大写或者小写 将一 联合开发网 - pudn.com...

    StringUtil 所属分类:Java编程 开发工具:Java 文件大小:2KB 下载次数:14 上传日期:2011-12-26 09:50:51 上 传 者:曲欣亮 说明:  字符串工具类 将一个 ...

  4. python提取首字母的函数_Oracle提取中文字符串拼音首字母函数

    通过oracle的NLSSORT函数对汉字按照拼音排序,然后根据汉字的区间返回对应的首字母. 效果1,获取拼音简码: 效果2,获取姓名首字母: 创建函数: /* 获取拼音简码函数 */ CREATE ...

  5. java 首字母小写_java实现将字符串中首字母转换成大写,其它全部转换成小写的方法示例...

    本文实例讲述了java实现将字符串中首字母转换成大写,其它全部转换成小写的方法.分享给大家供大家参考,具体如下: public class TestSubstring { public static ...

  6. 在Java中,如何使一个字符串的首字母变为大写

    问题:在Java中,如何使一个字符串的首字母变为大写 我使用Java去获取用户的字符串输入.我尝试使他们输入的第一个字符大写 我尝试这样: String name;BufferedReader br ...

  7. 如何在JavaScript中大写字符串的首字母

    To capitalize the first letter of a random string, you should follow these steps: 要大写随机字符串的第一个字母,应遵循 ...

  8. PHP 获取第一个汉字大写首字母

    PHP 获取第一个汉字大写首字母 /*** MethodName:获取第一个汉字大写首字母* Comment:*/ function getFirstCharters($str) {if (empty ...

  9. 完整简洁的Oracle获得汉字字符串拼音首字母和全拼的函数

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! http ...

最新文章

  1. Android ScrollView 滑动指定的距离
  2. X皮书之shell 常用代码
  3. python学习并发编程
  4. 简单了解各种序列化技术-kyro序列化框架
  5. 全国计算机等级考试题库二级C操作题100套(第31套)
  6. scala 方法、函数定义小结
  7. HDU 4418 Time travel
  8. idea怎么设置选中文件时,自动在左侧弹出文件所在位置及文件
  9. 开源PaaS Rainbond发布v3.7.2版本,帮助企业快速构建应用市场
  10. POJ1006 中国剩余定理
  11. python 字符串数组转换为浮点数,如何在numpy中将字符串数组转换为浮点数数组?...
  12. node2vec: 图数据的嵌入方法
  13. IDEA 打包docker镜像详解
  14. 计算机新功能,利用win7新功能提升工作效率
  15. python的分号用英文还是中文_中文的分号和英文的分号使用方法有区别吗?
  16. 【物理学术竞赛】——绳上的球(再续)
  17. 惠普暗影精灵4pro安装ubuntu16.04
  18. 车牌识别EasyPR--开发详解
  19. storm源码分析研究(十三)
  20. 阿姆达尔定律(Amdahl’s Law)

热门文章

  1. 不能贪小便宜了!商家“好评返现”行为涉嫌欺诈,多家外卖店被罚
  2. 3-4 页面路由参数的传递
  3. hg19的下载与索引
  4. Perfdump 工具
  5. EXCEL表格中怎样将文字完全显示
  6. 制作GIF神器(小于2MB,操作简单)
  7. 【论文简述及翻译】GA-Net: Guided Aggregation Net for End-to-end Stereo Matching(CVPR 2019)
  8. 关于《活着》一点读后感
  9. WebGL基础:着色器基础知识
  10. 批评与自我批评华为_社区与批评