android 功能模块之通讯模块四

2023-11-10


Android通讯录开发之通讯录联系人搜索功能最新实现
2014年1月13日
之前的有两篇博客介绍了如何解决通讯录搜索功能的问题,那些方法都是从网上搜集,然后经过自己整理试验之后的,但在项目测试人员给我反馈,似乎还是存在一些问题,比如一些简拼没能搜出,或者简拼的转换有了问题,主要是因为中文的转换为简拼还是有点麻烦的,不同的编码支持的汉字又不同,比如gb2312编码支持汉字6763个汉字,并且分为两级,一级汉字3755个,二级汉字3008个,还对这两级汉字进行了分区,一级汉字是按拼音排序,二级汉字按笔画排序,所以网上提供的一些方法并没有覆盖绝大部分的汉字,才会导致有些简拼无法转换的现象。所以我还是抛弃了之前的方法,因为还是无法满足实现简拼搜索的要求。
下面小巫提供另外一个工具类,是目前我负责的项目最新的实现
  1. /* 
  2.  * Copyright (C) 2011 The Android Open Source Project 
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  * you may not use this file except in compliance with the License. 
  6.  * You may obtain a copy of the License at 
  7.  * 
  8.  *      http://www.apache.org/licenses/LICENSE-2.0 
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software 
  11.  * distributed under the License is distributed on an "AS IS" BASIS, 
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  13.  * See the License for the specific language governing permissions and 
  14.  * limitations under the License. 
  15.  */  
  16.   
  17. package com.suntek.mobilemeeting.utils;  
  18.   
  19. import android.text.TextUtils;  
  20. import android.util.Log;  
  21.   
  22. import java.text.Collator;  
  23. import java.util.ArrayList;  
  24. import java.util.Locale;  
  25.   
  26. /** 
  27.  * An object to convert Chinese character to its corresponding pinyin string. For characters with 
  28.  * multiple possible pinyin string, only one is selected according to collator. Polyphone is not 
  29.  * supported in this implementation. This class is implemented to achieve the best runtime 
  30.  * performance and minimum runtime resources with tolerable sacrifice of accuracy. This 
  31.  * implementation highly depends on zh_CN ICU collation data and must be always synchronized with 
  32.  * ICU. 
  33.  * 
  34.  * Currently this file is aligned to zh.txt in ICU 4.6 
  35.  */  
  36. public class HanziToPinyin {  
  37.     private static final String TAG = "HanziToPinyin";  
  38.   
  39.     // Turn on this flag when we want to check internal data structure.  
  40.     private static final boolean DEBUG = false;  
  41.   
  42.     /** 
  43.      * Unihans array. 
  44.      * 
  45.      * Each unihans is the first one within same pinyin when collator is zh_CN. 
  46.      */  
  47.     public static final char[] UNIHANS = {  
  48.             '\u963f''\u54ce''\u5b89''\u80ae''\u51f9''\u516b',  
  49.             '\u6300''\u6273''\u90a6''\u52f9''\u9642''\u5954',  
  50.             '\u4f3b''\u5c44''\u8fb9''\u706c''\u618b''\u6c43',  
  51.             '\u51ab''\u7676''\u5cec''\u5693''\u5072''\u53c2',  
  52.             '\u4ed3''\u64a1''\u518a''\u5d7e''\u66fd''\u66fe',  
  53.             '\u5c64''\u53c9''\u8286''\u8fbf''\u4f25''\u6284',  
  54.             '\u8f66''\u62bb''\u6c88''\u6c89''\u9637''\u5403',  
  55.             '\u5145''\u62bd''\u51fa''\u6b3b''\u63e3''\u5ddb',  
  56.             '\u5205''\u5439''\u65fe''\u9034''\u5472''\u5306',  
  57.             '\u51d1''\u7c97''\u6c46''\u5d14''\u90a8''\u6413',  
  58.             '\u5491''\u5446''\u4e39''\u5f53''\u5200''\u561a',  
  59.             '\u6265''\u706f''\u6c10''\u55f2''\u7538''\u5201',  
  60.             '\u7239''\u4e01''\u4e1f''\u4e1c''\u543a''\u53be',  
  61.             '\u8011''\u8968''\u5428''\u591a''\u59b8''\u8bf6',  
  62.             '\u5940''\u97a5''\u513f''\u53d1''\u5e06''\u531a',  
  63.             '\u98de''\u5206''\u4e30''\u8985''\u4ecf''\u7d11',  
  64.             '\u4f15''\u65ee''\u4f85''\u7518''\u5188''\u768b',  
  65.             '\u6208''\u7ed9''\u6839''\u522f''\u5de5''\u52fe',  
  66.             '\u4f30''\u74dc''\u4e56''\u5173''\u5149''\u5f52',  
  67.             '\u4e28''\u5459''\u54c8''\u548d''\u4f44''\u592f',  
  68.             '\u8320''\u8bc3''\u9ed2''\u62eb''\u4ea8''\u5677',  
  69.             '\u53ff''\u9f41''\u4e6f''\u82b1''\u6000''\u72bf',  
  70.             '\u5ddf''\u7070''\u660f''\u5419''\u4e0c''\u52a0',  
  71.             '\u620b''\u6c5f''\u827d''\u9636''\u5dfe''\u5755',  
  72.             '\u5182''\u4e29''\u51e5''\u59e2''\u5658''\u519b',  
  73.             '\u5494''\u5f00''\u520a''\u5ffc''\u5c3b''\u533c',  
  74.             '\u808e''\u52a5''\u7a7a''\u62a0''\u625d''\u5938',  
  75.             '\u84af''\u5bbd''\u5321''\u4e8f''\u5764''\u6269',  
  76.             '\u5783''\u6765''\u5170''\u5577''\u635e''\u808b',  
  77.             '\u52d2''\u5d1a''\u5215''\u4fe9''\u5941''\u826f',  
  78.             '\u64a9''\u5217''\u62ce''\u5222''\u6e9c''\u56d6',  
  79.             '\u9f99''\u779c''\u565c''\u5a08''\u7567''\u62a1',  
  80.             '\u7f57''\u5463''\u5988''\u57cb''\u5ada''\u7264',  
  81.             '\u732b''\u4e48''\u5445''\u95e8''\u753f''\u54aa',  
  82.             '\u5b80''\u55b5''\u4e5c''\u6c11''\u540d''\u8c2c',  
  83.             '\u6478''\u54de''\u6bea''\u55ef''\u62cf''\u8149',  
  84.             '\u56e1''\u56d4''\u5b6c''\u7592''\u5a1e''\u6041',  
  85.             '\u80fd''\u59ae''\u62c8''\u5b22''\u9e1f''\u634f',  
  86.             '\u56dc''\u5b81''\u599e''\u519c''\u7fba''\u5974',  
  87.             '\u597b''\u759f''\u9ec1''\u90cd''\u5594''\u8bb4',  
  88.             '\u5991''\u62cd''\u7705''\u4e53''\u629b''\u5478',  
  89.             '\u55b7''\u5309''\u4e15''\u56e8''\u527d''\u6c15',  
  90.             '\u59d8''\u4e52''\u948b''\u5256''\u4ec6''\u4e03',  
  91.             '\u6390''\u5343''\u545b''\u6084''\u767f''\u4eb2',  
  92.             '\u72c5''\u828e''\u4e18''\u533a''\u5cd1''\u7f3a',  
  93.             '\u590b''\u5465''\u7a63''\u5a06''\u60f9''\u4eba',  
  94.             '\u6254''\u65e5''\u8338''\u53b9''\u909a''\u633c',  
  95.             '\u5827''\u5a51''\u77a4''\u637c''\u4ee8''\u6be2',  
  96.             '\u4e09''\u6852''\u63bb''\u95aa''\u68ee''\u50e7',  
  97.             '\u6740''\u7b5b''\u5c71''\u4f24''\u5f30''\u5962',  
  98.             '\u7533''\u8398''\u6552''\u5347''\u5c38''\u53ce',  
  99.             '\u4e66''\u5237''\u8870''\u95e9''\u53cc''\u8c01',  
  100.             '\u542e''\u8bf4''\u53b6''\u5fea''\u635c''\u82cf',  
  101.             '\u72fb''\u590a''\u5b59''\u5506''\u4ed6''\u56fc',  
  102.             '\u574d''\u6c64''\u5932''\u5fd1''\u71a5''\u5254',  
  103.             '\u5929''\u65eb''\u5e16''\u5385''\u56f2''\u5077',  
  104.             '\u51f8''\u6e4d''\u63a8''\u541e''\u4e47''\u7a75',  
  105.             '\u6b6a''\u5f2f''\u5c23''\u5371''\u6637''\u7fc1',  
  106.             '\u631d''\u4e4c''\u5915''\u8672''\u4eda''\u4e61',  
  107.             '\u7071''\u4e9b''\u5fc3''\u661f''\u51f6''\u4f11',  
  108.             '\u5401''\u5405''\u524a''\u5743''\u4e2b''\u6079',  
  109.             '\u592e''\u5e7a''\u503b''\u4e00''\u56d9''\u5e94',  
  110.             '\u54df''\u4f63''\u4f18''\u625c''\u56e6''\u66f0',  
  111.             '\u6655''\u7b60''\u7b7c''\u5e00''\u707d''\u5142',  
  112.             '\u5328''\u50ae''\u5219''\u8d3c''\u600e''\u5897',  
  113.             '\u624e''\u635a''\u6cbe''\u5f20''\u957f''\u9577',  
  114.             '\u4f4b''\u8707''\u8d1e''\u4e89''\u4e4b''\u5cd9',  
  115.             '\u5ea2''\u4e2d''\u5dde''\u6731''\u6293''\u62fd',  
  116.             '\u4e13''\u5986''\u96b9''\u5b92''\u5353''\u4e72',  
  117.             '\u5b97''\u90b9''\u79df''\u94bb''\u539c''\u5c0a',  
  118.             '\u6628''\u5159''\u9fc3''\u9fc4', };  
  119.   
  120.     /** 
  121.      * Pinyin array. 
  122.      * 
  123.      * Each pinyin is corresponding to unihans of same 
  124.      * offset in the unihans array. 
  125.      */  
  126.     public static final byte[][] PINYINS = {  
  127.             { 65,   0,   0,   0,   0,   0}, { 65,  73,   0,   0,   0,   0},  
  128.             { 65,  78,   0,   0,   0,   0}, { 65,  78,  71,   0,   0,   0},  
  129.             { 65,  79,   0,   0,   0,   0}, { 66,  65,   0,   0,   0,   0},  
  130.             { 66,  65,  73,   0,   0,   0}, { 66,  65,  78,   0,   0,   0},  
  131.             { 66,  65,  78,  71,   0,   0}, { 66,  65,  79,   0,   0,   0},  
  132.             { 66,  69,  73,   0,   0,   0}, { 66,  69,  78,   0,   0,   0},  
  133.             { 66,  69,  78,  71,   0,   0}, { 66,  73,   0,   0,   0,   0},  
  134.             { 66,  73,  65,  78,   0,   0}, { 66,  73,  65,  79,   0,   0},  
  135.             { 66,  73,  69,   0,   0,   0}, { 66,  73,  78,   0,   0,   0},  
  136.             { 66,  73,  78,  71,   0,   0}, { 66,  79,   0,   0,   0,   0},  
  137.             { 66,  85,   0,   0,   0,   0}, { 67,  65,   0,   0,   0,   0},  
  138.             { 67,  65,  73,   0,   0,   0}, { 67,  65,  78,   0,   0,   0},  
  139.             { 67,  65,  78,  71,   0,   0}, { 67,  65,  79,   0,   0,   0},  
  140.             { 67,  69,   0,   0,   0,   0}, { 67,  69,  78,   0,   0,   0},  
  141.             { 67,  69,  78,  71,   0,   0}, { 90,  69,  78,  71,   0,   0},  
  142.             { 67,  69,  78,  71,   0,   0}, { 67,  72,  65,   0,   0,   0},  
  143.             { 67,  72,  65,  73,   0,   0}, { 67,  72,  65,  78,   0,   0},  
  144.             { 67,  72,  65,  78,  71,   0}, { 67,  72,  65,  79,   0,   0},  
  145.             { 67,  72,  69,   0,   0,   0}, { 67,  72,  69,  78,   0,   0},  
  146.             { 83,  72,  69,  78,   0,   0}, { 67,  72,  69,  78,   0,   0},  
  147.             { 67,  72,  69,  78,  71,   0}, { 67,  72,  73,   0,   0,   0},  
  148.             { 67,  72,  79,  78,  71,   0}, { 67,  72,  79,  85,   0,   0},  
  149.             { 67,  72,  85,   0,   0,   0}, { 67,  72,  85,  65,   0,   0},  
  150.             { 67,  72,  85,  65,  73,   0}, { 67,  72,  85,  65,  78,   0},  
  151.             { 67,  72,  85,  65,  78,  71}, { 67,  72,  85,  73,   0,   0},  
  152.             { 67,  72,  85,  78,   0,   0}, { 67,  72,  85,  79,   0,   0},  
  153.             { 67,  73,   0,   0,   0,   0}, { 67,  79,  78,  71,   0,   0},  
  154.             { 67,  79,  85,   0,   0,   0}, { 67,  85,   0,   0,   0,   0},  
  155.             { 67,  85,  65,  78,   0,   0}, { 67,  85,  73,   0,   0,   0},  
  156.             { 67,  85,  78,   0,   0,   0}, { 67,  85,  79,   0,   0,   0},  
  157.             { 68,  65,   0,   0,   0,   0}, { 68,  65,  73,   0,   0,   0},  
  158.             { 68,  65,  78,   0,   0,   0}, { 68,  65,  78,  71,   0,   0},  
  159.             { 68,  65,  79,   0,   0,   0}, { 68,  69,   0,   0,   0,   0},  
  160.             { 68,  69,  78,   0,   0,   0}, { 68,  69,  78,  71,   0,   0},  
  161.             { 68,  73,   0,   0,   0,   0}, { 68,  73,  65,   0,   0,   0},  
  162.             { 68,  73,  65,  78,   0,   0}, { 68,  73,  65,  79,   0,   0},  
  163.             { 68,  73,  69,   0,   0,   0}, { 68,  73,  78,  71,   0,   0},  
  164.             { 68,  73,  85,   0,   0,   0}, { 68,  79,  78,  71,   0,   0},  
  165.             { 68,  79,  85,   0,   0,   0}, { 68,  85,   0,   0,   0,   0},  
  166.             { 68,  85,  65,  78,   0,   0}, { 68,  85,  73,   0,   0,   0},  
  167.             { 68,  85,  78,   0,   0,   0}, { 68,  85,  79,   0,   0,   0},  
  168.             { 69,   0,   0,   0,   0,   0}, { 69,  73,   0,   0,   0,   0},  
  169.             { 69,  78,   0,   0,   0,   0}, { 69,  78,  71,   0,   0,   0},  
  170.             { 69,  82,   0,   0,   0,   0}, { 70,  65,   0,   0,   0,   0},  
  171.             { 70,  65,  78,   0,   0,   0}, { 70,  65,  78,  71,   0,   0},  
  172.             { 70,  69,  73,   0,   0,   0}, { 70,  69,  78,   0,   0,   0},  
  173.             { 70,  69,  78,  71,   0,   0}, { 70,  73,  65,  79,   0,   0},  
  174.             { 70,  79,   0,   0,   0,   0}, { 70,  79,  85,   0,   0,   0},  
  175.             { 70,  85,   0,   0,   0,   0}, { 71,  65,   0,   0,   0,   0},  
  176.             { 71,  65,  73,   0,   0,   0}, { 71,  65,  78,   0,   0,   0},  
  177.             { 71,  65,  78,  71,   0,   0}, { 71,  65,  79,   0,   0,   0},  
  178.             { 71,  69,   0,   0,   0,   0}, { 71,  69,  73,   0,   0,   0},  
  179.             { 71,  69,  78,   0,   0,   0}, { 71,  69,  78,  71,   0,   0},  
  180.             { 71,  79,  78,  71,   0,   0}, { 71,  79,  85,   0,   0,   0},  
  181.             { 71,  85,   0,   0,   0,   0}, { 71,  85,  65,   0,   0,   0},  
  182.             { 71,  85,  65,  73,   0,   0}, { 71,  85,  65,  78,   0,   0},  
  183.             { 71,  85,  65,  78,  71,   0}, { 71,  85,  73,   0,   0,   0},  
  184.             { 71,  85,  78,   0,   0,   0}, { 71,  85,  79,   0,   0,   0},  
  185.             { 72,  65,   0,   0,   0,   0}, { 72,  65,  73,   0,   0,   0},  
  186.             { 72,  65,  78,   0,   0,   0}, { 72,  65,  78,  71,   0,   0},  
  187.             { 72,  65,  79,   0,   0,   0}, { 72,  69,   0,   0,   0,   0},  
  188.             { 72,  69,  73,   0,   0,   0}, { 72,  69,  78,   0,   0,   0},  
  189.             { 72,  69,  78,  71,   0,   0}, { 72,  77,   0,   0,   0,   0},  
  190.             { 72,  79,  78,  71,   0,   0}, { 72,  79,  85,   0,   0,   0},  
  191.             { 72,  85,   0,   0,   0,   0}, { 72,  85,  65,   0,   0,   0},  
  192.             { 72,  85,  65,  73,   0,   0}, { 72,  85,  65,  78,   0,   0},  
  193.             { 72,  85,  65,  78,  71,   0}, { 72,  85,  73,   0,   0,   0},  
  194.             { 72,  85,  78,   0,   0,   0}, { 72,  85,  79,   0,   0,   0},  
  195.             { 74,  73,   0,   0,   0,   0}, { 74,  73,  65,   0,   0,   0},  
  196.             { 74,  73,  65,  78,   0,   0}, { 74,  73,  65,  78,  71,   0},  
  197.             { 74,  73,  65,  79,   0,   0}, { 74,  73,  69,   0,   0,   0},  
  198.             { 74,  73,  78,   0,   0,   0}, { 74,  73,  78,  71,   0,   0},  
  199.             { 74,  73,  79,  78,  71,   0}, { 74,  73,  85,   0,   0,   0},  
  200.             { 74,  85,   0,   0,   0,   0}, { 74,  85,  65,  78,   0,   0},  
  201.             { 74,  85,  69,   0,   0,   0}, { 74,  85,  78,   0,   0,   0},  
  202.             { 75,  65,   0,   0,   0,   0}, { 75,  65,  73,   0,   0,   0},  
  203.             { 75,  65,  78,   0,   0,   0}, { 75,  65,  78,  71,   0,   0},  
  204.             { 75,  65,  79,   0,   0,   0}, { 75,  69,   0,   0,   0,   0},  
  205.             { 75,  69,  78,   0,   0,   0}, { 75,  69,  78,  71,   0,   0},  
  206.             { 75,  79,  78,  71,   0,   0}, { 75,  79,  85,   0,   0,   0},  
  207.             { 75,  85,   0,   0,   0,   0}, { 75,  85,  65,   0,   0,   0},  
  208.             { 75,  85,  65,  73,   0,   0}, { 75,  85,  65,  78,   0,   0},  
  209.             { 75,  85,  65,  78,  71,   0}, { 75,  85,  73,   0,   0,   0},  
  210.             { 75,  85,  78,   0,   0,   0}, { 75,  85,  79,   0,   0,   0},  
  211.             { 76,  65,   0,   0,   0,   0}, { 76,  65,  73,   0,   0,   0},  
  212.             { 76,  65,  78,   0,   0,   0}, { 76,  65,  78,  71,   0,   0},  
  213.             { 76,  65,  79,   0,   0,   0}, { 76,  69,   0,   0,   0,   0},  
  214.             { 76,  69,  73,   0,   0,   0}, { 76,  69,  78,  71,   0,   0},  
  215.             { 76,  73,   0,   0,   0,   0}, { 76,  73,  65,   0,   0,   0},  
  216.             { 76,  73,  65,  78,   0,   0}, { 76,  73,  65,  78,  71,   0},  
  217.             { 76,  73,  65,  79,   0,   0}, { 76,  73,  69,   0,   0,   0},  
  218.             { 76,  73,  78,   0,   0,   0}, { 76,  73,  78,  71,   0,   0},  
  219.             { 76,  73,  85,   0,   0,   0}, { 76,  79,   0,   0,   0,   0},  
  220.             { 76,  79,  78,  71,   0,   0}, { 76,  79,  85,   0,   0,   0},  
  221.             { 76,  85,   0,   0,   0,   0}, { 76,  85,  65,  78,   0,   0},  
  222.             { 76,  85,  69,   0,   0,   0}, { 76,  85,  78,   0,   0,   0},  
  223.             { 76,  85,  79,   0,   0,   0}, { 77,   0,   0,   0,   0,   0},  
  224.             { 77,  65,   0,   0,   0,   0}, { 77,  65,  73,   0,   0,   0},  
  225.             { 77,  65,  78,   0,   0,   0}, { 77,  65,  78,  71,   0,   0},  
  226.             { 77,  65,  79,   0,   0,   0}, { 77,  69,   0,   0,   0,   0},  
  227.             { 77,  69,  73,   0,   0,   0}, { 77,  69,  78,   0,   0,   0},  
  228.             { 77,  69,  78,  71,   0,   0}, { 77,  73,   0,   0,   0,   0},  
  229.             { 77,  73,  65,  78,   0,   0}, { 77,  73,  65,  79,   0,   0},  
  230.             { 77,  73,  69,   0,   0,   0}, { 77,  73,  78,   0,   0,   0},  
  231.             { 77,  73,  78,  71,   0,   0}, { 77,  73,  85,   0,   0,   0},  
  232.             { 77,  79,   0,   0,   0,   0}, { 77,  79,  85,   0,   0,   0},  
  233.             { 77,  85,   0,   0,   0,   0}, { 78,   0,   0,   0,   0,   0},  
  234.             { 78,  65,   0,   0,   0,   0}, { 78,  65,  73,   0,   0,   0},  
  235.             { 78,  65,  78,   0,   0,   0}, { 78,  65,  78,  71,   0,   0},  
  236.             { 78,  65,  79,   0,   0,   0}, { 78,  69,   0,   0,   0,   0},  
  237.             { 78,  69,  73,   0,   0,   0}, { 78,  69,  78,   0,   0,   0},  
  238.             { 78,  69,  78,  71,   0,   0}, { 78,  73,   0,   0,   0,   0},  
  239.             { 78,  73,  65,  78,   0,   0}, { 78,  73,  65,  78,  71,   0},  
  240.             { 78,  73,  65,  79,   0,   0}, { 78,  73,  69,   0,   0,   0},  
  241.             { 78,  73,  78,   0,   0,   0}, { 78,  73,  78,  71,   0,   0},  
  242.             { 78,  73,  85,   0,   0,   0}, { 78,  79,  78,  71,   0,   0},  
  243.             { 78,  79,  85,   0,   0,   0}, { 78,  85,   0,   0,   0,   0},  
  244.             { 78,  85,  65,  78,   0,   0}, { 78,  85,  69,   0,   0,   0},  
  245.             { 78,  85,  78,   0,   0,   0}, { 78,  85,  79,   0,   0,   0},  
  246.             { 79,   0,   0,   0,   0,   0}, { 79,  85,   0,   0,   0,   0},  
  247.             { 80,  65,   0,   0,   0,   0}, { 80,  65,  73,   0,   0,   0},  
  248.             { 80,  65,  78,   0,   0,   0}, { 80,  65,  78,  71,   0,   0},  
  249.             { 80,  65,  79,   0,   0,   0}, { 80,  69,  73,   0,   0,   0},  
  250.             { 80,  69,  78,   0,   0,   0}, { 80,  69,  78,  71,   0,   0},  
  251.             { 80,  73,   0,   0,   0,   0}, { 80,  73,  65,  78,   0,   0},  
  252.             { 80,  73,  65,  79,   0,   0}, { 80,  73,  69,   0,   0,   0},  
  253.             { 80,  73,  78,   0,   0,   0}, { 80,  73,  78,  71,   0,   0},  
  254.             { 80,  79,   0,   0,   0,   0}, { 80,  79,  85,   0,   0,   0},  
  255.             { 80,  85,   0,   0,   0,   0}, { 81,  73,   0,   0,   0,   0},  
  256.             { 81,  73,  65,   0,   0,   0}, { 81,  73,  65,  78,   0,   0},  
  257.             { 81,  73,  65,  78,  71,   0}, { 81,  73,  65,  79,   0,   0},  
  258.             { 81,  73,  69,   0,   0,   0}, { 81,  73,  78,   0,   0,   0},  
  259.             { 81,  73,  78,  71,   0,   0}, { 81,  73,  79,  78,  71,   0},  
  260.             { 81,  73,  85,   0,   0,   0}, { 81,  85,   0,   0,   0,   0},  
  261.             { 81,  85,  65,  78,   0,   0}, { 81,  85,  69,   0,   0,   0},  
  262.             { 81,  85,  78,   0,   0,   0}, { 82,  65,  78,   0,   0,   0},  
  263.             { 82,  65,  78,  71,   0,   0}, { 82,  65,  79,   0,   0,   0},  
  264.             { 82,  69,   0,   0,   0,   0}, { 82,  69,  78,   0,   0,   0},  
  265.             { 82,  69,  78,  71,   0,   0}, { 82,  73,   0,   0,   0,   0},  
  266.             { 82,  79,  78,  71,   0,   0}, { 82,  79,  85,   0,   0,   0},  
  267.             { 82,  85,   0,   0,   0,   0}, { 82,  85,  65,   0,   0,   0},  
  268.             { 82,  85,  65,  78,   0,   0}, { 82,  85,  73,   0,   0,   0},  
  269.             { 82,  85,  78,   0,   0,   0}, { 82,  85,  79,   0,   0,   0},  
  270.             { 83,  65,   0,   0,   0,   0}, { 83,  65,  73,   0,   0,   0},  
  271.             { 83,  65,  78,   0,   0,   0}, { 83,  65,  78,  71,   0,   0},  
  272.             { 83,  65,  79,   0,   0,   0}, { 83,  69,   0,   0,   0,   0},  
  273.             { 83,  69,  78,   0,   0,   0}, { 83,  69,  78,  71,   0,   0},  
  274.             { 83,  72,  65,   0,   0,   0}, { 83,  72,  65,  73,   0,   0},  
  275.             { 83,  72,  65,  78,   0,   0}, { 83,  72,  65,  78,  71,   0},  
  276.             { 83,  72,  65,  79,   0,   0}, { 83,  72,  69,   0,   0,   0},  
  277.             { 83,  72,  69,  78,   0,   0}, { 88,  73,  78,   0,   0,   0},  
  278.             { 83,  72,  69,  78,   0,   0}, { 83,  72,  69,  78,  71,   0},  
  279.             { 83,  72,  73,   0,   0,   0}, { 83,  72,  79,  85,   0,   0},  
  280.             { 83,  72,  85,   0,   0,   0}, { 83,  72,  85,  65,   0,   0},  
  281.             { 83,  72,  85,  65,  73,   0}, { 83,  72,  85,  65,  78,   0},  
  282.             { 83,  72,  85,  65,  78,  71}, { 83,  72,  85,  73,   0,   0},  
  283.             { 83,  72,  85,  78,   0,   0}, { 83,  72,  85,  79,   0,   0},  
  284.             { 83,  73,   0,   0,   0,   0}, { 83,  79,  78,  71,   0,   0},  
  285.             { 83,  79,  85,   0,   0,   0}, { 83,  85,   0,   0,   0,   0},  
  286.             { 83,  85,  65,  78,   0,   0}, { 83,  85,  73,   0,   0,   0},  
  287.             { 83,  85,  78,   0,   0,   0}, { 83,  85,  79,   0,   0,   0},  
  288.             { 84,  65,   0,   0,   0,   0}, { 84,  65,  73,   0,   0,   0},  
  289.             { 84,  65,  78,   0,   0,   0}, { 84,  65,  78,  71,   0,   0},  
  290.             { 84,  65,  79,   0,   0,   0}, { 84,  69,   0,   0,   0,   0},  
  291.             { 84,  69,  78,  71,   0,   0}, { 84,  73,   0,   0,   0,   0},  
  292.             { 84,  73,  65,  78,   0,   0}, { 84,  73,  65,  79,   0,   0},  
  293.             { 84,  73,  69,   0,   0,   0}, { 84,  73,  78,  71,   0,   0},  
  294.             { 84,  79,  78,  71,   0,   0}, { 84,  79,  85,   0,   0,   0},  
  295.             { 84,  85,   0,   0,   0,   0}, { 84,  85,  65,  78,   0,   0},  
  296.             { 84,  85,  73,   0,   0,   0}, { 84,  85,  78,   0,   0,   0},  
  297.             { 84,  85,  79,   0,   0,   0}, { 87,  65,   0,   0,   0,   0},  
  298.             { 87,  65,  73,   0,   0,   0}, { 87,  65,  78,   0,   0,   0},  
  299.             { 87,  65,  78,  71,   0,   0}, { 87,  69,  73,   0,   0,   0},  
  300.             { 87,  69,  78,   0,   0,   0}, { 87,  69,  78,  71,   0,   0},  
  301.             { 87,  79,   0,   0,   0,   0}, { 87,  85,   0,   0,   0,   0},  
  302.             { 88,  73,   0,   0,   0,   0}, { 88,  73,  65,   0,   0,   0},  
  303.             { 88,  73,  65,  78,   0,   0}, { 88,  73,  65,  78,  71,   0},  
  304.             { 88,  73,  65,  79,   0,   0}, { 88,  73,  69,   0,   0,   0},  
  305.             { 88,  73,  78,   0,   0,   0}, { 88,  73,  78,  71,   0,   0},  
  306.             { 88,  73,  79,  78,  71,   0}, { 88,  73,  85,   0,   0,   0},  
  307.             { 88,  85,   0,   0,   0,   0}, { 88,  85,  65,  78,   0,   0},  
  308.             { 88,  85,  69,   0,   0,   0}, { 88,  85,  78,   0,   0,   0},  
  309.             { 89,  65,   0,   0,   0,   0}, { 89,  65,  78,   0,   0,   0},  
  310.             { 89,  65,  78,  71,   0,   0}, { 89,  65,  79,   0,   0,   0},  
  311.             { 89,  69,   0,   0,   0,   0}, { 89,  73,   0,   0,   0,   0},  
  312.             { 89,  73,  78,   0,   0,   0}, { 89,  73,  78,  71,   0,   0},  
  313.             { 89,  79,   0,   0,   0,   0}, { 89,  79,  78,  71,   0,   0},  
  314.             { 89,  79,  85,   0,   0,   0}, { 89,  85,   0,   0,   0,   0},  
  315.             { 89,  85,  65,  78,   0,   0}, { 89,  85,  69,   0,   0,   0},  
  316.             { 89,  85,  78,   0,   0,   0}, { 74,  85,  78,   0,   0,   0},  
  317.             { 89,  85,  78,   0,   0,   0}, { 90,  65,   0,   0,   0,   0},  
  318.             { 90,  65,  73,   0,   0,   0}, { 90,  65,  78,   0,   0,   0},  
  319.             { 90,  65,  78,  71,   0,   0}, { 90,  65,  79,   0,   0,   0},  
  320.             { 90,  69,   0,   0,   0,   0}, { 90,  69,  73,   0,   0,   0},  
  321.             { 90,  69,  78,   0,   0,   0}, { 90,  69,  78,  71,   0,   0},  
  322.             { 90,  72,  65,   0,   0,   0}, { 90,  72,  65,  73,   0,   0},  
  323.             { 90,  72,  65,  78,   0,   0}, { 90,  72,  65,  78,  71,   0},  
  324.             { 67,  72,  65,  78,  71,   0}, { 90,  72,  65,  78,  71,   0},  
  325.             { 90,  72,  65,  79,   0,   0}, { 90,  72,  69,   0,   0,   0},  
  326.             { 90,  72,  69,  78,   0,   0}, { 90,  72,  69,  78,  71,   0},  
  327.             { 90,  72,  73,   0,   0,   0}, { 83,  72,  73,   0,   0,   0},  
  328.             { 90,  72,  73,   0,   0,   0}, { 90,  72,  79,  78,  71,   0},  
  329.             { 90,  72,  79,  85,   0,   0}, { 90,  72,  85,   0,   0,   0},  
  330.             { 90,  72,  85,  65,   0,   0}, { 90,  72,  85,  65,  73,   0},  
  331.             { 90,  72,  85,  65,  78,   0}, { 90,  72,  85,  65,  78,  71},  
  332.             { 90,  72,  85,  73,   0,   0}, { 90,  72,  85,  78,   0,   0},  
  333.             { 90,  72,  85,  79,   0,   0}, { 90,  73,   0,   0,   0,   0},  
  334.             { 90,  79,  78,  71,   0,   0}, { 90,  79,  85,   0,   0,   0},  
  335.             { 90,  85,   0,   0,   0,   0}, { 90,  85,  65,  78,   0,   0},  
  336.             { 90,  85,  73,   0,   0,   0}, { 90,  85,  78,   0,   0,   0},  
  337.             { 90,  85,  79,   0,   0,   0}, {  0,   0,   0,   0,   0,   0},  
  338.             { 83,  72,  65,  78,   0,   0}, {  0,   0,   0,   0,   0,   0}, };  
  339.   
  340.     /** First and last Chinese character with known Pinyin according to zh collation */  
  341.     private static final String FIRST_PINYIN_UNIHAN = "\u963F";  
  342.     private static final String LAST_PINYIN_UNIHAN = "\u9FFF";  
  343.   
  344.     private static final Collator COLLATOR = Collator.getInstance(Locale.CHINA);  
  345.   
  346.     private static HanziToPinyin sInstance;  
  347.     private final boolean mHasChinaCollator;  
  348.   
  349.     public static class Token {  
  350.         /** 
  351.          * Separator between target string for each source char 
  352.          */  
  353.         public static final String SEPARATOR = " ";  
  354.   
  355.         public static final int LATIN = 1;  
  356.         public static final int PINYIN = 2;  
  357.         public static final int UNKNOWN = 3;  
  358.   
  359.         public Token() {  
  360.         }  
  361.   
  362.         public Token(int type, String source, String target) {  
  363.             this.type = type;  
  364.             this.source = source;  
  365.             this.target = target;  
  366.         }  
  367.   
  368.         /** 
  369.          * Type of this token, ASCII, PINYIN or UNKNOWN. 
  370.          */  
  371.         public int type;  
  372.         /** 
  373.          * Original string before translation. 
  374.          */  
  375.         public String source;  
  376.         /** 
  377.          * Translated string of source. For Han, target is corresponding Pinyin. Otherwise target is 
  378.          * original string in source. 
  379.          */  
  380.         public String target;  
  381.     }  
  382.   
  383.     protected HanziToPinyin(boolean hasChinaCollator) {  
  384.         mHasChinaCollator = hasChinaCollator;  
  385.     }  
  386.   
  387.     public static HanziToPinyin getInstance() {  
  388.         synchronized (HanziToPinyin.class) {  
  389.             if (sInstance != null) {  
  390.                 return sInstance;  
  391.             }  
  392.             // Check if zh_CN collation data is available  
  393.             final Locale locale[] = Collator.getAvailableLocales();  
  394.             for (int i = 0; i < locale.length; i++) {  
  395.                 if (locale[i].equals(Locale.CHINA)) {  
  396.                     // Do self validation just once.  
  397.                     if (DEBUG) {  
  398.                         Log.d(TAG, "Self validation. Result: " + doSelfValidation());  
  399.                     }  
  400.                     sInstance = new HanziToPinyin(true);  
  401.                     return sInstance;  
  402.                 }  
  403.             }  
  404.             Log.w(TAG, "There is no Chinese collator, HanziToPinyin is disabled");  
  405.             sInstance = new HanziToPinyin(false);  
  406.             return sInstance;  
  407.         }  
  408.     }  
  409.   
  410.     /** 
  411.      * Validate if our internal table has some wrong value. 
  412.      * 
  413.      * @return true when the table looks correct. 
  414.      */  
  415.     private static boolean doSelfValidation() {  
  416.         char lastChar = UNIHANS[0];  
  417.         String lastString = Character.toString(lastChar);  
  418.         for (char c : UNIHANS) {  
  419.             if (lastChar == c) {  
  420.                 continue;  
  421.             }  
  422.             final String curString = Character.toString(c);  
  423.             int cmp = COLLATOR.compare(lastString, curString);  
  424.             if (cmp >= 0) {  
  425.                 Log.e(TAG, "Internal error in Unihan table. " + "The last string \"" + lastString  
  426.                         + "\" is greater than current string \"" + curString + "\".");  
  427.                 return false;  
  428.             }  
  429.             lastString = curString;  
  430.         }  
  431.         return true;  
  432.     }  
  433.   
  434.     private Token getToken(char character) {  
  435.         Token token = new Token();  
  436.         final String letter = Character.toString(character);  
  437.         token.source = letter;  
  438.         int offset = -1;  
  439.         int cmp;  
  440.         if (character < 256) {  
  441.             token.type = Token.LATIN;  
  442.             token.target = letter;  
  443.             return token;  
  444.         } else {  
  445.             cmp = COLLATOR.compare(letter, FIRST_PINYIN_UNIHAN);  
  446.             if (cmp < 0) {  
  447.                 token.type = Token.UNKNOWN;  
  448.                 token.target = letter;  
  449.                 return token;  
  450.             } else if (cmp == 0) {  
  451.                 token.type = Token.PINYIN;  
  452.                 offset = 0;  
  453.             } else {  
  454.                 cmp = COLLATOR.compare(letter, LAST_PINYIN_UNIHAN);  
  455.                 if (cmp > 0) {  
  456.                     token.type = Token.UNKNOWN;  
  457.                     token.target = letter;  
  458.                     return token;  
  459.                 } else if (cmp == 0) {  
  460.                     token.type = Token.PINYIN;  
  461.                     offset = UNIHANS.length - 1;  
  462.                 }  
  463.             }  
  464.         }  
  465.   
  466.         token.type = Token.PINYIN;  
  467.         if (offset < 0) {  
  468.             int begin = 0;  
  469.             int end = UNIHANS.length - 1;  
  470.             while (begin <= end) {  
  471.                 offset = (begin + end) / 2;  
  472.                 final String unihan = Character.toString(UNIHANS[offset]);  
  473.                 cmp = COLLATOR.compare(letter, unihan);  
  474.                 if (cmp == 0) {  
  475.                     break;  
  476.                 } else if (cmp > 0) {  
  477.                     begin = offset + 1;  
  478.                 } else {  
  479.                     end = offset - 1;  
  480.                 }  
  481.             }  
  482.         }  
  483.         if (cmp < 0) {  
  484.             offset--;  
  485.         }  
  486.         StringBuilder pinyin = new StringBuilder();  
  487.         for (int j = 0; j < PINYINS[offset].length && PINYINS[offset][j] != 0; j++) {  
  488.             pinyin.append((char) PINYINS[offset][j]);  
  489.         }  
  490.         token.target = pinyin.toString();  
  491.         if (TextUtils.isEmpty(token.target)) {  
  492.             token.type = Token.UNKNOWN;  
  493.             token.target = token.source;  
  494.         }  
  495.         return token;  
  496.     }  
  497.   
  498.     /** 
  499.      * Convert the input to a array of tokens. The sequence of ASCII or Unknown characters without 
  500.      * space will be put into a Token, One Hanzi character which has pinyin will be treated as a 
  501.      * Token. If these is no China collator, the empty token array is returned. 
  502.      */  
  503.     public ArrayList<Token> get(final String input) {  
  504.         ArrayList<Token> tokens = new ArrayList<Token>();  
  505.         if (!mHasChinaCollator || TextUtils.isEmpty(input)) {  
  506.             // return empty tokens.  
  507.             return tokens;  
  508.         }  
  509.         final int inputLength = input.length();  
  510.         final StringBuilder sb = new StringBuilder();  
  511.         int tokenType = Token.LATIN;  
  512.         // Go through the input, create a new token when  
  513.         // a. Token type changed  
  514.         // b. Get the Pinyin of current charater.  
  515.         // c. current character is space.  
  516.         for (int i = 0; i < inputLength; i++) {  
  517.             final char character = input.charAt(i);  
  518.             if (character == ' ') {  
  519.                 if (sb.length() > 0) {  
  520.                     addToken(sb, tokens, tokenType);  
  521.                 }  
  522.             } else if (character < 256) {  
  523.                 if (tokenType != Token.LATIN && sb.length() > 0) {  
  524.                     addToken(sb, tokens, tokenType);  
  525.                 }  
  526.                 tokenType = Token.LATIN;  
  527.                 sb.append(character);  
  528.             } else {  
  529.                 Token t = getToken(character);  
  530.                 if (t.type == Token.PINYIN) {  
  531.                     if (sb.length() > 0) {  
  532.                         addToken(sb, tokens, tokenType);  
  533.                     }  
  534.                     tokens.add(t);  
  535.                     tokenType = Token.PINYIN;  
  536.                 } else {  
  537.                     if (tokenType != t.type && sb.length() > 0) {  
  538.                         addToken(sb, tokens, tokenType);  
  539.                     }  
  540.                     tokenType = t.type;  
  541.                     sb.append(character);  
  542.                 }  
  543.             }  
  544.         }  
  545.         if (sb.length() > 0) {  
  546.             addToken(sb, tokens, tokenType);  
  547.         }  
  548.         return tokens;  
  549.     }  
  550.   
  551.     private void addToken(  
  552.             final StringBuilder sb, final ArrayList<Token> tokens, final int tokenType) {  
  553.         String str = sb.toString();  
  554.         tokens.add(new Token(tokenType, str, str));  
  555.         sb.setLength(0);  
  556.     }  
  557. }  
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.suntek.mobilemeeting.utils;

