获得汉字拼音的首字母

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
  <EditText
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:id="@+id/edit"
   android:hint="输入汉字"
   ></EditText>
   <Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/button"
    android:text="@string/button"
    ></Button>
    <TextView
     android:id="@+id/textView"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     ></TextView>
</LinearLayout>

Activity:

package com.hanzi;
import java.io.UnsupportedEncodingException;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class hanzi extends Activity {
	static final int GB_SP_DIFF=160;
	// 存放国标一级汉字不同读音的起始区位码 
    static final int[] secPosValueList = { 1601, 1637, 1833, 2078, 2274, 2302, 2433, 2594, 2787, 3106, 3212, 
    	3472, 3635, 3722, 3730, 3858, 4027, 4086, 4390, 4558, 4684, 4925, 
        5249, 5600 }; 
    // 存放国标一级汉字不同读音的起始区位码对应读音 
    static final char[] firstLetter = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'w', 'x', 'y', 'z' }; 
	private EditText edit;
	private TextView text;
	private Button button;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        edit = (EditText)this.findViewById(R.id.edit);
        text = (TextView)this.findViewById(R.id.textView);
        button = (Button)this.findViewById(R.id.button);
        button.setOnClickListener(buttonListener);
        text.setText("拼音");
        edit.addTextChangedListener(new TextWatcher() {
			
			public void onTextChanged(CharSequence s, int start, int before, int count) {
				// TODO Auto-generated method stub
				String characters = s.toString();
				String spells = getSpells(characters);
				text.setText(spells);
			}
			
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
				// TODO Auto-generated method stub
				
			}
			
			public void afterTextChanged(Editable s) {
				// TODO Auto-generated method stub
				
			}
		});
    }
    private View.OnClickListener buttonListener = new View.OnClickListener() {
		
		public void onClick(View v) {
			// TODO Auto-generated method stub
			if(v==button){
				String characters = edit.getText().toString();
				String spells = getSpells(characters);
				text.setText(spells);
			}
		}
	};
	
    public static String getSpells(String characters){
    	StringBuffer buffer = new StringBuffer();
    	for(int i=0;i<characters.length();i++){
    		
    		char ch = characters.charAt(i);
    		if((ch>>7)==0){
    			//判断是否为汉字,如果左移7为为0就不是汉字,否则是汉字
    		}else{
    			char spell = getFirstLetter(ch);
    			buffer.append(String.valueOf(spell));
    		}
    	}
		return buffer.toString();
    }
    // 获取一个汉字的首字母 
    public static Character getFirstLetter(char ch) { 
         
        byte[] uniCode = null; 
        try { 
            uniCode = String.valueOf(ch).getBytes("GBK"); 
        } catch (UnsupportedEncodingException e) { 
            e.printStackTrace(); 
            return null; 
        } 
        if (uniCode[0] < 128 && uniCode[0] > 0) { // 非汉字 
            return null; 
        } else { 
            return convert(uniCode); 
        } 
    } 
    /**
     * 获取一个汉字的拼音首字母。 GB码两个字节分别减去160,转换成10进制码组合就可以得到区位码
     * 例如汉字“你”的GB码是0xC4/0xE3,分别减去0xA0(160)就是0x24/0x43
     * 0x24转成10进制就是36,0x43是67,那么它的区位码就是3667,在对照表中读音为‘n’
     */ 
    static char convert(byte[] bytes) { 
        char result = '-'; 
        int secPosValue = 0; 
        int i; 
        for (i = 0; i < bytes.length; i++) { 
            bytes[i] -= GB_SP_DIFF; 
        } 
        secPosValue = bytes[0] * 100 + bytes[1]; 
        for (i = 0; i < secPosValueList.length; i++) { 
            if (secPosValue >= secPosValueList[i] && secPosValue < secPosValueList[i + 1]) { 
                result = firstLetter[i]; 
                break; 
            } 
        } 
        return result; 
    } 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值