Emoji的介绍参见wiki,emoji表情的Unicode编码范围为[0xE001,0xE05A]&[0xE101,0xE15A]&[0xE201,0xE253]&[0xE401&0xE44C]&[0xE501,0xE537]。
有关iphone中注册很多会用emoji表情,为了使实际名字唯一性,下面编写了去掉emoji表情的代码;我的思路是:根据byte来判断,代码如下:
public static String realname(String name) { String realname = name; try{ char[] myBuffer = name.toCharArray(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < name.length(); i++) { UnicodeBlock ub = UnicodeBlock.of(myBuffer[i]); if(ub == UnicodeBlock.BASIC_LATIN){ //英文及数字等 sb.append(myBuffer[i]); }else if(ub == UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS){ //全角半角字符 sb.append(myBuffer[i]); }else{ //汉字 String temp = String.valueOf(myBuffer[i]); if(judgeIfSpecial(temp.getBytes("unicode"))) { continue; }else { sb.append(myBuffer[i]); } } } realname = sb.toString(); }catch(Exception e) { System.out.println(e); } return realname; }
以下为主要代码:
public static boolean judgeIfSpecial(byte[] c) { if(c.length != 2 && c.length != 4) return false; byte[] b = new byte[2]; if(c.length == 4) { b[0] = c[2]; b[1] = c[3]; }else { b[0] = c[0]; b[1] = c[1]; } if(b[0] != -32 && b[0] != -31 && b[0] != -30 && b[0] != -28 && b[0] != -27 ) { return false; } switch(b[0]) { case -32: //0xe0 0xE001,0xE05A if(b[1] >= 1 && b[1] <= 90 ) //0x01, 0x5A { return true; } break; case -31: //0xe1 0xE101,0xE15A if(b[1] >= 1 && b[1] <= 90 ) //0x01, 0x5A { return true; } break; case -30: //0xe2 0xE201,0xE253 if(b[1] >= 1 && b[1] <= 83 ) //0x01, 0x53 { return true; } break; case -28: //0xe4 0xE401,0xE44C if(b[1] >= 1 && b[1] <= 76 ) //0x01, 0x4c { return true; } break; case -27: //0xe5 0xE501,0xE537 if(b[1] >= 1 && b[1] <= 55 ) //0x01, 0x37 { return true; } break; default: break; } return false; }