import android.text.TextUtils;
import android.util.Log;

import java.text.Collator;
import java.util.ArrayList;
import java.util.Locale;

/**
 * An object to convert Chinese character to its corresponding pinyin string. For characters with
 * multiple possible pinyin string, only one is selected according to collator. Polyphone is not
 * supported in this implementation. This class is implemented to achieve the best runtime
 * performance and minimum runtime resources with tolerable sacrifice of accuracy. This
 * implementation highly depends on zh_CN ICU collation data and must be always synchronized with
 * ICU.
 *
 * Currently this file is aligned to zh.txt in ICU 4.6
 */
public class HanziToPinyin {
    private static final String TAG = "HanziToPinyin";

    // Turn on this flag when we want to check internal data structure.
    private static final boolean DEBUG = false;

    /**
     * Unihans array.
     *
     * Each unihans is the first one within same pinyin when collator is zh_CN.
     */
    public static final char[] UNIHANS = {
            '\u963f', '\u54ce', '\u5b89', '\u80ae', '\u51f9', '\u516b',
            '\u6300', '\u6273', '\u90a6', '\u52f9', '\u9642', '\u5954',
            '\u4f3b', '\u5c44', '\u8fb9', '\u706c', '\u618b', '\u6c43',
            '\u51ab', '\u7676', '\u5cec', '\u5693', '\u5072', '\u53c2',
            '\u4ed3', '\u64a1', '\u518a', '\u5d7e', '\u66fd', '\u66fe',
            '\u5c64', '\u53c9', '\u8286', '\u8fbf', '\u4f25', '\u6284',
            '\u8f66', '\u62bb', '\u6c88', '\u6c89', '\u9637', '\u5403',
            '\u5145', '\u62bd', '\u51fa', '\u6b3b', '\u63e3', '\u5ddb',
            '\u5205', '\u5439', '\u65fe', '\u9034', '\u5472', '\u5306',
            '\u51d1', '\u7c97', '\u6c46', '\u5d14', '\u90a8', '\u6413',
            '\u5491', '\u5446', '\u4e39', '\u5f53', '\u5200', '\u561a',
            '\u6265', '\u706f', '\u6c10', '\u55f2', '\u7538', '\u5201',
            '\u7239', '\u4e01', '\u4e1f', '\u4e1c', '\u543a', '\u53be',
            '\u8011', '\u8968', '\u5428', '\u591a', '\u59b8', '\u8bf6',
            '\u5940', '\u97a5', '\u513f', '\u53d1', '\u5e06', '\u531a',
            '\u98de', '\u5206', '\u4e30', '\u8985', '\u4ecf', '\u7d11',
            '\u4f15', '\u65ee', '\u4f85', '\u7518', '\u5188', '\u768b',
            '\u6208', '\u7ed9', '\u6839', '\u522f', '\u5de5', '\u52fe',
            '\u4f30', '\u74dc', '\u4e56', '\u5173', '\u5149', '\u5f52',
            '\u4e28', '\u5459', '\u54c8', '\u548d', '\u4f44', '\u592f',
            '\u8320', '\u8bc3', '\u9ed2', '\u62eb', '\u4ea8', '\u5677',
            '\u53ff', '\u9f41', '\u4e6f', '\u82b1', '\u6000', '\u72bf',
            '\u5ddf', '\u7070', '\u660f', '\u5419', '\u4e0c', '\u52a0',
            '\u620b', '\u6c5f', '\u827d', '\u9636', '\u5dfe', '\u5755',
            '\u5182', '\u4e29', '\u51e5', '\u59e2', '\u5658', '\u519b',
            '\u5494', '\u5f00', '\u520a', '\u5ffc', '\u5c3b', '\u533c',
            '\u808e', '\u52a5', '\u7a7a', '\u62a0', '\u625d', '\u5938',
            '\u84af', '\u5bbd', '\u5321', '\u4e8f', '\u5764', '\u6269',
            '\u5783', '\u6765', '\u5170', '\u5577', '\u635e', '\u808b',
            '\u52d2', '\u5d1a', '\u5215', '\u4fe9', '\u5941', '\u826f',
            '\u64a9', '\u5217', '\u62ce', '\u5222', '\u6e9c', '\u56d6',
            '\u9f99', '\u779c', '\u565c', '\u5a08', '\u7567', '\u62a1',
            '\u7f57', '\u5463', '\u5988', '\u57cb', '\u5ada', '\u7264',
            '\u732b', '\u4e48', '\u5445', '\u95e8', '\u753f', '\u54aa',
            '\u5b80', '\u55b5', '\u4e5c', '\u6c11', '\u540d', '\u8c2c',
            '\u6478', '\u54de', '\u6bea', '\u55ef', '\u62cf', '\u8149',
            '\u56e1', '\u56d4', '\u5b6c', '\u7592', '\u5a1e', '\u6041',
            '\u80fd', '\u59ae', '\u62c8', '\u5b22', '\u9e1f', '\u634f',
            '\u56dc', '\u5b81', '\u599e', '\u519c', '\u7fba', '\u5974',
            '\u597b', '\u759f', '\u9ec1', '\u90cd', '\u5594', '\u8bb4',
            '\u5991', '\u62cd', '\u7705', '\u4e53', '\u629b', '\u5478',
            '\u55b7', '\u5309', '\u4e15', '\u56e8', '\u527d', '\u6c15',
            '\u59d8', '\u4e52', '\u948b', '\u5256', '\u4ec6', '\u4e03',
            '\u6390', '\u5343', '\u545b', '\u6084', '\u767f', '\u4eb2',
            '\u72c5', '\u828e', '\u4e18', '\u533a', '\u5cd1', '\u7f3a',
            '\u590b', '\u5465', '\u7a63', '\u5a06', '\u60f9', '\u4eba',
            '\u6254', '\u65e5', '\u8338', '\u53b9', '\u909a', '\u633c',
            '\u5827', '\u5a51', '\u77a4', '\u637c', '\u4ee8', '\u6be2',
            '\u4e09', '\u6852', '\u63bb', '\u95aa', '\u68ee', '\u50e7',
            '\u6740', '\u7b5b', '\u5c71', '\u4f24', '\u5f30', '\u5962',
            '\u7533', '\u8398', '\u6552', '\u5347', '\u5c38', '\u53ce',
            '\u4e66', '\u5237', '\u8870', '\u95e9', '\u53cc', '\u8c01',
            '\u542e', '\u8bf4', '\u53b6', '\u5fea', '\u635c', '\u82cf',
            '\u72fb', '\u590a', '\u5b59', '\u5506', '\u4ed6', '\u56fc',
            '\u574d', '\u6c64', '\u5932', '\u5fd1', '\u71a5', '\u5254',
            '\u5929', '\u65eb', '\u5e16', '\u5385', '\u56f2', '\u5077',
            '\u51f8', '\u6e4d', '\u63a8', '\u541e', '\u4e47', '\u7a75',
            '\u6b6a', '\u5f2f', '\u5c23', '\u5371', '\u6637', '\u7fc1',
            '\u631d', '\u4e4c', '\u5915', '\u8672', '\u4eda', '\u4e61',
            '\u7071', '\u4e9b', '\u5fc3', '\u661f', '\u51f6', '\u4f11',
            '\u5401', '\u5405', '\u524a', '\u5743', '\u4e2b', '\u6079',
            '\u592e', '\u5e7a', '\u503b', '\u4e00', '\u56d9', '\u5e94',
            '\u54df', '\u4f63', '\u4f18', '\u625c', '\u56e6', '\u66f0',
            '\u6655', '\u7b60', '\u7b7c', '\u5e00', '\u707d', '\u5142',
            '\u5328', '\u50ae', '\u5219', '\u8d3c', '\u600e', '\u5897',
            '\u624e', '\u635a', '\u6cbe', '\u5f20', '\u957f', '\u9577',
            '\u4f4b', '\u8707', '\u8d1e', '\u4e89', '\u4e4b', '\u5cd9',
            '\u5ea2', '\u4e2d', '\u5dde', '\u6731', '\u6293', '\u62fd',
            '\u4e13', '\u5986', '\u96b9', '\u5b92', '\u5353', '\u4e72',
            '\u5b97', '\u90b9', '\u79df', '\u94bb', '\u539c', '\u5c0a',
            '\u6628', '\u5159', '\u9fc3', '\u9fc4', };

