前几天遇到了生僻字的问题。很有意思。在不同的平台上显示的字符不一样,有些是方块有些是?有些干脆就是一个表情图标。
检查了编码没有问题,是UTF-8。

研究了一下最终发现了原因。
出错的字符,落到了UNICODE的私人造字区里面,参考如下。
http://jicheng.tw/hanzi/unicode.html
不同的系统/字体,不能保证私人造字区的一致性。
自己写了段测试代码,发现目前Unicode Base区,扩展ABCD均没有问题,唯独私人造字区不行。

解决方法也比较简单,显示字符之前进行检测就行了,如果发现客户姓名里面有私人造字区的字,那么不显示“姓名,您好”而是显示“亲爱的客户,您好”。

代码如下。注意,在Unicode扩展区,一个字符是由两个\u 表示的。也就是说String类的标准方法charAt等等不适用了,要采用codePointAt, codePointCount来进行字符的相关操作。

public class RareCharacterUtility {public static boolean containsUserDefinedUnicode(String string) {if (string == null) {throw new NullPointerException("Stirng must be non-null");}int[] code = toCodePointArray(string);//  U+E000..U+F8FFfor (int c : code) {if (c >= '\ue000' && c <= '\uf8ff') {return true;}}return false;}static int[] toCodePointArray(String str) {int len = str.length();int[] acp = new int[str.codePointCount(0, len)];for (int i = 0, j = 0; i < len; i = str.offsetByCodePoints(i, 1)) {acp[j++] = str.codePointAt(i);}return acp;}static String toHex(int[] chars) {String r = "[";for (int i=0; i<chars.length; i++) {if (r.length() > 1) {r += ",";}r += Integer.toHexString(chars[i]);}r += "]";return r;}public static void main(String[] argu) {String rr = ("\u5f20\ue0bf\uD86C\uDE70\uD840\uDC10\uD86D\uDF44\uD87E\uDCAC\u9fc6");System.out.println("Unicode = " + toHex(toCodePointArray(rr)));boolean r = (containsUserDefinedUnicode(rr));System.out.println("Test result = " + r + " should be true");}
}

Java处理生僻字的问题相关推荐

  1. java获取生僻字_生僻字与16进制的转换

    字符串中的生僻字在传输和存储的过程中存在着各种各样的问题,为了便于传输和存储,我们通常会把这些生僻字转换为16进制编码进行传输和存储. package com.dc.util; import java ...

  2. Java中文生僻字排序

    JDK中的java.text.Collator 排序处理生僻字会失败,现引入新的Jar包进行处理. 引入icu4j进行处理,改包主要是为软件应用提供Unicode和全球化支持的一套成熟.广泛使用的C/ ...

  3. java mysql 生僻字_mysql/Java服务端对emoji或者生僻字的支持

    最近开发的iOS项目因为需要用户文本的存储,自然就遇到了emoji等表情符号如何被mysql DB支持的问题.困扰了数日,在就要绝望放弃的边缘,终于完成了转换和迁移.在此特别分析和整理,方便更多人. ...

  4. java mysql 生僻字 乱码_JAVA生僻字乱码问题

    我先把数据从数据库中查出来,然后输出到EXCEL表格中,但是表格中显示的是乱码.数据库中的数据是正常的,没有问题,程序有个查询功能,一个导出功能,查询功能是调用润乾展示报表,没有乱码.... 我先把数 ...

  5. java mysql 生僻字 乱码_mysql 生僻字乱码

    发一下牢骚和主题无关: Incorrect string value: '\xF0\xA1\xBF\xA8\xE9\x82...' for column 'last_name' 这个问题出在mysql ...

  6. 数据库存储解决生僻字

    一.Oracle数据库 就一般情况来说,Oracle存储中英文的字段用varchar2类型就可以了,但有些时候,遇到生僻字就不行了, 在默认字符集环境下,实现Oracle储存生僻字: 㛃.䶮-(使用n ...

  7. java生僻字_Android上显示生僻字的方法

    安卓5.0+是可以显示所有(8万多个)Unicode汉字的,本文介绍显示生僻汉字的方法,这个方法也适用于其它特殊字符. Unicode值在0xFFFF以下的(2万多个简体.繁体)汉字早已被广泛支持,所 ...

  8. java校验中文姓名合法性(需要支持生僻字与分隔符·)

    背景: 国家民委等单位关于在政府管理和社会公共服务信息系统中统一姓名采集应用规范的通知 对中文姓名合法性校验时,需要支持所有GB18030中涉及到的汉字(包括生僻字),并支持部分少数民族姓名中带有分隔 ...

  9. java生僻字解决方案

    原帖见http://hi.baidu.com/xmltiger/blog/item/f86ebdec72332f4878f05591.html 有所增加内容 java应用中经常会碰到中文生僻字的输入和 ...

最新文章

  1. Linux awk 使用
  2. Google Java编程风格指南中文版
  3. 龟兔赛跑——多线程练习
  4. CF815C Karen and Supermarket [树形DP]
  5. python 分类变量xgboost_XGBoost 原理 及 常见面试题
  6. 金三银四,Android高级开发面试题目,帮你助力
  7. OpenCV读取UsbCam的图像
  8. web sevice 生成代理类及使用
  9. D-Bus 性能分析
  10. MVC3.0+knockout.js+Ajax 实现简单的增删改查
  11. 以前我劝你们努力,今天我劝你们放弃
  12. Guice依赖注入(Scope)
  13. Kafka 过期数据清理 详解
  14. 38译码器真值表讲解_三八译码器真值表
  15. 计算机应该玩什么游戏,电脑玩游戏主要靠什么配置
  16. Downward paths
  17. Problem A: 零起点学算法93——矩阵转置
  18. 有什么好用的表单工具?
  19. 大数据高效找所有素数/质数的算法
  20. Nagios学习笔记

热门文章

  1. ios13全选手势_iOS13操作新手势:使用iPhone编辑文本更方便
  2. Android 检查当前wifi是否可以有网,可以访问网络
  3. 100句非常经典的读书名言
  4. oppop+r1c怎么设置语言中文,OPPO R1C怎么样 OPPO R1C手机评测 (全文)
  5. 牛客网-Verilog篇
  6. 获取枚举常量的描述值Description
  7. python tk窗口 选择 销毁_Python tkinter - 删除其他窗口 - 已调用tk.withdraw()
  8. 分面导航的详细操作方案
  9. 潘多拉路由器搭建php,【请教】潘多拉(PandoraBox)双Wan如何配置叠加宽带
  10. Jenkins ——你很神气