android 功能模块之通讯模块四

阿里 阅读:534 2021-04-01 00:24:36 评论:0

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; 
	}


以上就是搜索模块的实现了,基本上实现中文、号码、全拼、简拼的模糊匹配,网上是很难找到关于通讯录的整体实现,小巫整理出来肯定能让有需要的人轻松很多。其实关于通讯录的实现,这并不是很完美的,肯定不同的项目有不同的需求,刚开始设计肯定很多考虑不全的,关于联系人的搜索完全可以直接到数据库搜索,无论是速度和准确性都有较好的保证。这篇博客只是介绍如何实现搜索功能罢了,关于搜索还涉及到线程同步的问题,如何保证速度和用户体验性,后续博客还会继续介绍。
标签:Android
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号