    /**
     * Pinyin array.
     *
     * Each pinyin is corresponding to unihans of same
     * offset in the unihans array.
     */
    public static final byte[][] PINYINS = {
            { 65,   0,   0,   0,   0,   0}, { 65,  73,   0,   0,   0,   0},
            { 65,  78,   0,   0,   0,   0}, { 65,  78,  71,   0,   0,   0},
            { 65,  79,   0,   0,   0,   0}, { 66,  65,   0,   0,   0,   0},
            { 66,  65,  73,   0,   0,   0}, { 66,  65,  78,   0,   0,   0},
            { 66,  65,  78,  71,   0,   0}, { 66,  65,  79,   0,   0,   0},
            { 66,  69,  73,   0,   0,   0}, { 66,  69,  78,   0,   0,   0},
            { 66,  69,  78,  71,   0,   0}, { 66,  73,   0,   0,   0,   0},
            { 66,  73,  65,  78,   0,   0}, { 66,  73,  65,  79,   0,   0},
            { 66,  73,  69,   0,   0,   0}, { 66,  73,  78,   0,   0,   0},
            { 66,  73,  78,  71,   0,   0}, { 66,  79,   0,   0,   0,   0},
            { 66,  85,   0,   0,   0,   0}, { 67,  65,   0,   0,   0,   0},
            { 67,  65,  73,   0,   0,   0}, { 67,  65,  78,   0,   0,   0},
            { 67,  65,  78,  71,   0,   0}, { 67,  65,  79,   0,   0,   0},
            { 67,  69,   0,   0,   0,   0}, { 67,  69,  78,   0,   0,   0},
            { 67,  69,  78,  71,   0,   0}, { 90,  69,  78,  71,   0,   0},
            { 67,  69,  78,  71,   0,   0}, { 67,  72,  65,   0,   0,   0},
            { 67,  72,  65,  73,   0,   0}, { 67,  72,  65,  78,   0,   0},
            { 67,  72,  65,  78,  71,   0}, { 67,  72,  65,  79,   0,   0},
            { 67,  72,  69,   0,   0,   0}, { 67,  72,  69,  78,   0,   0},
            { 83,  72,  69,  78,   0,   0}, { 67,  72,  69,  78,   0,   0},
            { 67,  72,  69,  78,  71,   0}, { 67,  72,  73,   0,   0,   0},
            { 67,  72,  79,  78,  71,   0}, { 67,  72,  79,  85,   0,   0},
            { 67,  72,  85,   0,   0,   0}, { 67,  72,  85,  65,   0,   0},
            { 67,  72,  85,  65,  73,   0}, { 67,  72,  85,  65,  78,   0},
            { 67,  72,  85,  65,  78,  71}, { 67,  72,  85,  73,   0,   0},
            { 67,  72,  85,  78,   0,   0}, { 67,  72,  85,  79,   0,   0},
            { 67,  73,   0,   0,   0,   0}, { 67,  79,  78,  71,   0,   0},
            { 67,  79,  85,   0,   0,   0}, { 67,  85,   0,   0,   0,   0},
            { 67,  85,  65,  78,   0,   0}, { 67,  85,  73,   0,   0,   0},
            { 67,  85,  78,   0,   0,   0}, { 67,  85,  79,   0,   0,   0},
            { 68,  65,   0,   0,   0,   0}, { 68,  65,  73,   0,   0,   0},
            { 68,  65,  78,   0,   0,   0}, { 68,  65,  78,  71,   0,   0},
            { 68,  65,  79,   0,   0,   0}, { 68,  69,   0,   0,   0,   0},
            { 68,  69,  78,   0,   0,   0}, { 68,  69,  78,  71,   0,   0},
            { 68,  73,   0,   0,   0,   0}, { 68,  73,  65,   0,   0,   0},
            { 68,  73,  65,  78,   0,   0}, { 68,  73,  65,  79,   0,   0},
            { 68,  73,  69,   0,   0,   0}, { 68,  73,  78,  71,   0,   0},
            { 68,  73,  85,   0,   0,   0}, { 68,  79,  78,  71,   0,   0},
            { 68,  79,  85,   0,   0,   0}, { 68,  85,   0,   0,   0,   0},
            { 68,  85,  65,  78,   0,   0}, { 68,  85,  73,   0,   0,   0},
            { 68,  85,  78,   0,   0,   0}, { 68,  85,  79,   0,   0,   0},
            { 69,   0,   0,   0,   0,   0}, { 69,  73,   0,   0,   0,   0},
            { 69,  78,   0,   0,   0,   0}, { 69,  78,  71,   0,   0,   0},
            { 69,  82,   0,   0,   0,   0}, { 70,  65,   0,   0,   0,   0},
            { 70,  65,  78,   0,   0,   0}, { 70,  65,  78,  71,   0,   0},
            { 70,  69,  73,   0,   0,   0}, { 70,  69,  78,   0,   0,   0},
            { 70,  69,  78,  71,   0,   0}, { 70,  73,  65,  79,   0,   0},
            { 70,  79,   0,   0,   0,   0}, { 70,  79,  85,   0,   0,   0},
            { 70,  85,   0,   0,   0,   0}, { 71,  65,   0,   0,   0,   0},
            { 71,  65,  73,   0,   0,   0}, { 71,  65,  78,   0,   0,   0},
            { 71,  65,  78,  71,   0,   0}, { 71,  65,  79,   0,   0,   0},
            { 71,  69,   0,   0,   0,   0}, { 71,  69,  73,   0,   0,   0},
            { 71,  69,  78,   0,   0,   0}, { 71,  69,  78,  71,   0,   0},
            { 71,  79,  78,  71,   0,   0}, { 71,  79,  85,   0,   0,   0},
            { 71,  85,   0,   0,   0,   0}, { 71,  85,  65,   0,   0,   0},
            { 71,  85,  65,  73,   0,   0}, { 71,  85,  65,  78,   0,   0},
            { 71,  85,  65,  78,  71,   0}, { 71,  85,  73,   0,   0,   0},
            { 71,  85,  78,   0,   0,   0}, { 71,  85,  79,   0,   0,   0},
            { 72,  65,   0,   0,   0,   0}, { 72,  65,  73,   0,   0,   0},
            { 72,  65,  78,   0,   0,   0}, { 72,  65,  78,  71,   0,   0},
            { 72,  65,  79,   0,   0,   0}, { 72,  69,   0,   0,   0,   0},
            { 72,  69,  73,   0,   0,   0}, { 72,  69,  78,   0,   0,   0},
            { 72,  69,  78,  71,   0,   0}, { 72,  77,   0,   0,   0,   0},
            { 72,  79,  78,  71,   0,   0}, { 72,  79,  85,   0,   0,   0},
            { 72,  85,   0,   0,   0,   0}, { 72,  85,  65,   0,   0,   0},
            { 72,  85,  65,  73,   0,   0}, { 72,  85,  65,  78,   0,   0},
            { 72,  85,  65,  78,  71,   0}, { 72,  85,  73,   0,   0,   0},
            { 72,  85,  78,   0,   0,   0}, { 72,  85,  79,   0,   0,   0},
            { 74,  73,   0,   0,   0,   0}, { 74,  73,  65,   0,   0,   0},
            { 74,  73,  65,  78,   0,   0}, { 74,  73,  65,  78,  71,   0},
            { 74,  73,  65,  79,   0,   0}, { 74,  73,  69,   0,   0,   0},
            { 74,  73,  78,   0,   0,   0}, { 74,  73,  78,  71,   0,   0},
            { 74,  73,  79,  78,  71,   0}, { 74,  73,  85,   0,   0,   0},
            { 74,  85,   0,   0,   0,   0}, { 74,  85,  65,  78,   0,   0},
            { 74,  85,  69,   0,   0,   0}, { 74,  85,  78,   0,   0,   0},
            { 75,  65,   0,   0,   0,   0}, { 75,  65,  73,   0,   0,   0},
            { 75,  65,  78,   0,   0,   0}, { 75,  65,  78,  71,   0,   0},
            { 75,  65,  79,   0,   0,   0}, { 75,  69,   0,   0,   0,   0},
            { 75,  69,  78,   0,   0,   0}, { 75,  69,  78,  71,   0,   0},
            { 75,  79,  78,  71,   0,   0}, { 75,  79,  85,   0,   0,   0},
            { 75,  85,   0,   0,   0,   0}, { 75,  85,  65,   0,   0,   0},
            { 75,  85,  65,  73,   0,   0}, { 75,  85,  65,  78,   0,   0},
            { 75,  85,  65,  78,  71,   0}, { 75,  85,  73,   0,   0,   0},
            { 75,  85,  78,   0,   0,   0}, { 75,  85,  79,   0,   0,   0},
            { 76,  65,   0,   0,   0,   0}, { 76,  65,  73,   0,   0,   0},
            { 76,  65,  78,   0,   0,   0}, { 76,  65,  78,  71,   0,   0},
            { 76,  65,  79,   0,   0,   0}, { 76,  69,   0,   0,   0,   0},
            { 76,  69,  73,   0,   0,   0}, { 76,  69,  78,  71,   0,   0},
            { 76,  73,   0,   0,   0,   0}, { 76,  73,  65,   0,   0,   0},
            { 76,  73,  65,  78,   0,   0}, { 76,  73,  65,  78,  71,   0},
            { 76,  73,  65,  79,   0,   0}, { 76,  73,  69,   0,   0,   0},
            { 76,  73,  78,   0,   0,   0}, { 76,  73,  78,  71,   0,   0},
            { 76,  73,  85,   0,   0,   0}, { 76,  79,   0,   0,   0,   0},
            { 76,  79,  78,  71,   0,   0}, { 76,  79,  85,   0,   0,   0},
            { 76,  85,   0,   0,   0,   0}, { 76,  85,  65,  78,   0,   0},
            { 76,  85,  69,   0,   0,   0}, { 76,  85,  78,   0,   0,   0},
            { 76,  85,  79,   0,   0,   0}, { 77,   0,   0,   0,   0,   0},
            { 77,  65,   0,   0,   0,   0}, { 77,  65,  73,   0,   0,   0},
            { 77,  65,  78,   0,   0,   0}, { 77,  65,  78,  71,   0,   0},
            { 77,  65,  79,   0,   0,   0}, { 77,  69,   0,   0,   0,   0},
            { 77,  69,  73,   0,   0,   0}, { 77,  69,  78,   0,   0,   0},
            { 77,  69,  78,  71,   0,   0}, { 77,  73,   0,   0,   0,   0},
            { 77,  73,  65,  78,   0,   0}, { 77,  73,  65,  79,   0,   0},
            { 77,  73,  69,   0,   0,   0}, { 77,  73,  78,   0,   0,   0},
            { 77,  73,  78,  71,   0,   0}, { 77,  73,  85,   0,   0,   0},
            { 77,  79,   0,   0,   0,   0}, { 77,  79,  85,   0,   0,   0},
            { 77,  85,   0,   0,   0,   0}, { 78,   0,   0,   0,   0,   0},
            { 78,  65,   0,   0,   0,   0}, { 78,  65,  73,   0,   0,   0},
            { 78,  65,  78,   0,   0,   0}, { 78,  65,  78,  71,   0,   0},
            { 78,  65,  79,   0,   0,   0}, { 78,  69,   0,   0,   0,   0},
            { 78,  69,  73,   0,   0,   0}, { 78,  69,  78,   0,   0,   0},
            { 78,  69,  78,  71,   0,   0}, { 78,  73,   0,   0,   0,   0},
            { 78,  73,  65,  78,   0,   0}, { 78,  73,  65,  78,  71,   0},
            { 78,  73,  65,  79,   0,   0}, { 78,  73,  69,   0,   0,   0},
            { 78,  73,  78,   0,   0,   0}, { 78,  73,  78,  71,   0,   0},
            { 78,  73,  85,   0,   0,   0}, { 78,  79,  78,  71,   0,   0},
            { 78,  79,  85,   0,   0,   0}, { 78,  85,   0,   0,   0,   0},
            { 78,  85,  65,  78,   0,   0}, { 78,  85,  69,   0,   0,   0},
            { 78,  85,  78,   0,   0,   0}, { 78,  85,  79,   0,   0,   0},
            { 79,   0,   0,   0,   0,   0}, { 79,  85,   0,   0,   0,   0},
            { 80,  65,   0,   0,   0,   0}, { 80,  65,  73,   0,   0,   0},
            { 80,  65,  78,   0,   0,   0}, { 80,  65,  78,  71,   0,   0},
            { 80,  65,  79,   0,   0,   0}, { 80,  69,  73,   0,   0,   0},
            { 80,  69,  78,   0,   0,   0}, { 80,  69,  78,  71,   0,   0},
            { 80,  73,   0,   0,   0,   0}, { 80,  73,  65,  78,   0,   0},
            { 80,  73,  65,  79,   0,   0}, { 80,  73,  69,   0,   0,   0},
            { 80,  73,  78,   0,   0,   0}, { 80,  73,  78,  71,   0,   0},
            { 80,  79,   0,   0,   0,   0}, { 80,  79,  85,   0,   0,   0},
            { 80,  85,   0,   0,   0,   0}, { 81,  73,   0,   0,   0,   0},
            { 81,  73,  65,   0,   0,   0}, { 81,  73,  65,  78,   0,   0},
            { 81,  73,  65,  78,  71,   0}, { 81,  73,  65,  79,   0,   0},
            { 81,  73,  69,   0,   0,   0}, { 81,  73,  78,   0,   0,   0},
            { 81,  73,  78,  71,   0,   0}, { 81,  73,  79,  78,  71,   0},
            { 81,  73,  85,   0,   0,   0}, { 81,  85,   0,   0,   0,   0},
            { 81,  85,  65,  78,   0,   0}, { 81,  85,  69,   0,   0,   0},
            { 81,  85,  78,   0,   0,   0}, { 82,  65,  78,   0,   0,   0},
            { 82,  65,  78,  71,   0,   0}, { 82,  65,  79,   0,   0,   0},
            { 82,  69,   0,   0,   0,   0}, { 82,  69,  78,   0,   0,   0},
            { 82,  69,  78,  71,   0,   0}, { 82,  73,   0,   0,   0,   0},
            { 82,  79,  78,  71,   0,   0}, { 82,  79,  85,   0,   0,   0},
            { 82,  85,   0,   0,   0,   0}, { 82,  85,  65,   0,   0,   0},
            { 82,  85,  65,  78,   0,   0}, { 82,  85,  73,   0,   0,   0},
            { 82,  85,  78,   0,   0,   0}, { 82,  85,  79,   0,   0,   0},
            { 83,  65,   0,   0,   0,   0}, { 83,  65,  73,   0,   0,   0},
            { 83,  65,  78,   0,   0,   0}, { 83,  65,  78,  71,   0,   0},
            { 83,  65,  79,   0,   0,   0}, { 83,  69,   0,   0,   0,   0},
            { 83,  69,  78,   0,   0,   0}, { 83,  69,  78,  71,   0,   0},
            { 83,  72,  65,   0,   0,   0}, { 83,  72,  65,  73,   0,   0},
            { 83,  72,  65,  78,   0,   0}, { 83,  72,  65,  78,  71,   0},
            { 83,  72,  65,  79,   0,   0}, { 83,  72,  69,   0,   0,   0},
            { 83,  72,  69,  78,   0,   0}, { 88,  73,  78,   0,   0,   0},
            { 83,  72,  69,  78,   0,   0}, { 83,  72,  69,  78,  71,   0},
            { 83,  72,  73,   0,   0,   0}, { 83,  72,  79,  85,   0,   0},
            { 83,  72,  85,   0,   0,   0}, { 83,  72,  85,  65,   0,   0},
            { 83,  72,  85,  65,  73,   0}, { 83,  72,  85,  65,  78,   0},
            { 83,  72,  85,  65,  78,  71}, { 83,  72,  85,  73,   0,   0},
            { 83,  72,  85,  78,   0,   0}, { 83,  72,  85,  79,   0,   0},
            { 83,  73,   0,   0,   0,   0}, { 83,  79,  78,  71,   0,   0},
            { 83,  79,  85,   0,   0,   0}, { 83,  85,   0,   0,   0,   0},
            { 83,  85,  65,  78,   0,   0}, { 83,  85,  73,   0,   0,   0},
            { 83,  85,  78,   0,   0,   0}, { 83,  85,  79,   0,   0,   0},
            { 84,  65,   0,   0,   0,   0}, { 84,  65,  73,   0,   0,   0},
            { 84,  65,  78,   0,   0,   0}, { 84,  65,  78,  71,   0,   0},
            { 84,  65,  79,   0,   0,   0}, { 84,  69,   0,   0,   0,   0},
            { 84,  69,  78,  71,   0,   0}, { 84,  73,   0,   0,   0,   0},
            { 84,  73,  65,  78,   0,   0}, { 84,  73,  65,  79,   0,   0},
            { 84,  73,  69,   0,   0,   0}, { 84,  73,  78,  71,   0,   0},
            { 84,  79,  78,  71,   0,   0}, { 84,  79,  85,   0,   0,   0},
            { 84,  85,   0,   0,   0,   0}, { 84,  85,  65,  78,   0,   0},
            { 84,  85,  73,   0,   0,   0}, { 84,  85,  78,   0,   0,   0},
            { 84,  85,  79,   0,   0,   0}, { 87,  65,   0,   0,   0,   0},
            { 87,  65,  73,   0,   0,   0}, { 87,  65,  78,   0,   0,   0},
            { 87,  65,  78,  71,   0,   0}, { 87,  69,  73,   0,   0,   0},
            { 87,  69,  78,   0,   0,   0}, { 87,  69,  78,  71,   0,   0},
            { 87,  79,   0,   0,   0,   0}, { 87,  85,   0,   0,   0,   0},
            { 88,  73,   0,   0,   0,   0}, { 88,  73,  65,   0,   0,   0},
            { 88,  73,  65,  78,   0,   0}, { 88,  73,  65,  78,  71,   0},
            { 88,  73,  65,  79,   0,   0}, { 88,  73,  69,   0,   0,   0},
            { 88,  73,  78,   0,   0,   0}, { 88,  73,  78,  71,   0,   0},
            { 88,  73,  79,  78,  71,   0}, { 88,  73,  85,   0,   0,   0},
            { 88,  85,   0,   0,   0,   0}, { 88,  85,  65,  78,   0,   0},
            { 88,  85,  69,   0,   0,   0}, { 88,  85,  78,   0,   0,   0},
            { 89,  65,   0,   0,   0,   0}, { 89,  65,  78,   0,   0,   0},
            { 89,  65,  78,  71,   0,   0}, { 89,  65,  79,   0,   0,   0},
            { 89,  69,   0,   0,   0,   0}, { 89,  73,   0,   0,   0,   0},
            { 89,  73,  78,   0,   0,   0}, { 89,  73,  78,  71,   0,   0},
            { 89,  79,   0,   0,   0,   0}, { 89,  79,  78,  71,   0,   0},
            { 89,  79,  85,   0,   0,   0}, { 89,  85,   0,   0,   0,   0},
            { 89,  85,  65,  78,   0,   0}, { 89,  85,  69,   0,   0,   0},
            { 89,  85,  78,   0,   0,   0}, { 74,  85,  78,   0,   0,   0},
            { 89,  85,  78,   0,   0,   0}, { 90,  65,   0,   0,   0,   0},
            { 90,  65,  73,   0,   0,   0}, { 90,  65,  78,   0,   0,   0},
            { 90,  65,  78,  71,   0,   0}, { 90,  65,  79,   0,   0,   0},
            { 90,  69,   0,   0,   0,   0}, { 90,  69,  73,   0,   0,   0},
            { 90,  69,  78,   0,   0,   0}, { 90,  69,  78,  71,   0,   0},
            { 90,  72,  65,   0,   0,   0}, { 90,  72,  65,  73,   0,   0},
            { 90,  72,  65,  78,   0,   0}, { 90,  72,  65,  78,  71,   0},
            { 67,  72,  65,  78,  71,   0}, { 90,  72,  65,  78,  71,   0},
            { 90,  72,  65,  79,   0,   0}, { 90,  72,  69,   0,   0,   0},
            { 90,  72,  69,  78,   0,   0}, { 90,  72,  69,  78,  71,   0},
            { 90,  72,  73,   0,   0,   0}, { 83,  72,  73,   0,   0,   0},
            { 90,  72,  73,   0,   0,   0}, { 90,  72,  79,  78,  71,   0},
            { 90,  72,  79,  85,   0,   0}, { 90,  72,  85,   0,   0,   0},
            { 90,  72,  85,  65,   0,   0}, { 90,  72,  85,  65,  73,   0},
            { 90,  72,  85,  65,  78,   0}, { 90,  72,  85,  65,  78,  71},
            { 90,  72,  85,  73,   0,   0}, { 90,  72,  85,  78,   0,   0},
            { 90,  72,  85,  79,   0,   0}, { 90,  73,   0,   0,   0,   0},
            { 90,  79,  78,  71,   0,   0}, { 90,  79,  85,   0,   0,   0},
            { 90,  85,   0,   0,   0,   0}, { 90,  85,  65,  78,   0,   0},
            { 90,  85,  73,   0,   0,   0}, { 90,  85,  78,   0,   0,   0},
            { 90,  85,  79,   0,   0,   0}, {  0,   0,   0,   0,   0,   0},
            { 83,  72,  65,  78,   0,   0}, {  0,   0,   0,   0,   0,   0}, };

    /** First and last Chinese character with known Pinyin according to zh collation */
    private static final String FIRST_PINYIN_UNIHAN = "\u963F";
    private static final String LAST_PINYIN_UNIHAN = "\u9FFF";

    private static final Collator COLLATOR = Collator.getInstance(Locale.CHINA);

    private static HanziToPinyin sInstance;
    private final boolean mHasChinaCollator;

    public static class Token {
        /**
         * Separator between target string for each source char
         */
        public static final String SEPARATOR = " ";

        public static final int LATIN = 1;
        public static final int PINYIN = 2;
        public static final int UNKNOWN = 3;

        public Token() {
        }

        public Token(int type, String source, String target) {
            this.type = type;
            this.source = source;
            this.target = target;
        }

        /**
         * Type of this token, ASCII, PINYIN or UNKNOWN.
         */
        public int type;
        /**
         * Original string before translation.
         */
        public String source;
        /**
         * Translated string of source. For Han, target is corresponding Pinyin. Otherwise target is
         * original string in source.
         */
        public String target;
    }

    protected HanziToPinyin(boolean hasChinaCollator) {
        mHasChinaCollator = hasChinaCollator;
    }

    public static HanziToPinyin getInstance() {
        synchronized (HanziToPinyin.class) {
            if (sInstance != null) {
                return sInstance;
            }
            // Check if zh_CN collation data is available
            final Locale locale[] = Collator.getAvailableLocales();
            for (int i = 0; i < locale.length; i++) {
                if (locale[i].equals(Locale.CHINA)) {
                    // Do self validation just once.
                    if (DEBUG) {
                        Log.d(TAG, "Self validation. Result: " + doSelfValidation());
                    }
                    sInstance = new HanziToPinyin(true);
                    return sInstance;
                }
            }
            Log.w(TAG, "There is no Chinese collator, HanziToPinyin is disabled");
            sInstance = new HanziToPinyin(false);
            return sInstance;
        }
    }

    /**
     * Validate if our internal table has some wrong value.
     *
     * @return true when the table looks correct.
     */
    private static boolean doSelfValidation() {
        char lastChar = UNIHANS[0];
        String lastString = Character.toString(lastChar);
        for (char c : UNIHANS) {
            if (lastChar == c) {
                continue;
            }
            final String curString = Character.toString(c);
            int cmp = COLLATOR.compare(lastString, curString);
            if (cmp >= 0) {
                Log.e(TAG, "Internal error in Unihan table. " + "The last string \"" + lastString
                        + "\" is greater than current string \"" + curString + "\".");
                return false;
            }
            lastString = curString;
        }
        return true;
    }

    private Token getToken(char character) {
        Token token = new Token();
        final String letter = Character.toString(character);
        token.source = letter;
        int offset = -1;
        int cmp;
        if (character < 256) {
            token.type = Token.LATIN;
            token.target = letter;
            return token;
        } else {
            cmp = COLLATOR.compare(letter, FIRST_PINYIN_UNIHAN);
            if (cmp < 0) {
                token.type = Token.UNKNOWN;
                token.target = letter;
                return token;
            } else if (cmp == 0) {
                token.type = Token.PINYIN;
                offset = 0;
            } else {
                cmp = COLLATOR.compare(letter, LAST_PINYIN_UNIHAN);
                if (cmp > 0) {
                    token.type = Token.UNKNOWN;
                    token.target = letter;
                    return token;
                } else if (cmp == 0) {
                    token.type = Token.PINYIN;
                    offset = UNIHANS.length - 1;
                }
            }
        }

        token.type = Token.PINYIN;
        if (offset < 0) {
            int begin = 0;
            int end = UNIHANS.length - 1;
            while (begin <= end) {
                offset = (begin + end) / 2;
                final String unihan = Character.toString(UNIHANS[offset]);
                cmp = COLLATOR.compare(letter, unihan);
                if (cmp == 0) {
                    break;
                } else if (cmp > 0) {
                    begin = offset + 1;
                } else {
                    end = offset - 1;
                }
            }
        }
        if (cmp < 0) {
            offset--;
        }
        StringBuilder pinyin = new StringBuilder();
        for (int j = 0; j < PINYINS[offset].length && PINYINS[offset][j] != 0; j++) {
            pinyin.append((char) PINYINS[offset][j]);
        }
        token.target = pinyin.toString();
        if (TextUtils.isEmpty(token.target)) {
            token.type = Token.UNKNOWN;
            token.target = token.source;
        }
        return token;
    }

    /**
     * Convert the input to a array of tokens. The sequence of ASCII or Unknown characters without
     * space will be put into a Token, One Hanzi character which has pinyin will be treated as a
     * Token. If these is no China collator, the empty token array is returned.
     */
    public ArrayList<Token> get(final String input) {
        ArrayList<Token> tokens = new ArrayList<Token>();
        if (!mHasChinaCollator || TextUtils.isEmpty(input)) {
            // return empty tokens.
            return tokens;
        }
        final int inputLength = input.length();
        final StringBuilder sb = new StringBuilder();
        int tokenType = Token.LATIN;
        // Go through the input, create a new token when
        // a. Token type changed
        // b. Get the Pinyin of current charater.
        // c. current character is space.
        for (int i = 0; i < inputLength; i++) {
            final char character = input.charAt(i);
            if (character == ' ') {
                if (sb.length() > 0) {
                    addToken(sb, tokens, tokenType);
                }
            } else if (character < 256) {
                if (tokenType != Token.LATIN && sb.length() > 0) {
                    addToken(sb, tokens, tokenType);
                }
                tokenType = Token.LATIN;
                sb.append(character);
            } else {
                Token t = getToken(character);
                if (t.type == Token.PINYIN) {
                    if (sb.length() > 0) {
                        addToken(sb, tokens, tokenType);
                    }
                    tokens.add(t);
                    tokenType = Token.PINYIN;
                } else {
                    if (tokenType != t.type && sb.length() > 0) {
                        addToken(sb, tokens, tokenType);
                    }
                    tokenType = t.type;
                    sb.append(character);
                }
            }
        }
        if (sb.length() > 0) {
            addToken(sb, tokens, tokenType);
        }
        return tokens;
    }

    private void addToken(
            final StringBuilder sb, final ArrayList<Token> tokens, final int tokenType) {
        String str = sb.toString();
        tokens.add(new Token(tokenType, str, str));
        sb.setLength(0);
    }
}

这个工具类用于将汉字转换为拼音,通过一个Token对象来存储转换过后的拼音和转换之前的字符串。
下面定义一个方法获取输入字符串获取全拼
  1. package com.suntek.mobilemeeting.utils;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import com.suntek.mobilemeeting.utils.HanziToPinyin.Token;  
  6.   
  7. /** 
  8.  * 获取汉字拼音 
  9.  *  
  10.  * @author 佚名 
  11.  *  
  12.  */  
  13. public class PinYin {  
  14.     public static String getPinYin(String input) {  
  15.         ArrayList<Token> tokens = HanziToPinyin.getInstance().get(input);  
  16.         StringBuilder sb = new StringBuilder();  
  17.         if (tokens != null && tokens.size() > 0) {  
  18.             for (Token token : tokens) {  
  19.                 if (Token.PINYIN == token.type) {  
  20.                     sb.append(token.target);  
  21.                 } else {  
  22.                     sb.append(token.source);  
  23.                 }  
  24.             }  
  25.         }  
  26.         return sb.toString().toLowerCase();  
  27.     }  
  28. }  
package com.suntek.mobilemeeting.utils;

import java.util.ArrayList;

import com.suntek.mobilemeeting.utils.HanziToPinyin.Token;

/**
 * 获取汉字拼音
 * 
 * @author 佚名
 * 
 */
public class PinYin {
	public static String getPinYin(String input) {
		ArrayList<Token> tokens = HanziToPinyin.getInstance().get(input);
		StringBuilder sb = new StringBuilder();
		if (tokens != null && tokens.size() > 0) {
			for (Token token : tokens) {
				if (Token.PINYIN == token.type) {
					sb.append(token.target);
				} else {
					sb.append(token.source);
				}
			}
		}
		return sb.toString().toLowerCase();
	}
}

上面是实现获取全拼的实现,下面是获取中文简拼的实现
  1. package com.suntek.mobilemeeting.utils;  
  2.   
  3. /** 
  4.  * 根据 GBK 汉字的 UNICODE 编码取得汉字的首字母 
  5.  *  
  6.  * @author zrq 
  7.  *  
  8.  */  
  9.   
  10. public class UnicodeGBK2Alpha {  
  11.     private final static String GBK2UNICODE = "YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJGYZZJJFKCCLZDHWDWZJLJPFYYNWJJTMYHZWZHFLZPPQHGSCYYYNJQYXXGJ"  
  12.             + "HHSDSJNKKTMOMLCRXYPSNQSECCQZGGLLYJLMYZZSECYKYYHQWJSSGGYXYZYJWWKDJHYCHMYXJTLXJYQBYXZLDWRDJRWYSRLDZJPC"  
  13.             + "BZJJBRCFTLECZSTZFXXZHTRQHYBDLYCZSSYMMRFMYQZPWWJJYFCRWFDFZQPYDDWYXKYJAWJFFXYPSFTZYHHYZYSWCJYXSCLCXXWZ"  
  14.             + "ZXNBGNNXBXLZSZSBSGPYSYZDHMDZBQBZCWDZZYYTZHBTSYYBZGNTNXQYWQSKBPHHLXGYBFMJEBJHHGQTJCYSXSTKZHLYCKGLYSMZ"  
  15.             + "XYALMELDCCXGZYRJXSDLTYZCQKCNNJWHJTZZCQLJSTSTBNXBTYXCEQXGKWJYFLZQLYHYXSPSFXLMPBYSXXXYDJCZYLLLSJXFHJXP"  
  16.             + "JBTFFYABYXBHZZBJYZLWLCZGGBTSSMDTJZXPTHYQTGLJSCQFZKJZJQNLZWLSLHDZBWJNCJZYZSQQYCQYRZCJJWYBRTWPYFTWEXCS"  
  17.             + "KDZCTBZHYZZYYJXZCFFZZMJYXXSDZZOTTBZLQWFCKSZSXFYRLNYJMBDTHJXSQQCCSBXYYTSYFBXDZTGBCNSLCYZZPSAZYZZSCJCS"  
  18.             + "HZQYDXLBPJLLMQXTYDZXSQJTZPXLCGLQTZWJBHCTSYJSFXYEJJTLBGXSXJMYJQQPFZASYJNTYDJXKJCDJSZCBARTDCLYJQMWNQNC"  
  19.             + "LLLKBYBZZSYHQQLTWLCCXTXLLZNTYLNEWYZYXCZXXGRKRMTCNDNJTSYYSSDQDGHSDBJGHRWRQLYBGLXHLGTGXBQJDZPYJSJYJCTM"  
  20.             + "RNYMGRZJCZGJMZMGXMPRYXKJNYMSGMZJYMKMFXMLDTGFBHCJHKYLPFMDXLQJJSMTQGZSJLQDLDGJYCALCMZCSDJLLNXDJFFFFJCZ"  
  21.             + "FMZFFPFKHKGDPSXKTACJDHHZDDCRRCFQYJKQCCWJDXHWJLYLLZGCFCQDSMLZPBJJPLSBCJGGDCKKDEZSQCCKJGCGKDJTJDLZYCXK"  
  22.             + "LQSCGJCLTFPCQCZGWPJDQYZJJBYJHSJDZWGFSJGZKQCCZLLPSPKJGQJHZZLJPLGJGJJTHJJYJZCZMLZLYQBGJWMLJKXZDZNJQSYZ"  
  23.             + "MLJLLJKYWXMKJLHSKJGBMCLYYMKXJQLBMLLKMDXXKWYXYSLMLPSJQQJQXYXFJTJDXMXXLLCXQBSYJBGWYMBGGBCYXPJYGPEPFGDJ"  
  24.             + "GBHBNSQJYZJKJKHXQFGQZKFHYGKHDKLLSDJQXPQYKYBNQSXQNSZSWHBSXWHXWBZZXDMNSJBSBKBBZKLYLXGWXDRWYQZMYWSJQLCJ"  
  25.             + "XXJXKJEQXSCYETLZHLYYYSDZPAQYZCMTLSHTZCFYZYXYLJSDCJQAGYSLCQLYYYSHMRQQKLDXZSCSSSYDYCJYSFSJBFRSSZQSBXXP"  
  26.             + "XJYSDRCKGJLGDKZJZBDKTCSYQPYHSTCLDJDHMXMCGXYZHJDDTMHLTXZXYLYMOHYJCLTYFBQQXPFBDFHHTKSQHZYYWCNXXCRWHOWG"  
  27.             + "YJLEGWDQCWGFJYCSNTMYTOLBYGWQWESJPWNMLRYDZSZTXYQPZGCWXHNGPYXSHMYQJXZTDPPBFYHZHTJYFDZWKGKZBLDNTSXHQEEG"  
  28.             + "ZZYLZMMZYJZGXZXKHKSTXNXXWYLYAPSTHXDWHZYMPXAGKYDXBHNHXKDPJNMYHYLPMGOCSLNZHKXXLPZZLBMLSFBHHGYGYYGGBHSC"  
  29.             + "YAQTYWLXTZQCEZYDQDQMMHTKLLSZHLSJZWFYHQSWSCWLQAZYNYTLSXTHAZNKZZSZZLAXXZWWCTGQQTDDYZTCCHYQZFLXPSLZYGPZ"  
  30.             + "SZNGLNDQTBDLXGTCTAJDKYWNSYZLJHHZZCWNYYZYWMHYCHHYXHJKZWSXHZYXLYSKQYSPSLYZWMYPPKBYGLKZHTYXAXQSYSHXASMC"  
  31.             + "HKDSCRSWJPWXSGZJLWWSCHSJHSQNHCSEGNDAQTBAALZZMSSTDQJCJKTSCJAXPLGGXHHGXXZCXPDMMHLDGTYBYSJMXHMRCPXXJZCK"  
  32.             + "ZXSHMLQXXTTHXWZFKHCCZDYTCJYXQHLXDHYPJQXYLSYYDZOZJNYXQEZYSQYAYXWYPDGXDDXSPPYZNDLTWRHXYDXZZJHTCXMCZLHP"  
  33.             + "YYYYMHZLLHNXMYLLLMDCPPXHMXDKYCYRDLTXJCHHZZXZLCCLYLNZSHZJZZLNNRLWHYQSNJHXYNTTTKYJPYCHHYEGKCTTWLGQRLGG"  
  34.             + "TGTYGYHPYHYLQYQGCWYQKPYYYTTTTLHYHLLTYTTSPLKYZXGZWGPYDSSZZDQXSKCQNMJJZZBXYQMJRTFFBTKHZKBXLJJKDXJTLBWF"  
  35.             + "ZPPTKQTZTGPDGNTPJYFALQMKGXBDCLZFHZCLLLLADPMXDJHLCCLGYHDZFGYDDGCYYFGYDXKSSEBDHYKDKDKHNAXXYBPBYYHXZQGA"  
  36.             + "FFQYJXDMLJCSQZLLPCHBSXGJYNDYBYQSPZWJLZKSDDTACTBXZDYZYPJZQSJNKKTKNJDJGYYPGTLFYQKASDNTCYHBLWDZHBBYDWJR"  
  37.             + "YGKZYHEYYFJMSDTYFZJJHGCXPLXHLDWXXJKYTCYKSSSMTWCTTQZLPBSZDZWZXGZAGYKTYWXLHLSPBCLLOQMMZSSLCMBJCSZZKYDC"  
  38.             + "ZJGQQDSMCYTZQQLWZQZXSSFPTTFQMDDZDSHDTDWFHTDYZJYQJQKYPBDJYYXTLJHDRQXXXHAYDHRJLKLYTWHLLRLLRCXYLBWSRSZZ"  
  39.             + "SYMKZZHHKYHXKSMDSYDYCJPBZBSQLFCXXXNXKXWYWSDZYQOGGQMMYHCDZTTFJYYBGSTTTYBYKJDHKYXBELHTYPJQNFXFDYKZHQKZ"  
  40.             + "BYJTZBXHFDXKDASWTAWAJLDYJSFHBLDNNTNQJTJNCHXFJSRFWHZFMDRYJYJWZPDJKZYJYMPCYZNYNXFBYTFYFWYGDBNZZZDNYTXZ"  
  41.             + "EMMQBSQEHXFZMBMFLZZSRXYMJGSXWZJSPRYDJSJGXHJJGLJJYNZZJXHGXKYMLPYYYCXYTWQZSWHWLYRJLPXSLSXMFSWWKLCTNXNY"  
  42.             + "NPSJSZHDZEPTXMYYWXYYSYWLXJQZQXZDCLEEELMCPJPCLWBXSQHFWWTFFJTNQJHJQDXHWLBYZNFJLALKYYJLDXHHYCSTYYWNRJYX"  
  43.             + "YWTRMDRQHWQCMFJDYZMHMYYXJWMYZQZXTLMRSPWWCHAQBXYGZYPXYYRRCLMPYMGKSJSZYSRMYJSNXTPLNBAPPYPYLXYYZKYNLDZY"  
  44.             + "JZCZNNLMZHHARQMPGWQTZMXXMLLHGDZXYHXKYXYCJMFFYYHJFSBSSQLXXNDYCANNMTCJCYPRRNYTYQNYYMBMSXNDLYLYSLJRLXYS"  
  45.             + "XQMLLYZLZJJJKYZZCSFBZXXMSTBJGNXYZHLXNMCWSCYZYFZLXBRNNNYLBNRTGZQYSATSWRYHYJZMZDHZGZDWYBSSCSKXSYHYTXXG"  
  46.             + "CQGXZZSHYXJSCRHMKKBXCZJYJYMKQHZJFNBHMQHYSNJNZYBKNQMCLGQHWLZNZSWXKHLJHYYBQLBFCDSXDLDSPFZPSKJYZWZXZDDX"  
  47.             + "JSMMEGJSCSSMGCLXXKYYYLNYPWWWGYDKZJGGGZGGSYCKNJWNJPCXBJJTQTJWDSSPJXZXNZXUMELPXFSXTLLXCLJXJJLJZXCTPSWX"  
  48.             + "LYDHLYQRWHSYCSQYYBYAYWJJJQFWQCQQCJQGXALDBZZYJGKGXPLTZYFXJLTPADKYQHPMATLCPDCKBMTXYBHKLENXDLEEGQDYMSAW"  
  49.             + "HZMLJTWYGXLYQZLJEEYYBQQFFNLYXRDSCTGJGXYYNKLLYQKCCTLHJLQMKKZGCYYGLLLJDZGYDHZWXPYSJBZKDZGYZZHYWYFQYTYZ"  
  50.             + "SZYEZZLYMHJJHTSMQWYZLKYYWZCSRKQYTLTDXWCTYJKLWSQZWBDCQYNCJSRSZJLKCDCDTLZZZACQQZZDDXYPLXZBQJYLZLLLQDDZ"  
  51.             + "QJYJYJZYXNYYYNYJXKXDAZWYRDLJYYYRJLXLLDYXJCYWYWNQCCLDDNYYYNYCKCZHXXCCLGZQJGKWPPCQQJYSBZZXYJSQPXJPZBSB"  
  52.             + "DSFNSFPZXHDWZTDWPPTFLZZBZDMYYPQJRSDZSQZSQXBDGCPZSWDWCSQZGMDHZXMWWFYBPDGPHTMJTHZSMMBGZMBZJCFZWFZBBZMQ"  
  53.             + "CFMBDMCJXLGPNJBBXGYHYYJGPTZGZMQBQTCGYXJXLWZKYDPDYMGCFTPFXYZTZXDZXTGKMTYBBCLBJASKYTSSQYYMSZXFJEWLXLLS"  
  54.             + "ZBQJJJAKLYLXLYCCTSXMCWFKKKBSXLLLLJYXTYLTJYYTDPJHNHNNKBYQNFQYYZBYYESSESSGDYHFHWTCJBSDZZTFDMXHCNJZYMQW"  
  55.             + "SRYJDZJQPDQBBSTJGGFBKJBXTGQHNGWJXJGDLLTHZHHYYYYYYSXWTYYYCCBDBPYPZYCCZYJPZYWCBDLFWZCWJDXXHYHLHWZZXJTC"  
  56.             + "ZLCDPXUJCZZZLYXJJTXPHFXWPYWXZPTDZZBDZCYHJHMLXBQXSBYLRDTGJRRCTTTHYTCZWMXFYTWWZCWJWXJYWCSKYBZSCCTZQNHX"  
  57.             + "NWXXKHKFHTSWOCCJYBCMPZZYKBNNZPBZHHZDLSYDDYTYFJPXYNGFXBYQXCBHXCPSXTYZDMKYSNXSXLHKMZXLYHDHKWHXXSSKQYHH"  
  58.             + "CJYXGLHZXCSNHEKDTGZXQYPKDHEXTYKCNYMYYYPKQYYYKXZLTHJQTBYQHXBMYHSQCKWWYLLHCYYLNNEQXQWMCFBDCCMLJGGXDQKT"  
  59.             + "LXKGNQCDGZJWYJJLYHHQTTTNWCHMXCXWHWSZJYDJCCDBQCDGDNYXZTHCQRXCBHZTQCBXWGQWYYBXHMBYMYQTYEXMQKYAQYRGYZSL"  
  60.             + "FYKKQHYSSQYSHJGJCNXKZYCXSBXYXHYYLSTYCXQTHYSMGSCPMMGCCCCCMTZTASMGQZJHKLOSQYLSWTMXSYQKDZLJQQYPLSYCZTCQ"  
  61.             + "QPBBQJZCLPKHQZYYXXDTDDTSJCXFFLLCHQXMJLWCJCXTSPYCXNDTJSHJWXDQQJSKXYAMYLSJHMLALYKXCYYDMNMDQMXMCZNNCYBZ"  
  62.             + "KKYFLMCHCMLHXRCJJHSYLNMTJZGZGYWJXSRXCWJGJQHQZDQJDCJJZKJKGDZQGJJYJYLXZXXCDQHHHEYTMHLFSBDJSYYSHFYSTCZQ"  
  63.             + "LPBDRFRZTZYKYWHSZYQKWDQZRKMSYNBCRXQBJYFAZPZZEDZCJYWBCJWHYJBQSZYWRYSZPTDKZPFPBNZTKLQYHBBZPNPPTYZZYBQN"  
  64.             + "YDCPJMMCYCQMCYFZZDCMNLFPBPLNGQJTBTTNJZPZBBZNJKLJQYLNBZQHKSJZNGGQSZZKYXSHPZSNBCGZKDDZQANZHJKDRTLZLSWJ"  
  65.             + "LJZLYWTJNDJZJHXYAYNCBGTZCSSQMNJPJYTYSWXZFKWJQTKHTZPLBHSNJZSYZBWZZZZLSYLSBJHDWWQPSLMMFBJDWAQYZTCJTBNN"  
  66.             + "WZXQXCDSLQGDSDPDZHJTQQPSWLYYJZLGYXYZLCTCBJTKTYCZJTQKBSJLGMGZDMCSGPYNJZYQYYKNXRPWSZXMTNCSZZYXYBYHYZAX"  
  67.             + "YWQCJTLLCKJJTJHGDXDXYQYZZBYWDLWQCGLZGJGQRQZCZSSBCRPCSKYDZNXJSQGXSSJMYDNSTZTPBDLTKZWXQWQTZEXNQCZGWEZK"  
  68.             + "SSBYBRTSSSLCCGBPSZQSZLCCGLLLZXHZQTHCZMQGYZQZNMCOCSZJMMZSQPJYGQLJYJPPLDXRGZYXCCSXHSHGTZNLZWZKJCXTCFCJ"  
  69.             + "XLBMQBCZZWPQDNHXLJCTHYZLGYLNLSZZPCXDSCQQHJQKSXZPBAJYEMSMJTZDXLCJYRYYNWJBNGZZTMJXLTBSLYRZPYLSSCNXPHLL"  
  70.             + "HYLLQQZQLXYMRSYCXZLMMCZLTZSDWTJJLLNZGGQXPFSKYGYGHBFZPDKMWGHCXMSGDXJMCJZDYCABXJDLNBCDQYGSKYDQTXDJJYXM"  
  71.             + "SZQAZDZFSLQXYJSJZYLBTXXWXQQZBJZUFBBLYLWDSLJHXJYZJWTDJCZFQZQZZDZSXZZQLZCDZFJHYSPYMPQZMLPPLFFXJJNZZYLS"  
  72.             + "JEYQZFPFZKSYWJJJHRDJZZXTXXGLGHYDXCSKYSWMMZCWYBAZBJKSHFHJCXMHFQHYXXYZFTSJYZFXYXPZLCHMZMBXHZZSXYFYMNCW"  
  73.             + "DABAZLXKTCSHHXKXJJZJSTHYGXSXYYHHHJWXKZXSSBZZWHHHCWTZZZPJXSNXQQJGZYZYWLLCWXZFXXYXYHXMKYYSWSQMNLNAYCYS"  
  74.             + "PMJKHWCQHYLAJJMZXHMMCNZHBHXCLXTJPLTXYJHDYYLTTXFSZHYXXSJBJYAYRSMXYPLCKDUYHLXRLNLLSTYZYYQYGYHHSCCSMZCT"  
  75.             + "ZQXKYQFPYYRPFFLKQUNTSZLLZMWWTCQQYZWTLLMLMPWMBZSSTZRBPDDTLQJJBXZCSRZQQYGWCSXFWZLXCCRSZDZMCYGGDZQSGTJS"  
  76.             + "WLJMYMMZYHFBJDGYXCCPSHXNZCSBSJYJGJMPPWAFFYFNXHYZXZYLREMZGZCYZSSZDLLJCSQFNXZKPTXZGXJJGFMYYYSNBTYLBNLH"  
  77.             + "PFZDCYFBMGQRRSSSZXYSGTZRNYDZZCDGPJAFJFZKNZBLCZSZPSGCYCJSZLMLRSZBZZLDLSLLYSXSQZQLYXZLSKKBRXBRBZCYCXZZ"  
  78.             + "ZEEYFGKLZLYYHGZSGZLFJHGTGWKRAAJYZKZQTSSHJJXDCYZUYJLZYRZDQQHGJZXSSZBYKJPBFRTJXLLFQWJHYLQTYMBLPZDXTZYG"  
  79.             + "BDHZZRBGXHWNJTJXLKSCFSMWLSDQYSJTXKZSCFWJLBXFTZLLJZLLQBLSQMQQCGCZFPBPHZCZJLPYYGGDTGWDCFCZQYYYQYSSCLXZ"  
  80.             + "SKLZZZGFFCQNWGLHQYZJJCZLQZZYJPJZZBPDCCMHJGXDQDGDLZQMFGPSYTSDYFWWDJZJYSXYYCZCYHZWPBYKXRYLYBHKJKSFXTZJ"  
  81.             + "MMCKHLLTNYYMSYXYZPYJQYCSYCWMTJJKQYRHLLQXPSGTLYYCLJSCPXJYZFNMLRGJJTYZBXYZMSJYJHHFZQMSYXRSZCWTLRTQZSST"  
  82.             + "KXGQKGSPTGCZNJSJCQCXHMXGGZTQYDJKZDLBZSXJLHYQGGGTHQSZPYHJHHGYYGKGGCWJZZYLCZLXQSFTGZSLLLMLJSKCTBLLZZSZ"  
  83.             + "MMNYTPZSXQHJCJYQXYZXZQZCPSHKZZYSXCDFGMWQRLLQXRFZTLYSTCTMJCXJJXHJNXTNRZTZFQYHQGLLGCXSZSJDJLJCYDSJTLNY"  
  84.             + "XHSZXCGJZYQPYLFHDJSBPCCZHJJJQZJQDYBSSLLCMYTTMQTBHJQNNYGKYRQYQMZGCJKPDCGMYZHQLLSLLCLMHOLZGDYYFZSLJCQZ"  
  85.             + "LYLZQJESHNYLLJXGJXLYSYYYXNBZLJSSZCQQCJYLLZLTJYLLZLLBNYLGQCHXYYXOXCXQKYJXXXYKLXSXXYQXCYKQXQCSGYXXYQXY"  
  86.             + "GYTQOHXHXPYXXXULCYEYCHZZCBWQBBWJQZSCSZSSLZYLKDESJZWMYMCYTSDSXXSCJPQQSQYLYYZYCMDJDZYWCBTJSYDJKCYDDJLB"  
  87.             + "DJJSODZYSYXQQYXDHHGQQYQHDYXWGMMMAJDYBBBPPBCMUUPLJZSMTXERXJMHQNUTPJDCBSSMSSSTKJTSSMMTRCPLZSZMLQDSDMJM"  
  88.             + "QPNQDXCFYNBFSDQXYXHYAYKQYDDLQYYYSSZBYDSLNTFQTZQPZMCHDHCZCWFDXTMYQSPHQYYXSRGJCWTJTZZQMGWJJTJHTQJBBHWZ"  
  89.             + "PXXHYQFXXQYWYYHYSCDYDHHQMNMTMWCPBSZPPZZGLMZFOLLCFWHMMSJZTTDHZZYFFYTZZGZYSKYJXQYJZQBHMBZZLYGHGFMSHPZF"  
  90.             + "ZSNCLPBQSNJXZSLXXFPMTYJYGBXLLDLXPZJYZJYHHZCYWHJYLSJEXFSZZYWXKZJLUYDTMLYMQJPWXYHXSKTQJEZRPXXZHHMHWQPW"  
  91.             + "QLYJJQJJZSZCPHJLCHHNXJLQWZJHBMZYXBDHHYPZLHLHLGFWLCHYYTLHJXCJMSCPXSTKPNHQXSRTYXXTESYJCTLSSLSTDLLLWWYH"  
  92.             + "DHRJZSFGXTSYCZYNYHTDHWJSLHTZDQDJZXXQHGYLTZPHCSQFCLNJTCLZPFSTPDYNYLGMJLLYCQHYSSHCHYLHQYQTMZYPBYWRFQYK"  
  93.             + "QSYSLZDQJMPXYYSSRHZJNYWTQDFZBWWTWWRXCWHGYHXMKMYYYQMSMZHNGCEPMLQQMTCWCTMMPXJPJJHFXYYZSXZHTYBMSTSYJTTQ"  
  94.             + "QQYYLHYNPYQZLCYZHZWSMYLKFJXLWGXYPJYTYSYXYMZCKTTWLKSMZSYLMPWLZWXWQZSSAQSYXYRHSSNTSRAPXCPWCMGDXHXZDZYF"  
  95.             + "JHGZTTSBJHGYZSZYSMYCLLLXBTYXHBBZJKSSDMALXHYCFYGMQYPJYCQXJLLLJGSLZGQLYCJCCZOTYXMTMTTLLWTGPXYMZMKLPSZZ"  
  96.             + "ZXHKQYSXCTYJZYHXSHYXZKXLZWPSQPYHJWPJPWXQQYLXSDHMRSLZZYZWTTCYXYSZZSHBSCCSTPLWSSCJCHNLCGCHSSPHYLHFHHXJ"  
  97.             + "SXYLLNYLSZDHZXYLSXLWZYKCLDYAXZCMDDYSPJTQJZLNWQPSSSWCTSTSZLBLNXSMNYYMJQBQHRZWTYYDCHQLXKPZWBGQYBKFCMZW"  
  98.             + "PZLLYYLSZYDWHXPSBCMLJBSCGBHXLQHYRLJXYSWXWXZSLDFHLSLYNJLZYFLYJYCDRJLFSYZFSLLCQYQFGJYHYXZLYLMSTDJCYHBZ"  
  99.             + "LLNWLXXYGYYHSMGDHXXHHLZZJZXCZZZCYQZFNGWPYLCPKPYYPMCLQKDGXZGGWQBDXZZKZFBXXLZXJTPJPTTBYTSZZDWSLCHZHSLT"  
  100.             + "YXHQLHYXXXYYZYSWTXZKHLXZXZPYHGCHKCFSYHUTJRLXFJXPTZTWHPLYXFCRHXSHXKYXXYHZQDXQWULHYHMJTBFLKHTXCWHJFWJC"  
  101.             + "FPQRYQXCYYYQYGRPYWSGSUNGWCHKZDXYFLXXHJJBYZWTSXXNCYJJYMSWZJQRMHXZWFQSYLZJZGBHYNSLBGTTCSYBYXXWXYHXYYXN"  
  102.             + "SQYXMQYWRGYQLXBBZLJSYLPSYTJZYHYZAWLRORJMKSCZJXXXYXCHDYXRYXXJDTSQFXLYLTSFFYXLMTYJMJUYYYXLTZCSXQZQHZXL"  
  103.             + "YYXZHDNBRXXXJCTYHLBRLMBRLLAXKYLLLJLYXXLYCRYLCJTGJCMTLZLLCYZZPZPCYAWHJJFYBDYYZSMPCKZDQYQPBPCJPDCYZMDP"  
  104.             + "BCYYDYCNNPLMTMLRMFMMGWYZBSJGYGSMZQQQZTXMKQWGXLLPJGZBQCDJJJFPKJKCXBLJMSWMDTQJXLDLPPBXCWRCQFBFQJCZAHZG"  
  105.             + "MYKPHYYHZYKNDKZMBPJYXPXYHLFPNYYGXJDBKXNXHJMZJXSTRSTLDXSKZYSYBZXJLXYSLBZYSLHXJPFXPQNBYLLJQKYGZMCYZZYM"  
  106.             + "CCSLCLHZFWFWYXZMWSXTYNXJHPYYMCYSPMHYSMYDYSHQYZCHMJJMZCAAGCFJBBHPLYZYLXXSDJGXDHKXXTXXNBHRMLYJSLTXMRHN"  
  107.             + "LXQJXYZLLYSWQGDLBJHDCGJYQYCMHWFMJYBMBYJYJWYMDPWHXQLDYGPDFXXBCGJSPCKRSSYZJMSLBZZJFLJJJLGXZGYXYXLSZQYX"  
  108.             + "BEXYXHGCXBPLDYHWETTWWCJMBTXCHXYQXLLXFLYXLLJLSSFWDPZSMYJCLMWYTCZPCHQEKCQBWLCQYDPLQPPQZQFJQDJHYMMCXTXD"  
  109.             + "RMJWRHXCJZYLQXDYYNHYYHRSLSRSYWWZJYMTLTLLGTQCJZYABTCKZCJYCCQLJZQXALMZYHYWLWDXZXQDLLQSHGPJFJLJHJABCQZD"  
  110.             + "JGTKHSSTCYJLPSWZLXZXRWGLDLZRLZXTGSLLLLZLYXXWGDZYGBDPHZPBRLWSXQBPFDWOFMWHLYPCBJCCLDMBZPBZZLCYQXLDOMZB"  
  111.             + "LZWPDWYYGDSTTHCSQSCCRSSSYSLFYBFNTYJSZDFNDPDHDZZMBBLSLCMYFFGTJJQWFTMTPJWFNLBZCMMJTGBDZLQLPYFHYYMJYLSD"  
  112.             + "CHDZJWJCCTLJCLDTLJJCPDDSQDSSZYBNDBJLGGJZXSXNLYCYBJXQYCBYLZCFZPPGKCXZDZFZTJJFJSJXZBNZYJQTTYJYHTYCZHYM"  
  113.             + "DJXTTMPXSPLZCDWSLSHXYPZGTFMLCJTYCBPMGDKWYCYZCDSZZYHFLYCTYGWHKJYYLSJCXGYWJCBLLCSNDDBTZBSCLYZCZZSSQDLL"  
  114.             + "MQYYHFSLQLLXFTYHABXGWNYWYYPLLSDLDLLBJCYXJZMLHLJDXYYQYTDLLLBUGBFDFBBQJZZMDPJHGCLGMJJPGAEHHBWCQXAXHHHZ"  
  115.             + "CHXYPHJAXHLPHJPGPZJQCQZGJJZZUZDMQYYBZZPHYHYBWHAZYJHYKFGDPFQSDLZMLJXKXGALXZDAGLMDGXMWZQYXXDXXPFDMMSSY"  
  116.             + "MPFMDMMKXKSYZYSHDZKXSYSMMZZZMSYDNZZCZXFPLSTMZDNMXCKJMZTYYMZMZZMSXHHDCZJEMXXKLJSTLWLSQLYJZLLZJSSDPPMH"  
  117.             + "NLZJCZYHMXXHGZCJMDHXTKGRMXFWMCGMWKDTKSXQMMMFZZYDKMSCLCMPCGMHSPXQPZDSSLCXKYXTWLWJYAHZJGZQMCSNXYYMMPML"  
  118.             + "KJXMHLMLQMXCTKZMJQYSZJSYSZHSYJZJCDAJZYBSDQJZGWZQQXFKDMSDJLFWEHKZQKJPEYPZYSZCDWYJFFMZZYLTTDZZEFMZLBNP"  
  119.             + "PLPLPEPSZALLTYLKCKQZKGENQLWAGYXYDPXLHSXQQWQCQXQCLHYXXMLYCCWLYMQYSKGCHLCJNSZKPYZKCQZQLJPDMDZHLASXLBYD"  
  120.             + "WQLWDNBQCRYDDZTJYBKBWSZDXDTNPJDTCTQDFXQQMGNXECLTTBKPWSLCTYQLPWYZZKLPYGZCQQPLLKCCYLPQMZCZQCLJSLQZDJXL"  
  121.             + "DDHPZQDLJJXZQDXYZQKZLJCYQDYJPPYPQYKJYRMPCBYMCXKLLZLLFQPYLLLMBSGLCYSSLRSYSQTMXYXZQZFDZUYSYZTFFMZZSMZQ"  
  122.             + "HZSSCCMLYXWTPZGXZJGZGSJSGKDDHTQGGZLLBJDZLCBCHYXYZHZFYWXYZYMSDBZZYJGTSMTFXQYXQSTDGSLNXDLRYZZLRYYLXQHT"  
  123.             + "XSRTZNGZXBNQQZFMYKMZJBZYMKBPNLYZPBLMCNQYZZZSJZHJCTZKHYZZJRDYZHNPXGLFZTLKGJTCTSSYLLGZRZBBQZZKLPKLCZYS"  
  124.             + "SUYXBJFPNJZZXCDWXZYJXZZDJJKGGRSRJKMSMZJLSJYWQSKYHQJSXPJZZZLSNSHRNYPZTWCHKLPSRZLZXYJQXQKYSJYCZTLQZYBB"  
  125.             + "YBWZPQDWWYZCYTJCJXCKCWDKKZXSGKDZXWWYYJQYYTCYTDLLXWKCZKKLCCLZCQQDZLQLCSFQCHQHSFSMQZZLNBJJZBSJHTSZDYSJ"  
  126.             + "QJPDLZCDCWJKJZZLPYCGMZWDJJBSJQZSYZYHHXJPBJYDSSXDZNCGLQMBTSFSBPDZDLZNFGFJGFSMPXJQLMBLGQCYYXBQKDJJQYRF"  
  127.             + "KZTJDHCZKLBSDZCFJTPLLJGXHYXZCSSZZXSTJYGKGCKGYOQXJPLZPBPGTGYJZGHZQZZLBJLSQFZGKQQJZGYCZBZQTLDXRJXBSXXP"  
  128.             + "ZXHYZYCLWDXJJHXMFDZPFZHQHQMQGKSLYHTYCGFRZGNQXCLPDLBZCSCZQLLJBLHBZCYPZZPPDYMZZSGYHCKCPZJGSLJLNSCDSLDL"  
  129.             + "XBMSTLDDFJMKDJDHZLZXLSZQPQPGJLLYBDSZGQLBZLSLKYYHZTTNTJYQTZZPSZQZTLLJTYYLLQLLQYZQLBDZLSLYYZYMDFSZSNHL"  
  130.             + "XZNCZQZPBWSKRFBSYZMTHBLGJPMCZZLSTLXSHTCSYZLZBLFEQHLXFLCJLYLJQCBZLZJHHSSTBRMHXZHJZCLXFNBGXGTQJCZTMSFZ"  
  131.             + "KJMSSNXLJKBHSJXNTNLZDNTLMSJXGZJYJCZXYJYJWRWWQNZTNFJSZPZSHZJFYRDJSFSZJZBJFZQZZHZLXFYSBZQLZSGYFTZDCSZX"  
  132.             + "ZJBQMSZKJRHYJZCKMJKHCHGTXKXQGLXPXFXTRTYLXJXHDTSJXHJZJXZWZLCQSBTXWXGXTXXHXFTSDKFJHZYJFJXRZSDLLLTQSQQZ"  
  133.             + "QWZXSYQTWGWBZCGZLLYZBCLMQQTZHZXZXLJFRMYZFLXYSQXXJKXRMQDZDMMYYBSQBHGZMWFWXGMXLZPYYTGZYCCDXYZXYWGSYJYZ"  
  134.             + "NBHPZJSQSYXSXRTFYZGRHZTXSZZTHCBFCLSYXZLZQMZLMPLMXZJXSFLBYZMYQHXJSXRXSQZZZSSLYFRCZJRCRXHHZXQYDYHXSJJH"  
  135.             + "ZCXZBTYNSYSXJBQLPXZQPYMLXZKYXLXCJLCYSXXZZLXDLLLJJYHZXGYJWKJRWYHCPSGNRZLFZWFZZNSXGXFLZSXZZZBFCSYJDBRJ"  
  136.             + "KRDHHGXJLJJTGXJXXSTJTJXLYXQFCSGSWMSBCTLQZZWLZZKXJMLTMJYHSDDBXGZHDLBMYJFRZFSGCLYJBPMLYSMSXLSZJQQHJZFX"  
  137.             + "GFQFQBPXZGYYQXGZTCQWYLTLGWSGWHRLFSFGZJMGMGBGTJFSYZZGZYZAFLSSPMLPFLCWBJZCLJJMZLPJJLYMQDMYYYFBGYGYZMLY"  
  138.             + "ZDXQYXRQQQHSYYYQXYLJTYXFSFSLLGNQCYHYCWFHCCCFXPYLYPLLZYXXXXXKQHHXSHJZCFZSCZJXCPZWHHHHHAPYLQALPQAFYHXD"  
  139.             + "YLUKMZQGGGDDESRNNZLTZGCHYPPYSQJJHCLLJTOLNJPZLJLHYMHEYDYDSQYCDDHGZUNDZCLZYZLLZNTNYZGSLHSLPJJBDGWXPCDU"  
  140.             + "TJCKLKCLWKLLCASSTKZZDNQNTTLYYZSSYSSZZRYLJQKCQDHHCRXRZYDGRGCWCGZQFFFPPJFZYNAKRGYWYQPQXXFKJTSZZXSWZDDF"  
  141.             + "BBXTBGTZKZNPZZPZXZPJSZBMQHKCYXYLDKLJNYPKYGHGDZJXXEAHPNZKZTZCMXCXMMJXNKSZQNMNLWBWWXJKYHCPSTMCSQTZJYXT"  
  142.             + "PCTPDTNNPGLLLZSJLSPBLPLQHDTNJNLYYRSZFFJFQWDPHZDWMRZCCLODAXNSSNYZRESTYJWJYJDBCFXNMWTTBYLWSTSZGYBLJPXG"  
  143.             + "LBOCLHPCBJLTMXZLJYLZXCLTPNCLCKXTPZJSWCYXSFYSZDKNTLBYJCYJLLSTGQCBXRYZXBXKLYLHZLQZLNZCXWJZLJZJNCJHXMNZ"  
  144.             + "ZGJZZXTZJXYCYYCXXJYYXJJXSSSJSTSSTTPPGQTCSXWZDCSYFPTFBFHFBBLZJCLZZDBXGCXLQPXKFZFLSYLTUWBMQJHSZBMDDBCY"  
  145.             + "SCCLDXYCDDQLYJJWMQLLCSGLJJSYFPYYCCYLTJANTJJPWYCMMGQYYSXDXQMZHSZXPFTWWZQSWQRFKJLZJQQYFBRXJHHFWJJZYQAZ"  
  146.             + "MYFRHCYYBYQWLPEXCCZSTYRLTTDMQLYKMBBGMYYJPRKZNPBSXYXBHYZDJDNGHPMFSGMWFZMFQMMBCMZZCJJLCNUXYQLMLRYGQZCY"  
  147.             + "XZLWJGCJCGGMCJNFYZZJHYCPRRCMTZQZXHFQGTJXCCJEAQCRJYHPLQLSZDJRBCQHQDYRHYLYXJSYMHZYDWLDFRYHBPYDTSSCNWBX"  
  148.             + "GLPZMLZZTQSSCPJMXXYCSJYTYCGHYCJWYRXXLFEMWJNMKLLSWTXHYYYNCMMCWJDQDJZGLLJWJRKHPZGGFLCCSCZMCBLTBHBQJXQD"  
  149.             + "SPDJZZGKGLFQYWBZYZJLTSTDHQHCTCBCHFLQMPWDSHYYTQWCNZZJTLBYMBPDYYYXSQKXWYYFLXXNCWCXYPMAELYKKJMZZZBRXYYQ"  
  150.             + "JFLJPFHHHYTZZXSGQQMHSPGDZQWBWPJHZJDYSCQWZKTXXSQLZYYMYSDZGRXCKKUJLWPYSYSCSYZLRMLQSYLJXBCXTLWDQZPCYCYK"  
  151.             + "PPPNSXFYZJJRCEMHSZMSXLXGLRWGCSTLRSXBZGBZGZTCPLUJLSLYLYMTXMTZPALZXPXJTJWTCYYZLBLXBZLQMYLXPGHDSLSSDMXM"  
  152.             + "BDZZSXWHAMLCZCPJMCNHJYSNSYGCHSKQMZZQDLLKABLWJXSFMOCDXJRRLYQZKJMYBYQLYHETFJZFRFKSRYXFJTWDSXXSYSQJYSLY"  
  153.             + "XWJHSNLXYYXHBHAWHHJZXWMYLJCSSLKYDZTXBZSYFDXGXZJKHSXXYBSSXDPYNZWRPTQZCZENYGCXQFJYKJBZMLJCMQQXUOXSLYXX"  
  154.             + "LYLLJDZBTYMHPFSTTQQWLHOKYBLZZALZXQLHZWRRQHLSTMYPYXJJXMQSJFNBXYXYJXXYQYLTHYLQYFMLKLJTMLLHSZWKZHLJMLHL"  
  155.             + "JKLJSTLQXYLMBHHLNLZXQJHXCFXXLHYHJJGBYZZKBXSCQDJQDSUJZYYHZHHMGSXCSYMXFEBCQWWRBPYYJQTYZCYQYQQZYHMWFFHG"  
  156.             + "ZFRJFCDPXNTQYZPDYKHJLFRZXPPXZDBBGZQSTLGDGYLCQMLCHHMFYWLZYXKJLYPQHSYWMQQGQZMLZJNSQXJQSYJYCBEHSXFSZPXZ"  
  157.             + "WFLLBCYYJDYTDTHWZSFJMQQYJLMQXXLLDTTKHHYBFPWTYYSQQWNQWLGWDEBZWCMYGCULKJXTMXMYJSXHYBRWFYMWFRXYQMXYSZTZ"  
  158.             + "ZTFYKMLDHQDXWYYNLCRYJBLPSXCXYWLSPRRJWXHQYPHTYDNXHHMMYWYTZCSQMTSSCCDALWZTCPQPYJLLQZYJSWXMZZMMYLMXCLMX"  
  159.             + "CZMXMZSQTZPPQQBLPGXQZHFLJJHYTJSRXWZXSCCDLXTYJDCQJXSLQYCLZXLZZXMXQRJMHRHZJBHMFLJLMLCLQNLDXZLLLPYPSYJY"  
  160.             + "SXCQQDCMQJZZXHNPNXZMEKMXHYKYQLXSXTXJYYHWDCWDZHQYYBGYBCYSCFGPSJNZDYZZJZXRZRQJJYMCANYRJTLDPPYZBSTJKXXZ"  
  161.             + "YPFDWFGZZRPYMTNGXZQBYXNBUFNQKRJQZMJEGRZGYCLKXZDSKKNSXKCLJSPJYYZLQQJYBZSSQLLLKJXTBKTYLCCDDBLSPPFYLGYD"  
  162.             + "TZJYQGGKQTTFZXBDKTYYHYBBFYTYYBCLPDYTGDHRYRNJSPTCSNYJQHKLLLZSLYDXXWBCJQSPXBPJZJCJDZFFXXBRMLAZHCSNDLBJ"  
  163.             + "DSZBLPRZTSWSBXBCLLXXLZDJZSJPYLYXXYFTFFFBHJJXGBYXJPMMMPSSJZJMTLYZJXSWXTYLEDQPJMYGQZJGDJLQJWJQLLSJGJGY"  
  164.             + "GMSCLJJXDTYGJQJQJCJZCJGDZZSXQGSJGGCXHQXSNQLZZBXHSGZXCXYLJXYXYYDFQQJHJFXDHCTXJYRXYSQTJXYEFYYSSYYJXNCY"  
  165.             + "ZXFXMSYSZXYYSCHSHXZZZGZZZGFJDLTYLNPZGYJYZYYQZPBXQBDZTZCZYXXYHHSQXSHDHGQHJHGYWSZTMZMLHYXGEBTYLZKQWYTJ"  
  166.             + "ZRCLEKYSTDBCYKQQSAYXCJXWWGSBHJYZYDHCSJKQCXSWXFLTYNYZPZCCZJQTZWJQDZZZQZLJJXLSBHPYXXPSXSHHEZTXFPTLQYZZ"  
  167.             + "XHYTXNCFZYYHXGNXMYWXTZSJPTHHGYMXMXQZXTSBCZYJYXXTYYZYPCQLMMSZMJZZLLZXGXZAAJZYXJMZXWDXZSXZDZXLEYJJZQBH"  
  168.             + "ZWZZZQTZPSXZTDSXJJJZNYAZPHXYYSRNQDTHZHYYKYJHDZXZLSWCLYBZYECWCYCRYLCXNHZYDZYDYJDFRJJHTRSQTXYXJRJHOJYN"  
  169.             + "XELXSFSFJZGHPZSXZSZDZCQZBYYKLSGSJHCZSHDGQGXYZGXCHXZJWYQWGYHKSSEQZZNDZFKWYSSTCLZSTSYMCDHJXXYWEYXCZAYD"  
  170.             + "MPXMDSXYBSQMJMZJMTZQLPJYQZCGQHXJHHLXXHLHDLDJQCLDWBSXFZZYYSCHTYTYYBHECXHYKGJPXHHYZJFXHWHBDZFYZBCAPNPG"  
  171.             + "NYDMSXHMMMMAMYNBYJTMPXYYMCTHJBZYFCGTYHWPHFTWZZEZSBZEGPFMTSKFTYCMHFLLHGPZJXZJGZJYXZSBBQSCZZLZCCSTPGXM"  
  172.             + "JSFTCCZJZDJXCYBZLFCJSYZFGSZLYBCWZZBYZDZYPSWYJZXZBDSYUXLZZBZFYGCZXBZHZFTPBGZGEJBSTGKDMFHYZZJHZLLZZGJQ"  
  173.             + "ZLSFDJSSCBZGPDLFZFZSZYZYZSYGCXSNXXCHCZXTZZLJFZGQSQYXZJQDCCZTQCDXZJYQJQCHXZTDLGSCXZSYQJQTZWLQDQZTQCHQ"  
  174.             + "QJZYEZZZPBWKDJFCJPZTYPQYQTTYNLMBDKTJZPQZQZZFPZSBNJLGYJDXJDZZKZGQKXDLPZJTCJDQBXDJQJSTCKNXBXZMSLYJCQMT"  
  175.             + "JQWWCJQNJNLLLHJCWQTBZQYDZCZPZZDZYDDCYZZZCCJTTJFZDPRRTZTJDCQTQZDTJNPLZBCLLCTZSXKJZQZPZLBZRBTJDCXFCZDB"  
  176.             + "CCJJLTQQPLDCGZDBBZJCQDCJWYNLLZYZCCDWLLXWZLXRXNTQQCZXKQLSGDFQTDDGLRLAJJTKUYMKQLLTZYTDYYCZGJWYXDXFRSKS"  
  177.             + "TQTENQMRKQZHHQKDLDAZFKYPBGGPZREBZZYKZZSPEGJXGYKQZZZSLYSYYYZWFQZYLZZLZHWCHKYPQGNPGBLPLRRJYXCCSYYHSFZF"  
  178.             + "YBZYYTGZXYLXCZWXXZJZBLFFLGSKHYJZEYJHLPLLLLCZGXDRZELRHGKLZZYHZLYQSZZJZQLJZFLNBHGWLCZCFJYSPYXZLZLXGCCP"  
  179.             + "ZBLLCYBBBBUBBCBPCRNNZCZYRBFSRLDCGQYYQXYGMQZWTZYTYJXYFWTEHZZJYWLCCNTZYJJZDEDPZDZTSYQJHDYMBJNYJZLXTSST"  
  180.             + "PHNDJXXBYXQTZQDDTJTDYYTGWSCSZQFLSHLGLBCZPHDLYZJYCKWTYTYLBNYTSDSYCCTYSZYYEBHEXHQDTWNYGYCLXTSZYSTQMYGZ"  
  181.             + "AZCCSZZDSLZCLZRQXYYELJSBYMXSXZTEMBBLLYYLLYTDQYSHYMRQWKFKBFXNXSBYCHXBWJYHTQBPBSBWDZYLKGZSKYHXQZJXHXJX"  
  182.             + "GNLJKZLYYCDXLFYFGHLJGJYBXQLYBXQPQGZTZPLNCYPXDJYQYDYMRBESJYYHKXXSTMXRCZZYWXYQYBMCLLYZHQYZWQXDBXBZWZMS"  
  183.             + "LPDMYSKFMZKLZCYQYCZLQXFZZYDQZPZYGYJYZMZXDZFYFYTTQTZHGSPCZMLCCYTZXJCYTJMKSLPZHYSNZLLYTPZCTZZCKTXDHXXT"  
  184.             + "QCYFKSMQCCYYAZHTJPCYLZLYJBJXTPNYLJYYNRXSYLMMNXJSMYBCSYSYLZYLXJJQYLDZLPQBFZZBLFNDXQKCZFYWHGQMRDSXYCYT"  
  185.             + "XNQQJZYYPFZXDYZFPRXEJDGYQBXRCNFYYQPGHYJDYZXGRHTKYLNWDZNTSMPKLBTHBPYSZBZTJZSZZJTYYXZPHSSZZBZCZPTQFZMY"  
  186.             + "FLYPYBBJQXZMXXDJMTSYSKKBJZXHJCKLPSMKYJZCXTMLJYXRZZQSLXXQPYZXMKYXXXJCLJPRMYYGADYSKQLSNDHYZKQXZYZTCGHZ"  
  187.             + "TLMLWZYBWSYCTBHJHJFCWZTXWYTKZLXQSHLYJZJXTMPLPYCGLTBZZTLZJCYJGDTCLKLPLLQPJMZPAPXYZLKKTKDZCZZBNZDYDYQZ"  
  188.             + "JYJGMCTXLTGXSZLMLHBGLKFWNWZHDXUHLFMKYSLGXDTWWFRJEJZTZHYDXYKSHWFZCQSHKTMQQHTZHYMJDJSKHXZJZBZZXYMPAGQM"  
  189.             + "STPXLSKLZYNWRTSQLSZBPSPSGZWYHTLKSSSWHZZLYYTNXJGMJSZSUFWNLSOZTXGXLSAMMLBWLDSZYLAKQCQCTMYCFJBSLXCLZZCL"  
  190.             + "XXKSBZQCLHJPSQPLSXXCKSLNHPSFQQYTXYJZLQLDXZQJZDYYDJNZPTUZDSKJFSLJHYLZSQZLBTXYDGTQFDBYAZXDZHZJNHHQBYKN"  
  191.             + "XJJQCZMLLJZKSPLDYCLBBLXKLELXJLBQYCXJXGCNLCQPLZLZYJTZLJGYZDZPLTQCSXFDMNYCXGBTJDCZNBGBQYQJWGKFHTNPYQZQ"  
  192.             + "GBKPBBYZMTJDYTBLSQMPSXTBNPDXKLEMYYCJYNZCTLDYKZZXDDXHQSHDGMZSJYCCTAYRZLPYLTLKXSLZCGGEXCLFXLKJRTLQJAQZ"  
  193.             + "NCMBYDKKCXGLCZJZXJHPTDJJMZQYKQSECQZDSHHADMLZFMMZBGNTJNNLGBYJBRBTMLBYJDZXLCJLPLDLPCQDHLXZLYCBLCXZZJAD"  
  194.             + "JLNZMMSSSMYBHBSQKBHRSXXJMXSDZNZPXLGBRHWGGFCXGMSKLLTSJYYCQLTSKYWYYHYWXBXQYWPYWYKQLSQPTNTKHQCWDQKTWPXX"  
  195.             + "HCPTHTWUMSSYHBWCRWXHJMKMZNGWTMLKFGHKJYLSYYCXWHYECLQHKQHTTQKHFZLDXQWYZYYDESBPKYRZPJFYYZJCEQDZZDLATZBB"  
  196.             + "FJLLCXDLMJSSXEGYGSJQXCWBXSSZPDYZCXDNYXPPZYDLYJCZPLTXLSXYZYRXCYYYDYLWWNZSAHJSYQYHGYWWAXTJZDAXYSRLTDPS"  
  197.             + "SYYFNEJDXYZHLXLLLZQZSJNYQYQQXYJGHZGZCYJCHZLYCDSHWSHJZYJXCLLNXZJJYYXNFXMWFPYLCYLLABWDDHWDXJMCXZTZPMLQ"  
  198.             + "ZHSFHZYNZTLLDYWLSLXHYMMYLMBWWKYXYADTXYLLDJPYBPWUXJMWMLLSAFDLLYFLBHHHBQQLTZJCQJLDJTFFKMMMBYTHYGDCQRDD"  
  199.             + "WRQJXNBYSNWZDBYYTBJHPYBYTTJXAAHGQDQTMYSTQXKBTZPKJLZRBEQQSSMJJBDJOTGTBXPGBKTLHQXJJJCTHXQDWJLWRFWQGWSH"  
  200.             + "CKRYSWGFTGYGBXSDWDWRFHWYTJJXXXJYZYSLPYYYPAYXHYDQKXSHXYXGSKQHYWFDDDPPLCJLQQEEWXKSYYKDYPLTJTHKJLTCYYHH"  
  201.             + "JTTPLTZZCDLTHQKZXQYSTEEYWYYZYXXYYSTTJKLLPZMCYHQGXYHSRMBXPLLNQYDQHXSXXWGDQBSHYLLPJJJTHYJKYPPTHYYKTYEZ"  
  202.             + "YENMDSHLCRPQFDGFXZPSFTLJXXJBSWYYSKSFLXLPPLBBBLBSFXFYZBSJSSYLPBBFFFFSSCJDSTZSXZRYYSYFFSYZYZBJTBCTSBSD"  
  203.             + "HRTJJBYTCXYJEYLXCBNEBJDSYXYKGSJZBXBYTFZWGENYHHTHZHHXFWGCSTBGXKLSXYWMTMBYXJSTZSCDYQRCYTWXZFHMYMCXLZNS"  
  204.             + "DJTTTXRYCFYJSBSDYERXJLJXBBDEYNJGHXGCKGSCYMBLXJMSZNSKGXFBNBPTHFJAAFXYXFPXMYPQDTZCXZZPXRSYWZDLYBBKTYQP"  
  205.             + "QJPZYPZJZNJPZJLZZFYSBTTSLMPTZRTDXQSJEHBZYLZDHLJSQMLHTXTJECXSLZZSPKTLZKQQYFSYGYWPCPQFHQHYTQXZKRSGTTSQ"  
  206.             + "CZLPTXCDYYZXSQZSLXLZMYCPCQBZYXHBSXLZDLTCDXTYLZJYYZPZYZLTXJSJXHLPMYTXCQRBLZSSFJZZTNJYTXMYJHLHPPLCYXQJ"  
  207.             + "QQKZZSCPZKSWALQSBLCCZJSXGWWWYGYKTJBBZTDKHXHKGTGPBKQYSLPXPJCKBMLLXDZSTBKLGGQKQLSBKKTFXRMDKBFTPZFRTBBR"  
  208.             + "FERQGXYJPZSSTLBZTPSZQZSJDHLJQLZBPMSMMSXLQQNHKNBLRDDNXXDHDDJCYYGYLXGZLXSYGMQQGKHBPMXYXLYTQWLWGCPBMQXC"  
  209.             + "YZYDRJBHTDJYHQSHTMJSBYPLWHLZFFNYPMHXXHPLTBQPFBJWQDBYGPNZTPFZJGSDDTQSHZEAWZZYLLTYYBWJKXXGHLFKXDJTMSZS"  
  210.             + "QYNZGGSWQSPHTLSSKMCLZXYSZQZXNCJDQGZDLFNYKLJCJLLZLMZZNHYDSSHTHZZLZZBBHQZWWYCRZHLYQQJBEYFXXXWHSRXWQHWP"  
  211.             + "SLMSSKZTTYGYQQWRSLALHMJTQJSMXQBJJZJXZYZKXBYQXBJXSHZTSFJLXMXZXFGHKZSZGGYLCLSARJYHSLLLMZXELGLXYDJYTLFB"  
  212.             + "HBPNLYZFBBHPTGJKWETZHKJJXZXXGLLJLSTGSHJJYQLQZFKCGNNDJSSZFDBCTWWSEQFHQJBSAQTGYPQLBXBMMYWXGSLZHGLZGQYF"  
  213.             + "LZBYFZJFRYSFMBYZHQGFWZSYFYJJPHZBYYZFFWODGRLMFTWLBZGYCQXCDJYGZYYYYTYTYDWEGAZYHXJLZYYHLRMGRXXZCLHNELJJ"  
  214.             + "TJTPWJYBJJBXJJTJTEEKHWSLJPLPSFYZPQQBDLQJJTYYQLYZKDKSQJYYQZLDQTGJQYZJSUCMRYQTHTEJMFCTYHYPKMHYZWJDQFHY"  
  215.             + "YXWSHCTXRLJHQXHCCYYYJLTKTTYTMXGTCJTZAYYOCZLYLBSZYWJYTSJYHBYSHFJLYGJXXTMZYYLTXXYPZLXYJZYZYYPNHMYMDYYL"  
  216.             + "BLHLSYYQQLLNJJYMSOYQBZGDLYXYLCQYXTSZEGXHZGLHWBLJHEYXTWQMAKBPQCGYSHHEGQCMWYYWLJYJHYYZLLJJYLHZYHMGSLJL"  
  217.             + "JXCJJYCLYCJPCPZJZJMMYLCQLNQLJQJSXYJMLSZLJQLYCMMHCFMMFPQQMFYLQMCFFQMMMMHMZNFHHJGTTHHKHSLNCHHYQDXTMMQD"  
  218.             + "CYZYXYQMYQYLTDCYYYZAZZCYMZYDLZFFFMMYCQZWZZMABTBYZTDMNZZGGDFTYPCGQYTTSSFFWFDTZQSSYSTWXJHXYTSXXYLBYQHW"  
  219.             + "WKXHZXWZNNZZJZJJQJCCCHYYXBZXZCYZTLLCQXYNJYCYYCYNZZQYYYEWYCZDCJYCCHYJLBTZYYCQWMPWPYMLGKDLDLGKQQBGYCHJ"  
  220.             + "XY";  
  221.   
  222.     public static int getUnicodeFromGBK(String text) {  
  223.         int unicode = 0;  
  224.         byte buff[] = null;  
  225.         String str = text;  
  226.   
  227.         if (str == null || str.length() <= 0)  
  228.             return unicode;  
  229.         // 如果进入的串长度大于1,则只返回第一个字的Unicode值  
  230.         if (str.length() > 1)  
  231.             str = text.substring(01);  
  232.         try {  
  233.             // 取得字的Unicode值,其中buff[0],buff[1]为Unicode的标识,而buff[3]为Unicode值的高位字节,buff[2]为Unicode值的低位字节  
  234.             // buff = str.getBytes ( "Unicode" ); //  
  235.             // 不用直接用"Unicode",因为有的JRE环境下可能高低位会相反不统一,因此使用"UnicodeLittle"则会统一要求低位在前,相反"UnicodeBig"则是统一要求高位在前  
  236.             buff = str.getBytes("UnicodeLittle");  
  237.   
  238.             unicode = (((int) (buff[3]) << 8) & 0xff00)  
  239.                     + ((int) (buff[2]) & 0x00ff);  
  240.         } catch (Exception e) {  
  241.             e.printStackTrace();  
  242.         }  
  243.   
  244.         return unicode;  
  245.     }  
  246.   
  247.     /** 
  248.      * 根据输入的源串(中文或中西文混合)返回其拼音首字母,以小写返回,如果首字符非拼音字母,则统一返回"" 
  249.      *  
  250.      * @param str 
  251.      * @return 
  252.      */  
  253.     public static String getFirstCharOfString(String str) {  
  254.         String firstchar = "";  
  255.         int unicode = getUnicodeFromGBK(str);  
  256.   
  257.         if (unicode >= 19968 && unicode <= 40869)  
  258.             firstchar = GBK2UNICODE.substring(unicode - 19968,  
  259.                     unicode - 19968 + 1);  
  260.   
  261.         return firstchar.toLowerCase();  
  262.     }  
  263.   
  264.     /** 
  265.      * 根据输入的源串(中文或中西文混合)返回其拼音首字母串,如果中间有非字母符号则保留 
  266.      *  
  267.      * @param str 
  268.      * @return 
  269.      */  
  270.     public static String getSimpleCharsOfString(String str) {  
  271.         String chars = "";  
  272.         String firstchar = "";  
  273.   
  274.         if (str == null)  
  275.             return chars;  
  276.         for (int i = 0; i < str.length(); i++) {  
  277.             firstchar = getFirstCharOfString(String.valueOf(str.charAt(i)));  
  278.             if (firstchar.length() <= 0)  
  279.                 firstchar = String.valueOf(str.charAt(i));  
  280.             chars += firstchar;  
  281.         }  
  282.   
  283.         return chars;  
  284.     }  
  285.   
  286.     /** 
  287.      * 根据输入的源串(中文或中西文混合)返回其拼音首字母串,如果中间有非字母符号则保留,但,如果中间有空格则"吃"掉 
  288.      *  
  289.      * @param str 
  290.      * @return 
  291.      */  
  292.     public static String getSimpleCharsOfStringByTrim(String str) {  
  293.         String chars = "";  
  294.         String firstchar = "";  
  295.   
  296.         if (str == null)  
  297.             return chars;  
  298.         for (int i = 0; i < str.length(); i++) {  
  299.             firstchar = getFirstCharOfString(String.valueOf(str.charAt(i)));  
  300.             if (firstchar.length() <= 0) {  
  301.                 if (str.charAt(i) != ' ')  
  302.                     firstchar = String.valueOf(str.charAt(i));  
  303.             }  
  304.             chars += firstchar;  
  305.         }  
  306.   
  307.         return chars;  
  308.     }  
  309. }  
package com.suntek.mobilemeeting.utils;

/**
 * 根据 GBK 汉字的 UNICODE 编码取得汉字的首字母
 * 
 * @author zrq
 * 
 */

public class UnicodeGBK2Alpha {
	private final static String GBK2UNICODE = "YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJGYZZJJFKCCLZDHWDWZJLJPFYYNWJJTMYHZWZHFLZPPQHGSCYYYNJQYXXGJ"
			+ "HHSDSJNKKTMOMLCRXYPSNQSECCQZGGLLYJLMYZZSECYKYYHQWJSSGGYXYZYJWWKDJHYCHMYXJTLXJYQBYXZLDWRDJRWYSRLDZJPC"
			+ "BZJJBRCFTLECZSTZFXXZHTRQHYBDLYCZSSYMMRFMYQZPWWJJYFCRWFDFZQPYDDWYXKYJAWJFFXYPSFTZYHHYZYSWCJYXSCLCXXWZ"
			+ "ZXNBGNNXBXLZSZSBSGPYSYZDHMDZBQBZCWDZZYYTZHBTSYYBZGNTNXQYWQSKBPHHLXGYBFMJEBJHHGQTJCYSXSTKZHLYCKGLYSMZ"
			+ "XYALMELDCCXGZYRJXSDLTYZCQKCNNJWHJTZZCQLJSTSTBNXBTYXCEQXGKWJYFLZQLYHYXSPSFXLMPBYSXXXYDJCZYLLLSJXFHJXP"
			+ "JBTFFYABYXBHZZBJYZLWLCZGGBTSSMDTJZXPTHYQTGLJSCQFZKJZJQNLZWLSLHDZBWJNCJZYZSQQYCQYRZCJJWYBRTWPYFTWEXCS"
			+ "KDZCTBZHYZZYYJXZCFFZZMJYXXSDZZOTTBZLQWFCKSZSXFYRLNYJMBDTHJXSQQCCSBXYYTSYFBXDZTGBCNSLCYZZPSAZYZZSCJCS"
			+ "HZQYDXLBPJLLMQXTYDZXSQJTZPXLCGLQTZWJBHCTSYJSFXYEJJTLBGXSXJMYJQQPFZASYJNTYDJXKJCDJSZCBARTDCLYJQMWNQNC"
			+ "LLLKBYBZZSYHQQLTWLCCXTXLLZNTYLNEWYZYXCZXXGRKRMTCNDNJTSYYSSDQDGHSDBJGHRWRQLYBGLXHLGTGXBQJDZPYJSJYJCTM"
			+ "RNYMGRZJCZGJMZMGXMPRYXKJNYMSGMZJYMKMFXMLDTGFBHCJHKYLPFMDXLQJJSMTQGZSJLQDLDGJYCALCMZCSDJLLNXDJFFFFJCZ"
			+ "FMZFFPFKHKGDPSXKTACJDHHZDDCRRCFQYJKQCCWJDXHWJLYLLZGCFCQDSMLZPBJJPLSBCJGGDCKKDEZSQCCKJGCGKDJTJDLZYCXK"
			+ "LQSCGJCLTFPCQCZGWPJDQYZJJBYJHSJDZWGFSJGZKQCCZLLPSPKJGQJHZZLJPLGJGJJTHJJYJZCZMLZLYQBGJWMLJKXZDZNJQSYZ"
			+ "MLJLLJKYWXMKJLHSKJGBMCLYYMKXJQLBMLLKMDXXKWYXYSLMLPSJQQJQXYXFJTJDXMXXLLCXQBSYJBGWYMBGGBCYXPJYGPEPFGDJ"
			+ "GBHBNSQJYZJKJKHXQFGQZKFHYGKHDKLLSDJQXPQYKYBNQSXQNSZSWHBSXWHXWBZZXDMNSJBSBKBBZKLYLXGWXDRWYQZMYWSJQLCJ"
			+ "XXJXKJEQXSCYETLZHLYYYSDZPAQYZCMTLSHTZCFYZYXYLJSDCJQAGYSLCQLYYYSHMRQQKLDXZSCSSSYDYCJYSFSJBFRSSZQSBXXP"
			+ "XJYSDRCKGJLGDKZJZBDKTCSYQPYHSTCLDJDHMXMCGXYZHJDDTMHLTXZXYLYMOHYJCLTYFBQQXPFBDFHHTKSQHZYYWCNXXCRWHOWG"
			+ "YJLEGWDQCWGFJYCSNTMYTOLBYGWQWESJPWNMLRYDZSZTXYQPZGCWXHNGPYXSHMYQJXZTDPPBFYHZHTJYFDZWKGKZBLDNTSXHQEEG"
			+ "ZZYLZMMZYJZGXZXKHKSTXNXXWYLYAPSTHXDWHZYMPXAGKYDXBHNHXKDPJNMYHYLPMGOCSLNZHKXXLPZZLBMLSFBHHGYGYYGGBHSC"
			+ "YAQTYWLXTZQCEZYDQDQMMHTKLLSZHLSJZWFYHQSWSCWLQAZYNYTLSXTHAZNKZZSZZLAXXZWWCTGQQTDDYZTCCHYQZFLXPSLZYGPZ"
			+ "SZNGLNDQTBDLXGTCTAJDKYWNSYZLJHHZZCWNYYZYWMHYCHHYXHJKZWSXHZYXLYSKQYSPSLYZWMYPPKBYGLKZHTYXAXQSYSHXASMC"
			+ "HKDSCRSWJPWXSGZJLWWSCHSJHSQNHCSEGNDAQTBAALZZMSSTDQJCJKTSCJAXPLGGXHHGXXZCXPDMMHLDGTYBYSJMXHMRCPXXJZCK"
			+ "ZXSHMLQXXTTHXWZFKHCCZDYTCJYXQHLXDHYPJQXYLSYYDZOZJNYXQEZYSQYAYXWYPDGXDDXSPPYZNDLTWRHXYDXZZJHTCXMCZLHP"
			+ "YYYYMHZLLHNXMYLLLMDCPPXHMXDKYCYRDLTXJCHHZZXZLCCLYLNZSHZJZZLNNRLWHYQSNJHXYNTTTKYJPYCHHYEGKCTTWLGQRLGG"
			+ "TGTYGYHPYHYLQYQGCWYQKPYYYTTTTLHYHLLTYTTSPLKYZXGZWGPYDSSZZDQXSKCQNMJJZZBXYQMJRTFFBTKHZKBXLJJKDXJTLBWF"
			+ "ZPPTKQTZTGPDGNTPJYFALQMKGXBDCLZFHZCLLLLADPMXDJHLCCLGYHDZFGYDDGCYYFGYDXKSSEBDHYKDKDKHNAXXYBPBYYHXZQGA"
			+ "FFQYJXDMLJCSQZLLPCHBSXGJYNDYBYQSPZWJLZKSDDTACTBXZDYZYPJZQSJNKKTKNJDJGYYPGTLFYQKASDNTCYHBLWDZHBBYDWJR"
			+ "YGKZYHEYYFJMSDTYFZJJHGCXPLXHLDWXXJKYTCYKSSSMTWCTTQZLPBSZDZWZXGZAGYKTYWXLHLSPBCLLOQMMZSSLCMBJCSZZKYDC"
			+ "ZJGQQDSMCYTZQQLWZQZXSSFPTTFQMDDZDSHDTDWFHTDYZJYQJQKYPBDJYYXTLJHDRQXXXHAYDHRJLKLYTWHLLRLLRCXYLBWSRSZZ"
			+ "SYMKZZHHKYHXKSMDSYDYCJPBZBSQLFCXXXNXKXWYWSDZYQOGGQMMYHCDZTTFJYYBGSTTTYBYKJDHKYXBELHTYPJQNFXFDYKZHQKZ"
			+ "BYJTZBXHFDXKDASWTAWAJLDYJSFHBLDNNTNQJTJNCHXFJSRFWHZFMDRYJYJWZPDJKZYJYMPCYZNYNXFBYTFYFWYGDBNZZZDNYTXZ"
			+ "EMMQBSQEHXFZMBMFLZZSRXYMJGSXWZJSPRYDJSJGXHJJGLJJYNZZJXHGXKYMLPYYYCXYTWQZSWHWLYRJLPXSLSXMFSWWKLCTNXNY"
			+ "NPSJSZHDZEPTXMYYWXYYSYWLXJQZQXZDCLEEELMCPJPCLWBXSQHFWWTFFJTNQJHJQDXHWLBYZNFJLALKYYJLDXHHYCSTYYWNRJYX"
			+ "YWTRMDRQHWQCMFJDYZMHMYYXJWMYZQZXTLMRSPWWCHAQBXYGZYPXYYRRCLMPYMGKSJSZYSRMYJSNXTPLNBAPPYPYLXYYZKYNLDZY"
			+ "JZCZNNLMZHHARQMPGWQTZMXXMLLHGDZXYHXKYXYCJMFFYYHJFSBSSQLXXNDYCANNMTCJCYPRRNYTYQNYYMBMSXNDLYLYSLJRLXYS"
			+ "XQMLLYZLZJJJKYZZCSFBZXXMSTBJGNXYZHLXNMCWSCYZYFZLXBRNNNYLBNRTGZQYSATSWRYHYJZMZDHZGZDWYBSSCSKXSYHYTXXG"
			+ "CQGXZZSHYXJSCRHMKKBXCZJYJYMKQHZJFNBHMQHYSNJNZYBKNQMCLGQHWLZNZSWXKHLJHYYBQLBFCDSXDLDSPFZPSKJYZWZXZDDX"
			+ "JSMMEGJSCSSMGCLXXKYYYLNYPWWWGYDKZJGGGZGGSYCKNJWNJPCXBJJTQTJWDSSPJXZXNZXUMELPXFSXTLLXCLJXJJLJZXCTPSWX"
			+ "LYDHLYQRWHSYCSQYYBYAYWJJJQFWQCQQCJQGXALDBZZYJGKGXPLTZYFXJLTPADKYQHPMATLCPDCKBMTXYBHKLENXDLEEGQDYMSAW"
			+ "HZMLJTWYGXLYQZLJEEYYBQQFFNLYXRDSCTGJGXYYNKLLYQKCCTLHJLQMKKZGCYYGLLLJDZGYDHZWXPYSJBZKDZGYZZHYWYFQYTYZ"
			+ "SZYEZZLYMHJJHTSMQWYZLKYYWZCSRKQYTLTDXWCTYJKLWSQZWBDCQYNCJSRSZJLKCDCDTLZZZACQQZZDDXYPLXZBQJYLZLLLQDDZ"
			+ "QJYJYJZYXNYYYNYJXKXDAZWYRDLJYYYRJLXLLDYXJCYWYWNQCCLDDNYYYNYCKCZHXXCCLGZQJGKWPPCQQJYSBZZXYJSQPXJPZBSB"
			+ "DSFNSFPZXHDWZTDWPPTFLZZBZDMYYPQJRSDZSQZSQXBDGCPZSWDWCSQZGMDHZXMWWFYBPDGPHTMJTHZSMMBGZMBZJCFZWFZBBZMQ"
			+ "CFMBDMCJXLGPNJBBXGYHYYJGPTZGZMQBQTCGYXJXLWZKYDPDYMGCFTPFXYZTZXDZXTGKMTYBBCLBJASKYTSSQYYMSZXFJEWLXLLS"
			+ "ZBQJJJAKLYLXLYCCTSXMCWFKKKBSXLLLLJYXTYLTJYYTDPJHNHNNKBYQNFQYYZBYYESSESSGDYHFHWTCJBSDZZTFDMXHCNJZYMQW"
			+ "SRYJDZJQPDQBBSTJGGFBKJBXTGQHNGWJXJGDLLTHZHHYYYYYYSXWTYYYCCBDBPYPZYCCZYJPZYWCBDLFWZCWJDXXHYHLHWZZXJTC"
			+ "ZLCDPXUJCZZZLYXJJTXPHFXWPYWXZPTDZZBDZCYHJHMLXBQXSBYLRDTGJRRCTTTHYTCZWMXFYTWWZCWJWXJYWCSKYBZSCCTZQNHX"
			+ "NWXXKHKFHTSWOCCJYBCMPZZYKBNNZPBZHHZDLSYDDYTYFJPXYNGFXBYQXCBHXCPSXTYZDMKYSNXSXLHKMZXLYHDHKWHXXSSKQYHH"
			+ "CJYXGLHZXCSNHEKDTGZXQYPKDHEXTYKCNYMYYYPKQYYYKXZLTHJQTBYQHXBMYHSQCKWWYLLHCYYLNNEQXQWMCFBDCCMLJGGXDQKT"
			+ "LXKGNQCDGZJWYJJLYHHQTTTNWCHMXCXWHWSZJYDJCCDBQCDGDNYXZTHCQRXCBHZTQCBXWGQWYYBXHMBYMYQTYEXMQKYAQYRGYZSL"
			+ "FYKKQHYSSQYSHJGJCNXKZYCXSBXYXHYYLSTYCXQTHYSMGSCPMMGCCCCCMTZTASMGQZJHKLOSQYLSWTMXSYQKDZLJQQYPLSYCZTCQ"
			+ "QPBBQJZCLPKHQZYYXXDTDDTSJCXFFLLCHQXMJLWCJCXTSPYCXNDTJSHJWXDQQJSKXYAMYLSJHMLALYKXCYYDMNMDQMXMCZNNCYBZ"
			+ "KKYFLMCHCMLHXRCJJHSYLNMTJZGZGYWJXSRXCWJGJQHQZDQJDCJJZKJKGDZQGJJYJYLXZXXCDQHHHEYTMHLFSBDJSYYSHFYSTCZQ"
			+ "LPBDRFRZTZYKYWHSZYQKWDQZRKMSYNBCRXQBJYFAZPZZEDZCJYWBCJWHYJBQSZYWRYSZPTDKZPFPBNZTKLQYHBBZPNPPTYZZYBQN"
			+ "YDCPJMMCYCQMCYFZZDCMNLFPBPLNGQJTBTTNJZPZBBZNJKLJQYLNBZQHKSJZNGGQSZZKYXSHPZSNBCGZKDDZQANZHJKDRTLZLSWJ"
			+ "LJZLYWTJNDJZJHXYAYNCBGTZCSSQMNJPJYTYSWXZFKWJQTKHTZPLBHSNJZSYZBWZZZZLSYLSBJHDWWQPSLMMFBJDWAQYZTCJTBNN"
			+ "WZXQXCDSLQGDSDPDZHJTQQPSWLYYJZLGYXYZLCTCBJTKTYCZJTQKBSJLGMGZDMCSGPYNJZYQYYKNXRPWSZXMTNCSZZYXYBYHYZAX"
			+ "YWQCJTLLCKJJTJHGDXDXYQYZZBYWDLWQCGLZGJGQRQZCZSSBCRPCSKYDZNXJSQGXSSJMYDNSTZTPBDLTKZWXQWQTZEXNQCZGWEZK"
			+ "SSBYBRTSSSLCCGBPSZQSZLCCGLLLZXHZQTHCZMQGYZQZNMCOCSZJMMZSQPJYGQLJYJPPLDXRGZYXCCSXHSHGTZNLZWZKJCXTCFCJ"
			+ "XLBMQBCZZWPQDNHXLJCTHYZLGYLNLSZZPCXDSCQQHJQKSXZPBAJYEMSMJTZDXLCJYRYYNWJBNGZZTMJXLTBSLYRZPYLSSCNXPHLL"
			+ "HYLLQQZQLXYMRSYCXZLMMCZLTZSDWTJJLLNZGGQXPFSKYGYGHBFZPDKMWGHCXMSGDXJMCJZDYCABXJDLNBCDQYGSKYDQTXDJJYXM"
			+ "SZQAZDZFSLQXYJSJZYLBTXXWXQQZBJZUFBBLYLWDSLJHXJYZJWTDJCZFQZQZZDZSXZZQLZCDZFJHYSPYMPQZMLPPLFFXJJNZZYLS"
			+ "JEYQZFPFZKSYWJJJHRDJZZXTXXGLGHYDXCSKYSWMMZCWYBAZBJKSHFHJCXMHFQHYXXYZFTSJYZFXYXPZLCHMZMBXHZZSXYFYMNCW"
			+ "DABAZLXKTCSHHXKXJJZJSTHYGXSXYYHHHJWXKZXSSBZZWHHHCWTZZZPJXSNXQQJGZYZYWLLCWXZFXXYXYHXMKYYSWSQMNLNAYCYS"
			+ "PMJKHWCQHYLAJJMZXHMMCNZHBHXCLXTJPLTXYJHDYYLTTXFSZHYXXSJBJYAYRSMXYPLCKDUYHLXRLNLLSTYZYYQYGYHHSCCSMZCT"
			+ "ZQXKYQFPYYRPFFLKQUNTSZLLZMWWTCQQYZWTLLMLMPWMBZSSTZRBPDDTLQJJBXZCSRZQQYGWCSXFWZLXCCRSZDZMCYGGDZQSGTJS"
			+ "WLJMYMMZYHFBJDGYXCCPSHXNZCSBSJYJGJMPPWAFFYFNXHYZXZYLREMZGZCYZSSZDLLJCSQFNXZKPTXZGXJJGFMYYYSNBTYLBNLH"
			+ "PFZDCYFBMGQRRSSSZXYSGTZRNYDZZCDGPJAFJFZKNZBLCZSZPSGCYCJSZLMLRSZBZZLDLSLLYSXSQZQLYXZLSKKBRXBRBZCYCXZZ"
			+ "ZEEYFGKLZLYYHGZSGZLFJHGTGWKRAAJYZKZQTSSHJJXDCYZUYJLZYRZDQQHGJZXSSZBYKJPBFRTJXLLFQWJHYLQTYMBLPZDXTZYG"
			+ "BDHZZRBGXHWNJTJXLKSCFSMWLSDQYSJTXKZSCFWJLBXFTZLLJZLLQBLSQMQQCGCZFPBPHZCZJLPYYGGDTGWDCFCZQYYYQYSSCLXZ"
			+ "SKLZZZGFFCQNWGLHQYZJJCZLQZZYJPJZZBPDCCMHJGXDQDGDLZQMFGPSYTSDYFWWDJZJYSXYYCZCYHZWPBYKXRYLYBHKJKSFXTZJ"
			+ "MMCKHLLTNYYMSYXYZPYJQYCSYCWMTJJKQYRHLLQXPSGTLYYCLJSCPXJYZFNMLRGJJTYZBXYZMSJYJHHFZQMSYXRSZCWTLRTQZSST"
			+ "KXGQKGSPTGCZNJSJCQCXHMXGGZTQYDJKZDLBZSXJLHYQGGGTHQSZPYHJHHGYYGKGGCWJZZYLCZLXQSFTGZSLLLMLJSKCTBLLZZSZ"
			+ "MMNYTPZSXQHJCJYQXYZXZQZCPSHKZZYSXCDFGMWQRLLQXRFZTLYSTCTMJCXJJXHJNXTNRZTZFQYHQGLLGCXSZSJDJLJCYDSJTLNY"
			+ "XHSZXCGJZYQPYLFHDJSBPCCZHJJJQZJQDYBSSLLCMYTTMQTBHJQNNYGKYRQYQMZGCJKPDCGMYZHQLLSLLCLMHOLZGDYYFZSLJCQZ"
			+ "LYLZQJESHNYLLJXGJXLYSYYYXNBZLJSSZCQQCJYLLZLTJYLLZLLBNYLGQCHXYYXOXCXQKYJXXXYKLXSXXYQXCYKQXQCSGYXXYQXY"
			+ "GYTQOHXHXPYXXXULCYEYCHZZCBWQBBWJQZSCSZSSLZYLKDESJZWMYMCYTSDSXXSCJPQQSQYLYYZYCMDJDZYWCBTJSYDJKCYDDJLB"
			+ "DJJSODZYSYXQQYXDHHGQQYQHDYXWGMMMAJDYBBBPPBCMUUPLJZSMTXERXJMHQNUTPJDCBSSMSSSTKJTSSMMTRCPLZSZMLQDSDMJM"
			+ "QPNQDXCFYNBFSDQXYXHYAYKQYDDLQYYYSSZBYDSLNTFQTZQPZMCHDHCZCWFDXTMYQSPHQYYXSRGJCWTJTZZQMGWJJTJHTQJBBHWZ"
			+ "PXXHYQFXXQYWYYHYSCDYDHHQMNMTMWCPBSZPPZZGLMZFOLLCFWHMMSJZTTDHZZYFFYTZZGZYSKYJXQYJZQBHMBZZLYGHGFMSHPZF"
			+ "ZSNCLPBQSNJXZSLXXFPMTYJYGBXLLDLXPZJYZJYHHZCYWHJYLSJEXFSZZYWXKZJLUYDTMLYMQJPWXYHXSKTQJEZRPXXZHHMHWQPW"
			+ "QLYJJQJJZSZCPHJLCHHNXJLQWZJHBMZYXBDHHYPZLHLHLGFWLCHYYTLHJXCJMSCPXSTKPNHQXSRTYXXTESYJCTLSSLSTDLLLWWYH"
			+ "DHRJZSFGXTSYCZYNYHTDHWJSLHTZDQDJZXXQHGYLTZPHCSQFCLNJTCLZPFSTPDYNYLGMJLLYCQHYSSHCHYLHQYQTMZYPBYWRFQYK"
			+ "QSYSLZDQJMPXYYSSRHZJNYWTQDFZBWWTWWRXCWHGYHXMKMYYYQMSMZHNGCEPMLQQMTCWCTMMPXJPJJHFXYYZSXZHTYBMSTSYJTTQ"
			+ "QQYYLHYNPYQZLCYZHZWSMYLKFJXLWGXYPJYTYSYXYMZCKTTWLKSMZSYLMPWLZWXWQZSSAQSYXYRHSSNTSRAPXCPWCMGDXHXZDZYF"
			+ "JHGZTTSBJHGYZSZYSMYCLLLXBTYXHBBZJKSSDMALXHYCFYGMQYPJYCQXJLLLJGSLZGQLYCJCCZOTYXMTMTTLLWTGPXYMZMKLPSZZ"
			+ "ZXHKQYSXCTYJZYHXSHYXZKXLZWPSQPYHJWPJPWXQQYLXSDHMRSLZZYZWTTCYXYSZZSHBSCCSTPLWSSCJCHNLCGCHSSPHYLHFHHXJ"
			+ "SXYLLNYLSZDHZXYLSXLWZYKCLDYAXZCMDDYSPJTQJZLNWQPSSSWCTSTSZLBLNXSMNYYMJQBQHRZWTYYDCHQLXKPZWBGQYBKFCMZW"
			+ "PZLLYYLSZYDWHXPSBCMLJBSCGBHXLQHYRLJXYSWXWXZSLDFHLSLYNJLZYFLYJYCDRJLFSYZFSLLCQYQFGJYHYXZLYLMSTDJCYHBZ"
			+ "LLNWLXXYGYYHSMGDHXXHHLZZJZXCZZZCYQZFNGWPYLCPKPYYPMCLQKDGXZGGWQBDXZZKZFBXXLZXJTPJPTTBYTSZZDWSLCHZHSLT"
			+ "YXHQLHYXXXYYZYSWTXZKHLXZXZPYHGCHKCFSYHUTJRLXFJXPTZTWHPLYXFCRHXSHXKYXXYHZQDXQWULHYHMJTBFLKHTXCWHJFWJC"
			+ "FPQRYQXCYYYQYGRPYWSGSUNGWCHKZDXYFLXXHJJBYZWTSXXNCYJJYMSWZJQRMHXZWFQSYLZJZGBHYNSLBGTTCSYBYXXWXYHXYYXN"
			+ "SQYXMQYWRGYQLXBBZLJSYLPSYTJZYHYZAWLRORJMKSCZJXXXYXCHDYXRYXXJDTSQFXLYLTSFFYXLMTYJMJUYYYXLTZCSXQZQHZXL"
			+ "YYXZHDNBRXXXJCTYHLBRLMBRLLAXKYLLLJLYXXLYCRYLCJTGJCMTLZLLCYZZPZPCYAWHJJFYBDYYZSMPCKZDQYQPBPCJPDCYZMDP"
			+ "BCYYDYCNNPLMTMLRMFMMGWYZBSJGYGSMZQQQZTXMKQWGXLLPJGZBQCDJJJFPKJKCXBLJMSWMDTQJXLDLPPBXCWRCQFBFQJCZAHZG"
			+ "MYKPHYYHZYKNDKZMBPJYXPXYHLFPNYYGXJDBKXNXHJMZJXSTRSTLDXSKZYSYBZXJLXYSLBZYSLHXJPFXPQNBYLLJQKYGZMCYZZYM"
			+ "CCSLCLHZFWFWYXZMWSXTYNXJHPYYMCYSPMHYSMYDYSHQYZCHMJJMZCAAGCFJBBHPLYZYLXXSDJGXDHKXXTXXNBHRMLYJSLTXMRHN"
			+ "LXQJXYZLLYSWQGDLBJHDCGJYQYCMHWFMJYBMBYJYJWYMDPWHXQLDYGPDFXXBCGJSPCKRSSYZJMSLBZZJFLJJJLGXZGYXYXLSZQYX"
			+ "BEXYXHGCXBPLDYHWETTWWCJMBTXCHXYQXLLXFLYXLLJLSSFWDPZSMYJCLMWYTCZPCHQEKCQBWLCQYDPLQPPQZQFJQDJHYMMCXTXD"
			+ "RMJWRHXCJZYLQXDYYNHYYHRSLSRSYWWZJYMTLTLLGTQCJZYABTCKZCJYCCQLJZQXALMZYHYWLWDXZXQDLLQSHGPJFJLJHJABCQZD"
			+ "JGTKHSSTCYJLPSWZLXZXRWGLDLZRLZXTGSLLLLZLYXXWGDZYGBDPHZPBRLWSXQBPFDWOFMWHLYPCBJCCLDMBZPBZZLCYQXLDOMZB"
			+ "LZWPDWYYGDSTTHCSQSCCRSSSYSLFYBFNTYJSZDFNDPDHDZZMBBLSLCMYFFGTJJQWFTMTPJWFNLBZCMMJTGBDZLQLPYFHYYMJYLSD"
			+ "CHDZJWJCCTLJCLDTLJJCPDDSQDSSZYBNDBJLGGJZXSXNLYCYBJXQYCBYLZCFZPPGKCXZDZFZTJJFJSJXZBNZYJQTTYJYHTYCZHYM"
			+ "DJXTTMPXSPLZCDWSLSHXYPZGTFMLCJTYCBPMGDKWYCYZCDSZZYHFLYCTYGWHKJYYLSJCXGYWJCBLLCSNDDBTZBSCLYZCZZSSQDLL"
			+ "MQYYHFSLQLLXFTYHABXGWNYWYYPLLSDLDLLBJCYXJZMLHLJDXYYQYTDLLLBUGBFDFBBQJZZMDPJHGCLGMJJPGAEHHBWCQXAXHHHZ"
			+ "CHXYPHJAXHLPHJPGPZJQCQZGJJZZUZDMQYYBZZPHYHYBWHAZYJHYKFGDPFQSDLZMLJXKXGALXZDAGLMDGXMWZQYXXDXXPFDMMSSY"
			+ "MPFMDMMKXKSYZYSHDZKXSYSMMZZZMSYDNZZCZXFPLSTMZDNMXCKJMZTYYMZMZZMSXHHDCZJEMXXKLJSTLWLSQLYJZLLZJSSDPPMH"
			+ "NLZJCZYHMXXHGZCJMDHXTKGRMXFWMCGMWKDTKSXQMMMFZZYDKMSCLCMPCGMHSPXQPZDSSLCXKYXTWLWJYAHZJGZQMCSNXYYMMPML"
			+ "KJXMHLMLQMXCTKZMJQYSZJSYSZHSYJZJCDAJZYBSDQJZGWZQQXFKDMSDJLFWEHKZQKJPEYPZYSZCDWYJFFMZZYLTTDZZEFMZLBNP"
			+ "PLPLPEPSZALLTYLKCKQZKGENQLWAGYXYDPXLHSXQQWQCQXQCLHYXXMLYCCWLYMQYSKGCHLCJNSZKPYZKCQZQLJPDMDZHLASXLBYD"
			+ "WQLWDNBQCRYDDZTJYBKBWSZDXDTNPJDTCTQDFXQQMGNXECLTTBKPWSLCTYQLPWYZZKLPYGZCQQPLLKCCYLPQMZCZQCLJSLQZDJXL"
			+ "DDHPZQDLJJXZQDXYZQKZLJCYQDYJPPYPQYKJYRMPCBYMCXKLLZLLFQPYLLLMBSGLCYSSLRSYSQTMXYXZQZFDZUYSYZTFFMZZSMZQ"
			+ "HZSSCCMLYXWTPZGXZJGZGSJSGKDDHTQGGZLLBJDZLCBCHYXYZHZFYWXYZYMSDBZZYJGTSMTFXQYXQSTDGSLNXDLRYZZLRYYLXQHT"
			+ "XSRTZNGZXBNQQZFMYKMZJBZYMKBPNLYZPBLMCNQYZZZSJZHJCTZKHYZZJRDYZHNPXGLFZTLKGJTCTSSYLLGZRZBBQZZKLPKLCZYS"
			+ "SUYXBJFPNJZZXCDWXZYJXZZDJJKGGRSRJKMSMZJLSJYWQSKYHQJSXPJZZZLSNSHRNYPZTWCHKLPSRZLZXYJQXQKYSJYCZTLQZYBB"
			+ "YBWZPQDWWYZCYTJCJXCKCWDKKZXSGKDZXWWYYJQYYTCYTDLLXWKCZKKLCCLZCQQDZLQLCSFQCHQHSFSMQZZLNBJJZBSJHTSZDYSJ"
			+ "QJPDLZCDCWJKJZZLPYCGMZWDJJBSJQZSYZYHHXJPBJYDSSXDZNCGLQMBTSFSBPDZDLZNFGFJGFSMPXJQLMBLGQCYYXBQKDJJQYRF"
			+ "KZTJDHCZKLBSDZCFJTPLLJGXHYXZCSSZZXSTJYGKGCKGYOQXJPLZPBPGTGYJZGHZQZZLBJLSQFZGKQQJZGYCZBZQTLDXRJXBSXXP"
			+ "ZXHYZYCLWDXJJHXMFDZPFZHQHQMQGKSLYHTYCGFRZGNQXCLPDLBZCSCZQLLJBLHBZCYPZZPPDYMZZSGYHCKCPZJGSLJLNSCDSLDL"
			+ "XBMSTLDDFJMKDJDHZLZXLSZQPQPGJLLYBDSZGQLBZLSLKYYHZTTNTJYQTZZPSZQZTLLJTYYLLQLLQYZQLBDZLSLYYZYMDFSZSNHL"
			+ "XZNCZQZPBWSKRFBSYZMTHBLGJPMCZZLSTLXSHTCSYZLZBLFEQHLXFLCJLYLJQCBZLZJHHSSTBRMHXZHJZCLXFNBGXGTQJCZTMSFZ"
			+ "KJMSSNXLJKBHSJXNTNLZDNTLMSJXGZJYJCZXYJYJWRWWQNZTNFJSZPZSHZJFYRDJSFSZJZBJFZQZZHZLXFYSBZQLZSGYFTZDCSZX"
			+ "ZJBQMSZKJRHYJZCKMJKHCHGTXKXQGLXPXFXTRTYLXJXHDTSJXHJZJXZWZLCQSBTXWXGXTXXHXFTSDKFJHZYJFJXRZSDLLLTQSQQZ"
			+ "QWZXSYQTWGWBZCGZLLYZBCLMQQTZHZXZXLJFRMYZFLXYSQXXJKXRMQDZDMMYYBSQBHGZMWFWXGMXLZPYYTGZYCCDXYZXYWGSYJYZ"
			+ "NBHPZJSQSYXSXRTFYZGRHZTXSZZTHCBFCLSYXZLZQMZLMPLMXZJXSFLBYZMYQHXJSXRXSQZZZSSLYFRCZJRCRXHHZXQYDYHXSJJH"
			+ "ZCXZBTYNSYSXJBQLPXZQPYMLXZKYXLXCJLCYSXXZZLXDLLLJJYHZXGYJWKJRWYHCPSGNRZLFZWFZZNSXGXFLZSXZZZBFCSYJDBRJ"
			+ "KRDHHGXJLJJTGXJXXSTJTJXLYXQFCSGSWMSBCTLQZZWLZZKXJMLTMJYHSDDBXGZHDLBMYJFRZFSGCLYJBPMLYSMSXLSZJQQHJZFX"
			+ "GFQFQBPXZGYYQXGZTCQWYLTLGWSGWHRLFSFGZJMGMGBGTJFSYZZGZYZAFLSSPMLPFLCWBJZCLJJMZLPJJLYMQDMYYYFBGYGYZMLY"
			+ "ZDXQYXRQQQHSYYYQXYLJTYXFSFSLLGNQCYHYCWFHCCCFXPYLYPLLZYXXXXXKQHHXSHJZCFZSCZJXCPZWHHHHHAPYLQALPQAFYHXD"
			+ "YLUKMZQGGGDDESRNNZLTZGCHYPPYSQJJHCLLJTOLNJPZLJLHYMHEYDYDSQYCDDHGZUNDZCLZYZLLZNTNYZGSLHSLPJJBDGWXPCDU"
			+ "TJCKLKCLWKLLCASSTKZZDNQNTTLYYZSSYSSZZRYLJQKCQDHHCRXRZYDGRGCWCGZQFFFPPJFZYNAKRGYWYQPQXXFKJTSZZXSWZDDF"
			+ "BBXTBGTZKZNPZZPZXZPJSZBMQHKCYXYLDKLJNYPKYGHGDZJXXEAHPNZKZTZCMXCXMMJXNKSZQNMNLWBWWXJKYHCPSTMCSQTZJYXT"
			+ "PCTPDTNNPGLLLZSJLSPBLPLQHDTNJNLYYRSZFFJFQWDPHZDWMRZCCLODAXNSSNYZRESTYJWJYJDBCFXNMWTTBYLWSTSZGYBLJPXG"
			+ "LBOCLHPCBJLTMXZLJYLZXCLTPNCLCKXTPZJSWCYXSFYSZDKNTLBYJCYJLLSTGQCBXRYZXBXKLYLHZLQZLNZCXWJZLJZJNCJHXMNZ"
			+ "ZGJZZXTZJXYCYYCXXJYYXJJXSSSJSTSSTTPPGQTCSXWZDCSYFPTFBFHFBBLZJCLZZDBXGCXLQPXKFZFLSYLTUWBMQJHSZBMDDBCY"
			+ "SCCLDXYCDDQLYJJWMQLLCSGLJJSYFPYYCCYLTJANTJJPWYCMMGQYYSXDXQMZHSZXPFTWWZQSWQRFKJLZJQQYFBRXJHHFWJJZYQAZ"
			+ "MYFRHCYYBYQWLPEXCCZSTYRLTTDMQLYKMBBGMYYJPRKZNPBSXYXBHYZDJDNGHPMFSGMWFZMFQMMBCMZZCJJLCNUXYQLMLRYGQZCY"
			+ "XZLWJGCJCGGMCJNFYZZJHYCPRRCMTZQZXHFQGTJXCCJEAQCRJYHPLQLSZDJRBCQHQDYRHYLYXJSYMHZYDWLDFRYHBPYDTSSCNWBX"
			+ "GLPZMLZZTQSSCPJMXXYCSJYTYCGHYCJWYRXXLFEMWJNMKLLSWTXHYYYNCMMCWJDQDJZGLLJWJRKHPZGGFLCCSCZMCBLTBHBQJXQD"
			+ "SPDJZZGKGLFQYWBZYZJLTSTDHQHCTCBCHFLQMPWDSHYYTQWCNZZJTLBYMBPDYYYXSQKXWYYFLXXNCWCXYPMAELYKKJMZZZBRXYYQ"
			+ "JFLJPFHHHYTZZXSGQQMHSPGDZQWBWPJHZJDYSCQWZKTXXSQLZYYMYSDZGRXCKKUJLWPYSYSCSYZLRMLQSYLJXBCXTLWDQZPCYCYK"
			+ "PPPNSXFYZJJRCEMHSZMSXLXGLRWGCSTLRSXBZGBZGZTCPLUJLSLYLYMTXMTZPALZXPXJTJWTCYYZLBLXBZLQMYLXPGHDSLSSDMXM"
			+ "BDZZSXWHAMLCZCPJMCNHJYSNSYGCHSKQMZZQDLLKABLWJXSFMOCDXJRRLYQZKJMYBYQLYHETFJZFRFKSRYXFJTWDSXXSYSQJYSLY"
			+ "XWJHSNLXYYXHBHAWHHJZXWMYLJCSSLKYDZTXBZSYFDXGXZJKHSXXYBSSXDPYNZWRPTQZCZENYGCXQFJYKJBZMLJCMQQXUOXSLYXX"
			+ "LYLLJDZBTYMHPFSTTQQWLHOKYBLZZALZXQLHZWRRQHLSTMYPYXJJXMQSJFNBXYXYJXXYQYLTHYLQYFMLKLJTMLLHSZWKZHLJMLHL"
			+ "JKLJSTLQXYLMBHHLNLZXQJHXCFXXLHYHJJGBYZZKBXSCQDJQDSUJZYYHZHHMGSXCSYMXFEBCQWWRBPYYJQTYZCYQYQQZYHMWFFHG"
			+ "ZFRJFCDPXNTQYZPDYKHJLFRZXPPXZDBBGZQSTLGDGYLCQMLCHHMFYWLZYXKJLYPQHSYWMQQGQZMLZJNSQXJQSYJYCBEHSXFSZPXZ"
			+ "WFLLBCYYJDYTDTHWZSFJMQQYJLMQXXLLDTTKHHYBFPWTYYSQQWNQWLGWDEBZWCMYGCULKJXTMXMYJSXHYBRWFYMWFRXYQMXYSZTZ"
			+ "ZTFYKMLDHQDXWYYNLCRYJBLPSXCXYWLSPRRJWXHQYPHTYDNXHHMMYWYTZCSQMTSSCCDALWZTCPQPYJLLQZYJSWXMZZMMYLMXCLMX"
			+ "CZMXMZSQTZPPQQBLPGXQZHFLJJHYTJSRXWZXSCCDLXTYJDCQJXSLQYCLZXLZZXMXQRJMHRHZJBHMFLJLMLCLQNLDXZLLLPYPSYJY"
			+ "SXCQQDCMQJZZXHNPNXZMEKMXHYKYQLXSXTXJYYHWDCWDZHQYYBGYBCYSCFGPSJNZDYZZJZXRZRQJJYMCANYRJTLDPPYZBSTJKXXZ"
			+ "YPFDWFGZZRPYMTNGXZQBYXNBUFNQKRJQZMJEGRZGYCLKXZDSKKNSXKCLJSPJYYZLQQJYBZSSQLLLKJXTBKTYLCCDDBLSPPFYLGYD"
			+ "TZJYQGGKQTTFZXBDKTYYHYBBFYTYYBCLPDYTGDHRYRNJSPTCSNYJQHKLLLZSLYDXXWBCJQSPXBPJZJCJDZFFXXBRMLAZHCSNDLBJ"
			+ "DSZBLPRZTSWSBXBCLLXXLZDJZSJPYLYXXYFTFFFBHJJXGBYXJPMMMPSSJZJMTLYZJXSWXTYLEDQPJMYGQZJGDJLQJWJQLLSJGJGY"
			+ "GMSCLJJXDTYGJQJQJCJZCJGDZZSXQGSJGGCXHQXSNQLZZBXHSGZXCXYLJXYXYYDFQQJHJFXDHCTXJYRXYSQTJXYEFYYSSYYJXNCY"
			+ "ZXFXMSYSZXYYSCHSHXZZZGZZZGFJDLTYLNPZGYJYZYYQZPBXQBDZTZCZYXXYHHSQXSHDHGQHJHGYWSZTMZMLHYXGEBTYLZKQWYTJ"
			+ "ZRCLEKYSTDBCYKQQSAYXCJXWWGSBHJYZYDHCSJKQCXSWXFLTYNYZPZCCZJQTZWJQDZZZQZLJJXLSBHPYXXPSXSHHEZTXFPTLQYZZ"
			+ "XHYTXNCFZYYHXGNXMYWXTZSJPTHHGYMXMXQZXTSBCZYJYXXTYYZYPCQLMMSZMJZZLLZXGXZAAJZYXJMZXWDXZSXZDZXLEYJJZQBH"
			+ "ZWZZZQTZPSXZTDSXJJJZNYAZPHXYYSRNQDTHZHYYKYJHDZXZLSWCLYBZYECWCYCRYLCXNHZYDZYDYJDFRJJHTRSQTXYXJRJHOJYN"
			+ "XELXSFSFJZGHPZSXZSZDZCQZBYYKLSGSJHCZSHDGQGXYZGXCHXZJWYQWGYHKSSEQZZNDZFKWYSSTCLZSTSYMCDHJXXYWEYXCZAYD"
			+ "MPXMDSXYBSQMJMZJMTZQLPJYQZCGQHXJHHLXXHLHDLDJQCLDWBSXFZZYYSCHTYTYYBHECXHYKGJPXHHYZJFXHWHBDZFYZBCAPNPG"
			+ "NYDMSXHMMMMAMYNBYJTMPXYYMCTHJBZYFCGTYHWPHFTWZZEZSBZEGPFMTSKFTYCMHFLLHGPZJXZJGZJYXZSBBQSCZZLZCCSTPGXM"
			+ "JSFTCCZJZDJXCYBZLFCJSYZFGSZLYBCWZZBYZDZYPSWYJZXZBDSYUXLZZBZFYGCZXBZHZFTPBGZGEJBSTGKDMFHYZZJHZLLZZGJQ"
			+ "ZLSFDJSSCBZGPDLFZFZSZYZYZSYGCXSNXXCHCZXTZZLJFZGQSQYXZJQDCCZTQCDXZJYQJQCHXZTDLGSCXZSYQJQTZWLQDQZTQCHQ"
			+ "QJZYEZZZPBWKDJFCJPZTYPQYQTTYNLMBDKTJZPQZQZZFPZSBNJLGYJDXJDZZKZGQKXDLPZJTCJDQBXDJQJSTCKNXBXZMSLYJCQMT"
			+ "JQWWCJQNJNLLLHJCWQTBZQYDZCZPZZDZYDDCYZZZCCJTTJFZDPRRTZTJDCQTQZDTJNPLZBCLLCTZSXKJZQZPZLBZRBTJDCXFCZDB"
			+ "CCJJLTQQPLDCGZDBBZJCQDCJWYNLLZYZCCDWLLXWZLXRXNTQQCZXKQLSGDFQTDDGLRLAJJTKUYMKQLLTZYTDYYCZGJWYXDXFRSKS"
			+ "TQTENQMRKQZHHQKDLDAZFKYPBGGPZREBZZYKZZSPEGJXGYKQZZZSLYSYYYZWFQZYLZZLZHWCHKYPQGNPGBLPLRRJYXCCSYYHSFZF"
			+ "YBZYYTGZXYLXCZWXXZJZBLFFLGSKHYJZEYJHLPLLLLCZGXDRZELRHGKLZZYHZLYQSZZJZQLJZFLNBHGWLCZCFJYSPYXZLZLXGCCP"
			+ "ZBLLCYBBBBUBBCBPCRNNZCZYRBFSRLDCGQYYQXYGMQZWTZYTYJXYFWTEHZZJYWLCCNTZYJJZDEDPZDZTSYQJHDYMBJNYJZLXTSST"
			+ "PHNDJXXBYXQTZQDDTJTDYYTGWSCSZQFLSHLGLBCZPHDLYZJYCKWTYTYLBNYTSDSYCCTYSZYYEBHEXHQDTWNYGYCLXTSZYSTQMYGZ"
			+ "AZCCSZZDSLZCLZRQXYYELJSBYMXSXZTEMBBLLYYLLYTDQYSHYMRQWKFKBFXNXSBYCHXBWJYHTQBPBSBWDZYLKGZSKYHXQZJXHXJX"
			+ "GNLJKZLYYCDXLFYFGHLJGJYBXQLYBXQPQGZTZPLNCYPXDJYQYDYMRBESJYYHKXXSTMXRCZZYWXYQYBMCLLYZHQYZWQXDBXBZWZMS"
			+ "LPDMYSKFMZKLZCYQYCZLQXFZZYDQZPZYGYJYZMZXDZFYFYTTQTZHGSPCZMLCCYTZXJCYTJMKSLPZHYSNZLLYTPZCTZZCKTXDHXXT"
			+ "QCYFKSMQCCYYAZHTJPCYLZLYJBJXTPNYLJYYNRXSYLMMNXJSMYBCSYSYLZYLXJJQYLDZLPQBFZZBLFNDXQKCZFYWHGQMRDSXYCYT"
			+ "XNQQJZYYPFZXDYZFPRXEJDGYQBXRCNFYYQPGHYJDYZXGRHTKYLNWDZNTSMPKLBTHBPYSZBZTJZSZZJTYYXZPHSSZZBZCZPTQFZMY"
			+ "FLYPYBBJQXZMXXDJMTSYSKKBJZXHJCKLPSMKYJZCXTMLJYXRZZQSLXXQPYZXMKYXXXJCLJPRMYYGADYSKQLSNDHYZKQXZYZTCGHZ"
			+ "TLMLWZYBWSYCTBHJHJFCWZTXWYTKZLXQSHLYJZJXTMPLPYCGLTBZZTLZJCYJGDTCLKLPLLQPJMZPAPXYZLKKTKDZCZZBNZDYDYQZ"
			+ "JYJGMCTXLTGXSZLMLHBGLKFWNWZHDXUHLFMKYSLGXDTWWFRJEJZTZHYDXYKSHWFZCQSHKTMQQHTZHYMJDJSKHXZJZBZZXYMPAGQM"
			+ "STPXLSKLZYNWRTSQLSZBPSPSGZWYHTLKSSSWHZZLYYTNXJGMJSZSUFWNLSOZTXGXLSAMMLBWLDSZYLAKQCQCTMYCFJBSLXCLZZCL"
			+ "XXKSBZQCLHJPSQPLSXXCKSLNHPSFQQYTXYJZLQLDXZQJZDYYDJNZPTUZDSKJFSLJHYLZSQZLBTXYDGTQFDBYAZXDZHZJNHHQBYKN"
			+ "XJJQCZMLLJZKSPLDYCLBBLXKLELXJLBQYCXJXGCNLCQPLZLZYJTZLJGYZDZPLTQCSXFDMNYCXGBTJDCZNBGBQYQJWGKFHTNPYQZQ"
			+ "GBKPBBYZMTJDYTBLSQMPSXTBNPDXKLEMYYCJYNZCTLDYKZZXDDXHQSHDGMZSJYCCTAYRZLPYLTLKXSLZCGGEXCLFXLKJRTLQJAQZ"
			+ "NCMBYDKKCXGLCZJZXJHPTDJJMZQYKQSECQZDSHHADMLZFMMZBGNTJNNLGBYJBRBTMLBYJDZXLCJLPLDLPCQDHLXZLYCBLCXZZJAD"
			+ "JLNZMMSSSMYBHBSQKBHRSXXJMXSDZNZPXLGBRHWGGFCXGMSKLLTSJYYCQLTSKYWYYHYWXBXQYWPYWYKQLSQPTNTKHQCWDQKTWPXX"
			+ "HCPTHTWUMSSYHBWCRWXHJMKMZNGWTMLKFGHKJYLSYYCXWHYECLQHKQHTTQKHFZLDXQWYZYYDESBPKYRZPJFYYZJCEQDZZDLATZBB"
			+ "FJLLCXDLMJSSXEGYGSJQXCWBXSSZPDYZCXDNYXPPZYDLYJCZPLTXLSXYZYRXCYYYDYLWWNZSAHJSYQYHGYWWAXTJZDAXYSRLTDPS"
			+ "SYYFNEJDXYZHLXLLLZQZSJNYQYQQXYJGHZGZCYJCHZLYCDSHWSHJZYJXCLLNXZJJYYXNFXMWFPYLCYLLABWDDHWDXJMCXZTZPMLQ"
			+ "ZHSFHZYNZTLLDYWLSLXHYMMYLMBWWKYXYADTXYLLDJPYBPWUXJMWMLLSAFDLLYFLBHHHBQQLTZJCQJLDJTFFKMMMBYTHYGDCQRDD"
			+ "WRQJXNBYSNWZDBYYTBJHPYBYTTJXAAHGQDQTMYSTQXKBTZPKJLZRBEQQSSMJJBDJOTGTBXPGBKTLHQXJJJCTHXQDWJLWRFWQGWSH"
			+ "CKRYSWGFTGYGBXSDWDWRFHWYTJJXXXJYZYSLPYYYPAYXHYDQKXSHXYXGSKQHYWFDDDPPLCJLQQEEWXKSYYKDYPLTJTHKJLTCYYHH"
			+ "JTTPLTZZCDLTHQKZXQYSTEEYWYYZYXXYYSTTJKLLPZMCYHQGXYHSRMBXPLLNQYDQHXSXXWGDQBSHYLLPJJJTHYJKYPPTHYYKTYEZ"
			+ "YENMDSHLCRPQFDGFXZPSFTLJXXJBSWYYSKSFLXLPPLBBBLBSFXFYZBSJSSYLPBBFFFFSSCJDSTZSXZRYYSYFFSYZYZBJTBCTSBSD"
			+ "HRTJJBYTCXYJEYLXCBNEBJDSYXYKGSJZBXBYTFZWGENYHHTHZHHXFWGCSTBGXKLSXYWMTMBYXJSTZSCDYQRCYTWXZFHMYMCXLZNS"
			+ "DJTTTXRYCFYJSBSDYERXJLJXBBDEYNJGHXGCKGSCYMBLXJMSZNSKGXFBNBPTHFJAAFXYXFPXMYPQDTZCXZZPXRSYWZDLYBBKTYQP"
			+ "QJPZYPZJZNJPZJLZZFYSBTTSLMPTZRTDXQSJEHBZYLZDHLJSQMLHTXTJECXSLZZSPKTLZKQQYFSYGYWPCPQFHQHYTQXZKRSGTTSQ"
			+ "CZLPTXCDYYZXSQZSLXLZMYCPCQBZYXHBSXLZDLTCDXTYLZJYYZPZYZLTXJSJXHLPMYTXCQRBLZSSFJZZTNJYTXMYJHLHPPLCYXQJ"
			+ "QQKZZSCPZKSWALQSBLCCZJSXGWWWYGYKTJBBZTDKHXHKGTGPBKQYSLPXPJCKBMLLXDZSTBKLGGQKQLSBKKTFXRMDKBFTPZFRTBBR"
			+ "FERQGXYJPZSSTLBZTPSZQZSJDHLJQLZBPMSMMSXLQQNHKNBLRDDNXXDHDDJCYYGYLXGZLXSYGMQQGKHBPMXYXLYTQWLWGCPBMQXC"
			+ "YZYDRJBHTDJYHQSHTMJSBYPLWHLZFFNYPMHXXHPLTBQPFBJWQDBYGPNZTPFZJGSDDTQSHZEAWZZYLLTYYBWJKXXGHLFKXDJTMSZS"
			+ "QYNZGGSWQSPHTLSSKMCLZXYSZQZXNCJDQGZDLFNYKLJCJLLZLMZZNHYDSSHTHZZLZZBBHQZWWYCRZHLYQQJBEYFXXXWHSRXWQHWP"
			+ "SLMSSKZTTYGYQQWRSLALHMJTQJSMXQBJJZJXZYZKXBYQXBJXSHZTSFJLXMXZXFGHKZSZGGYLCLSARJYHSLLLMZXELGLXYDJYTLFB"
			+ "HBPNLYZFBBHPTGJKWETZHKJJXZXXGLLJLSTGSHJJYQLQZFKCGNNDJSSZFDBCTWWSEQFHQJBSAQTGYPQLBXBMMYWXGSLZHGLZGQYF"
			+ "LZBYFZJFRYSFMBYZHQGFWZSYFYJJPHZBYYZFFWODGRLMFTWLBZGYCQXCDJYGZYYYYTYTYDWEGAZYHXJLZYYHLRMGRXXZCLHNELJJ"
			+ "TJTPWJYBJJBXJJTJTEEKHWSLJPLPSFYZPQQBDLQJJTYYQLYZKDKSQJYYQZLDQTGJQYZJSUCMRYQTHTEJMFCTYHYPKMHYZWJDQFHY"
			+ "YXWSHCTXRLJHQXHCCYYYJLTKTTYTMXGTCJTZAYYOCZLYLBSZYWJYTSJYHBYSHFJLYGJXXTMZYYLTXXYPZLXYJZYZYYPNHMYMDYYL"
			+ "BLHLSYYQQLLNJJYMSOYQBZGDLYXYLCQYXTSZEGXHZGLHWBLJHEYXTWQMAKBPQCGYSHHEGQCMWYYWLJYJHYYZLLJJYLHZYHMGSLJL"
			+ "JXCJJYCLYCJPCPZJZJMMYLCQLNQLJQJSXYJMLSZLJQLYCMMHCFMMFPQQMFYLQMCFFQMMMMHMZNFHHJGTTHHKHSLNCHHYQDXTMMQD"
			+ "CYZYXYQMYQYLTDCYYYZAZZCYMZYDLZFFFMMYCQZWZZMABTBYZTDMNZZGGDFTYPCGQYTTSSFFWFDTZQSSYSTWXJHXYTSXXYLBYQHW"
			+ "WKXHZXWZNNZZJZJJQJCCCHYYXBZXZCYZTLLCQXYNJYCYYCYNZZQYYYEWYCZDCJYCCHYJLBTZYYCQWMPWPYMLGKDLDLGKQQBGYCHJ"
			+ "XY";

	public static int getUnicodeFromGBK(String text) {
		int unicode = 0;
		byte buff[] = null;
		String str = text;

		if (str == null || str.length() <= 0)
			return unicode;
		// 如果进入的串长度大于1,则只返回第一个字的Unicode值
		if (str.length() > 1)
			str = text.substring(0, 1);
		try {
			// 取得字的Unicode值,其中buff[0],buff[1]为Unicode的标识,而buff[3]为Unicode值的高位字节,buff[2]为Unicode值的低位字节
			// buff = str.getBytes ( "Unicode" ); //
			// 不用直接用"Unicode",因为有的JRE环境下可能高低位会相反不统一,因此使用"UnicodeLittle"则会统一要求低位在前,相反"UnicodeBig"则是统一要求高位在前
			buff = str.getBytes("UnicodeLittle");

			unicode = (((int) (buff[3]) << 8) & 0xff00)
					+ ((int) (buff[2]) & 0x00ff);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return unicode;
	}

	/**
	 * 根据输入的源串(中文或中西文混合)返回其拼音首字母,以小写返回,如果首字符非拼音字母,则统一返回""
	 * 
	 * @param str
	 * @return
	 */
	public static String getFirstCharOfString(String str) {
		String firstchar = "";
		int unicode = getUnicodeFromGBK(str);

		if (unicode >= 19968 && unicode <= 40869)
			firstchar = GBK2UNICODE.substring(unicode - 19968,
					unicode - 19968 + 1);

		return firstchar.toLowerCase();
	}

	/**
	 * 根据输入的源串(中文或中西文混合)返回其拼音首字母串,如果中间有非字母符号则保留
	 * 
	 * @param str
	 * @return
	 */
	public static String getSimpleCharsOfString(String str) {
		String chars = "";
		String firstchar = "";

		if (str == null)
			return chars;
		for (int i = 0; i < str.length(); i++) {
			firstchar = getFirstCharOfString(String.valueOf(str.charAt(i)));
			if (firstchar.length() <= 0)
				firstchar = String.valueOf(str.charAt(i));
			chars += firstchar;
		}

		return chars;
	}

	/**
	 * 根据输入的源串(中文或中西文混合)返回其拼音首字母串,如果中间有非字母符号则保留,但,如果中间有空格则"吃"掉
	 * 
	 * @param str
	 * @return
	 */
	public static String getSimpleCharsOfStringByTrim(String str) {
		String chars = "";
		String firstchar = "";

		if (str == null)
			return chars;
		for (int i = 0; i < str.length(); i++) {
			firstchar = getFirstCharOfString(String.valueOf(str.charAt(i)));
			if (firstchar.length() <= 0) {
				if (str.charAt(i) != ' ')
					firstchar = String.valueOf(str.charAt(i));
			}
			chars += firstchar;
		}

		return chars;
	}
}


这个工具类是我目前实现最好效果的一个,我暂时还没有发现太多问题,基本上能够用。
下面是我修改过后的搜索方法
  1. /** 
  2.      * 按号码-拼音搜索联系人 
  3.      *  
  4.      * @param str 
  5.      */  
  6.     public static ArrayList<Contact> search(final String str,  
  7.             final ArrayList<Contact> allContacts) {  
  8.         ArrayList<Contact> contactList = new ArrayList<Contact>();  
  9.         // 如果搜索条件以0 1 +开头则按号码搜索  
  10.         if (str.startsWith("0") || str.startsWith("1") || str.startsWith("+")) {  
  11.             for (Contact contact : allContacts) {  
  12.                 if (contact.getNumber() != null && contact.getName() != null) {  
  13.                     if (contact.getNumber().contains(str)  
  14.                             || contact.getName().contains(str)) {  
  15.                         contact.setGroup(str);  
  16.                         contactList.add(contact);  
  17.                     }  
  18.                 }  
  19.             }  
  20.             return contactList;  
  21.         }  
  22.   
  23.         // final ChineseSpelling finder = ChineseSpelling.getInstance();  
  24.         // finder.setResource(str);  
  25.         // final String result = finder.getSpelling();  
  26.         // 先将输入的字符串转换为拼音  
  27.         // final String result = PinYinUtil.getFullSpell(str);  
  28.         final String result = PinYin.getPinYin(str);  
  29.         for (Contact contact : allContacts) {  
  30.             if (contains(contact, result)) {  
  31.                 contactList.add(contact);  
  32.             }  
  33.         }  
  34.   
  35.         return contactList;  
  36.     }  
/**
	 * 按号码-拼音搜索联系人
	 * 
	 * @param str
	 */
	public static ArrayList<Contact> search(final String str,
			final ArrayList<Contact> allContacts) {
		ArrayList<Contact> contactList = new ArrayList<Contact>();
		// 如果搜索条件以0 1 +开头则按号码搜索
		if (str.startsWith("0") || str.startsWith("1") || str.startsWith("+")) {
			for (Contact contact : allContacts) {
				if (contact.getNumber() != null && contact.getName() != null) {
					if (contact.getNumber().contains(str)
							|| contact.getName().contains(str)) {
						contact.setGroup(str);
						contactList.add(contact);
					}
				}
			}
			return contactList;
		}

		// final ChineseSpelling finder = ChineseSpelling.getInstance();
		// finder.setResource(str);
		// final String result = finder.getSpelling();
		// 先将输入的字符串转换为拼音
		// final String result = PinYinUtil.getFullSpell(str);
		final String result = PinYin.getPinYin(str);
		for (Contact contact : allContacts) {
			if (contains(contact, result)) {
				contactList.add(contact);
			}
		}

		return contactList;
	}


  1. /** 
  2.      * 根据拼音搜索 
  3.      *  
  4.      * @param str 
  5.      *            正则表达式 
  6.      * @param pyName 
  7.      *            拼音 
  8.      * @param isIncludsive 
  9.      *            搜索条件是否大于6个字符 
  10.      * @return 
  11.      */  
  12.     public static boolean contains(Contact contact, String search) {  
  13.         if (TextUtils.isEmpty(contact.getName()) || TextUtils.isEmpty(search)) {  
  14.             return false;  
  15.         }  
  16.   
  17.         boolean flag = false;  
  18.   
  19.         // 简拼匹配,如果输入在字符串长度大于6就不按首字母匹配了  
  20.         if (search.length() < 6) {  
  21.             // String firstLetters = FirstLetterUtil.getFirstLetter(contact  
  22.             // .getName());  
  23.             // 获得首字母字符串  
  24.             String firstLetters = UnicodeGBK2Alpha  
  25.                     .getSimpleCharsOfString(contact.getName());  
  26.             // String firstLetters =  
  27.             // PinYinUtil.getFirstSpell(contact.getName());  
  28.             // 不区分大小写  
  29.             Pattern firstLetterMatcher = Pattern.compile("^" + search,  
  30.                     Pattern.CASE_INSENSITIVE);  
  31.             flag = firstLetterMatcher.matcher(firstLetters).find();  
  32.         }  
  33.   
  34.         if (!flag) { // 如果简拼已经找到了,就不使用全拼了  
  35.             // 全拼匹配  
  36.             // ChineseSpelling finder = ChineseSpelling.getInstance();  
  37.             // finder.setResource(contact.getName());  
  38.             // 不区分大小写  
  39.             Pattern pattern2 = Pattern  
  40.                     .compile(search, Pattern.CASE_INSENSITIVE);  
  41.             Matcher matcher2 = pattern2.matcher(PinYin.getPinYin(contact  
  42.                     .getName()));  
  43.             flag = matcher2.find();  
  44.         }  
  45.   
  46.         return flag;  
  47.     }  
/**
	 * 根据拼音搜索
	 * 
	 * @param str
	 *            正则表达式
	 * @param pyName
	 *            拼音
	 * @param isIncludsive
	 *            搜索条件是否大于6个字符
	 * @return
	 */
	public static boolean contains(Contact contact, String search) {
		if (TextUtils.isEmpty(contact.getName()) || TextUtils.isEmpty(search)) {
			return false;
		}

		boolean flag = false;

		// 简拼匹配,如果输入在字符串长度大于6就不按首字母匹配了
		if (search.length() < 6) {
			// String firstLetters = FirstLetterUtil.getFirstLetter(contact
			// .getName());
			// 获得首字母字符串
			String firstLetters = UnicodeGBK2Alpha
					.getSimpleCharsOfString(contact.getName());
			// String firstLetters =
			// PinYinUtil.getFirstSpell(contact.getName());
			// 不区分大小写
			Pattern firstLetterMatcher = Pattern.compile("^" + search,
					Pattern.CASE_INSENSITIVE);
			flag = firstLetterMatcher.matcher(firstLetters).find();
		}

		if (!flag) { // 如果简拼已经找到了,就不使用全拼了
			// 全拼匹配
			// ChineseSpelling finder = ChineseSpelling.getInstance();
			// finder.setResource(contact.getName());
			// 不区分大小写
			Pattern pattern2 = Pattern
					.compile(search, Pattern.CASE_INSENSITIVE);
			Matcher matcher2 = pattern2.matcher(PinYin.getPinYin(contact
					.getName()));
			flag = matcher2.find();
		}

		return flag;
	}


以上就是搜索模块的实现了,基本上实现中文、号码、全拼、简拼的模糊匹配,网上是很难找到关于通讯录的整体实现,小巫整理出来肯定能让有需要的人轻松很多。其实关于通讯录的实现,这并不是很完美的,肯定不同的项目有不同的需求,刚开始设计肯定很多考虑不全的,关于联系人的搜索完全可以直接到数据库搜索,无论是速度和准确性都有较好的保证。这篇博客只是介绍如何实现搜索功能罢了,关于搜索还涉及到线程同步的问题,如何保证速度和用户体验性,后续博客还会继续介绍。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 功能模块之通讯模块四 的相关文章

  • 由于找不到MSVCR120.dll,无法继续执行代码

    原因 这是因为 MSVCR120 dll 这个dll程序消失了 所以会出现这样的情况 解决方法 下载 MSVCR120 dll 这个dll文件 下载地址 DLL文件下载 在搜索框中输入确实的DLL文件 点击搜索即可 如下图 点击文件名 往下
  • 1.Django安装和项目创建

    Django 框架是用Python语言开发的 所以安装Django 就像安装其他的 Python库一样 执行如下命令即可 pip install django 你可以执行如下命令检查Django是否安装好 并且查看安装的Django版本 p
  • Web自动化测试,怎样断言和形成报告?

    目录 1 自动化断言 1 1断言概念 1 2断言介绍 1 3代码案例 2 自动化报告 2 1HTMLTestRunner 2 1 1HTMLTestRunner 的下载和安装 2 1 2HTMLTestRunner使用 2 2Beautif
  • 图像噪声与图像信噪比(一)

    图像噪声与图像信噪比 一 噪声是指图像密度的随机变动 具体指的是胶片的颗粒或者说数字图像上像素级的变动 这是一个关键的图像质量因素 和图像清晰度一样重要 它和图像的动态范围相关性较强 即一定亮度范围内相机可以提供的优秀的信噪比和反差 因为它
  • 应急响应流程及windows/linux用到的命令

    应急响应流程 1 收集信息 搜集客户信息和中毒信息 备份 2 判断类型 判断是否是安全事件 是何种安全事件 勒索病毒 挖矿 断网 ddos等 3 深入分析 日志分析 进程分析 启动项分析 样本分析 4 清理处置 杀掉恶意进程 删除恶意文件
  • #今日论文推荐# ECCV 2022

    今日论文推荐 ECCV 2022 旷视提出半监督目标检测模型Dense Teacher 取得SOTA性能 这篇论文提出了一个新的半监督目标检测模型 Dense Teacher 推翻了当前流行的用 thresholding 生成 hard p
  • virtualBox桥接模式下openEuler镜像修改IP地址、openEule修改IP地址、openEule设置IP地址

    安装好openEuler后 设置远程登入前 必不可少的一步 主机与虚拟机之间的通信要解决 下面给出详细步骤 第一步 检查虚拟机适配器模式 桥接模式 第二步 登入虚拟机修改IP cd etc sysconfig network scripts
  • C++11的半同步半异步线程池

    C 11的半同步半异步线程池 简介 同步队列 Take函数 Add函数 Stop函数 SyncQueue完整代码 线程池 主函数测试 简介 半同步半异步线程池用的比较多 实现也比较简单 其中同步层包括同步服务层和排队层 指的是将接收的任务排
  • TIM_SetCompare1()函数没起作用

    最近使用stm32f103c8t6做控制器 需要实时调整PWM的占空比 由于TIM SetComparex 是常用的修改PWM占空比的函数 现象 在主函数里面调用TIM SetComparex 函数 但是有时候该函数起作用 有时候该函数不起
  • 用户画像及项目实例:电商用户画像

    用户画像及项目实例 所谓用户画像就是标签的汇总 从用户不同方面信息中提取有价值特征来构建标签库 并从标签库中探索信息 从而构建用户画像 用户画像建模 第一步 统一用户唯一标识 用户唯一标识是整个用户画像的核心 方便跟踪和分析一个用户的特征
  • 【C语言】数据结构的基本概念与评价算法的指标

    1 数据结构的基本概念 1 1 基本概念和术语 1 1 1 数据 数据是信息的载体 是描述客观事物属性的数 字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合 数据是计算机程序加工的原料 1 1 2 数据元素 数据元素是数据的基
  • 防御第五次作业

    一 结合以下问题对当天内容进行总结 1 什么是恶意软件 可以指代病毒 蠕虫 特洛伊木马 勒索软件 间谍软件 广告软件和其他类型的有害软件 恶意软件的主要区别在于它必须是故意为恶 任何无意间造成损害的软件均不视为恶意软件 恶意软件的总体目标是
  • 【vue3+ts】TypeError: Cannot read properties of undefined (reading ‘commit‘)

    项目场景
  • oracle 给表或字段添加备注语法

    comment on column TableName ColumnName is 备注名 comment on table TableName is 备注名
  • 一些写得非常不错的C++网络编程库

    如果你对网络编程有兴趣的话 可以从以下内容来学习 想写好程序最基本的方法就是多看 等看明白了 多写 这样自然就成为所谓的高手 不过CPL认为更贴切的应该叫熟练手吧 转载 http www crystalclearsoftware com c
  • 计算机本科生毕业设计题目(三)

    资源下载 计算机本科生毕业设计题目 资源下载 计算机论文题目精选50篇 文章目录 一 安卓 二 java 三 ASP NET C 题目 毕设通用50篇 一 安卓 安卓 001 个人事务管理系统 安卓 002 手机订餐系统 安卓 003 无线

随机推荐

  • 【Redis入门笔记 07】数据库持久化

    目录 持久化是个啥 持久化策略 RDB 持久化策略 AOF 持久化是个啥 我们都知道电脑中的内存一般指的是 DRAM 属于易失性存储器 里面的电容是会漏电的 需要通电来定期刷新 当断电以后内存中的数据会慢慢消失 以速度著称的 redis 就
  • 宋浩概率论与数理统计-第三章-笔记

    概率论与数理统计 第三章 3 1 1 二维随机变量及其分布函数 联合分布 边缘分布 3 1 2 二维离散型的联合分布和边缘分布 3 1 3 二维连续型的联合分布和边缘分布 联合分布 边缘分布 3 2 1 条件分布 3 2 2 离散型的条件分
  • 创建qml自定义视频源(Qt6.3.1+取景器帧)

    前言 笔者之前记录的是Qt5 15的 当前Qt6系列无法使用 笔者本次记录下Qt6中 如何创建qml自定义视频源 一 获取视频帧 这个笔者在之前的文档中记录过 本次算是重复了 1 通过videoSink获取 关键代码如下 Camera id
  • 2、kettle知识点系列之kettle向redis同步数据

    kettle向redis同步数据 网上kettle向redis同步数据的完整案例不是很多 本文将以案例形式对整个过程进行详细讲解 一 案例描述 本文以最简单的案例描述 大家在应用过程中可根据实际情况进行调整 现有学生表和成绩表 如何将表中的
  • 转:基于Spark的电影推荐系统(包含爬虫项目、web网站、后台管理系统以及spark推荐系统)

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net u011254180 article details 80006453 本次项目是基于
  • 算法作业(4):旅行者问题

  • 华为官方翻新产品秒杀活动来袭,官方正品,7折优惠,真香!

    4月24日 华为商城 微博官宣 4月26日12 00和20 00在华为商城APP内将举办两场超级秒杀节活动 其中包括7折优惠的2款华为官方翻新手机 分别是nova 9和nova 9 Pro 华为官方翻新nova 9手机秒杀直降660元 15
  • 前端实现语音播放

    0 Web Speech API Web Speech API 使您能够将语音数据合并到 Web 应用程序中 Web Speech API 有两个部分 SpeechSynthesis 语音合成 文本到语音 TTS 和 SpeechRecog
  • IC 的资源体系

    信息共享空间是集信息资源 各类软硬件设施于一体的一个综合性动态服务模 式 其最大特点是资源共享 因此 要加强电脑终端 打印机等硬件设施的建设 同时强调文献数据库 电子图书 学位论文 各类免费软件等信息资源的建设 提 供知识导航 跨库检索 开
  • SysTick定时器

    SysTick定时器 SysTick定时器也叫SysTick滴答定时器 它是Cortex M3内核的一个外设 它是一个24 位向下递减的定时器 每计数一次所需时间为1 SYSTICK SYSTICK是系统定时器时钟 它可以直接取自系统时钟
  • 【概念梳理】激活函数

    一 引言 常用的激活函数如下 1 Sigmoid函数 2 Tanh函数 3 ReLU函数 4 ELU函数 5 PReLU函数 6 Leaky ReLU函数 7 Maxout函数 8 Mish函数 二 激活函数的定义 多层神经网络中 上层节点
  • CoordinatorLayout的使用-Androidx

    折叠效果实现核心 CoordinatorLayout AppBarLayout CollapsingToolbarLayout 1 build gradle dependencies implementation com google an
  • Elasticsearch7.7 基础教程 1

    Elasticsearch7 7 基础教程 1 以下简称es7 7 es7 7的安装 1 官网下载 https www elastic co cn downloads elasticsearch 2 解压文件 3 在安装文件夹下的bin目录
  • Ajax session一直变,ajax异步session值不唯一 总是改变 解决办法

    public void doFilter ServletRequest servletRequest ServletResponse servletResponse FilterChain filterChain throws IOExce
  • 获取硬件信息的delphi源码(CPUID、操作系统、Mac物理地址、计算机名称、IP地址、用户名)

    转载请保留本文链接地址 http blog csdn net sushengmiyan article details 8545673 作者 sushengmiyan 2013 01 26 备注 功能 硬件信息获取单元 unit Appli
  • 使用nginx做为http-flv服务如何解决跨域问题

    什么是跨域 跨域是指浏览器的同源策略限制 这个策略会阻止一个域的javascript脚本和另外一个域的内容进行交互 如果一个请求url的协议 域名 端口三者之间任意一个与当前页面的url不同即为跨域 如下图所示即为跨域时的报错 使用ngin
  • idea git操作

    图片有的 是idea界面 有的是Android studio界面 当成字典看 不用记 你知道自己想操作仓库时 知道自己曾写过这篇文章就行 目录 引入git别的仓库的其它模块 创建 Git 分支并且 Push 删除分支 删除分支的文件 And
  • eclipse IDE的安装和常用配置教程(详细)

    eclipse IDE的安装和常用配置 第一步 安装配置JDK 打开eclipse需要先安装和配置好JDK 所以需要提前配置JDK 教程链接如下 https blog csdn net weixin 46028577 article det
  • HDFS简单测试

    使用Hadoop的Java客户端API操作分布式文件系统 获取文件系统实现 hdfs master01 9000 FileSystem get URI uri Configuration conf String user fs defaul
  • android 功能模块之通讯模块四

    Android通讯录开发之通讯录联系人搜索功能最新实现 2014年1月13日 之前的有两篇博客介绍了如何解决通讯录搜索功能的问题 那些方法都是从网上搜集 然后经过自己整理试验之后的 但在项目测试人员给我反馈 似乎还是存在一些问题 比如一些简