漢字轉(zhuǎn)拼音HanziToPinyin

輸出格式選項(xiàng)的組合

在pinyin4j中定義了三種類型的輸出格式選項(xiàng):

  • VCharType: 拼音字符 'ü' 的文本輸出格式,有三種選項(xiàng):
選項(xiàng) 描述
WITH_U_AND_COLON 使用 u: 的方式來表示碘橘,默認(rèn)方式
WITH_V 使用 v 的方式來表示
WITH_U_UNICODE 使用 ü 的方式來表示
  • ToneType: 中文拼音聲調(diào)的輸出格式火惊,有三種選項(xiàng):
選項(xiàng) 描述
WITH_TONE_NUMBER 使用數(shù)字標(biāo)識拼音聲調(diào) (ma3) 的方式,默認(rèn)方式
WITHOUT_TONE 不使用拼音聲調(diào) (ma)
WITH_TONE_MARK 使用調(diào)號來標(biāo)識拼音聲調(diào) (mǎ) 的方式
  • CaseType: 輸出字符串中的字母的操作撞叽,有兩種選項(xiàng):
選項(xiàng) 描述
LOWERCASE 將字母全部轉(zhuǎn)成小寫,默認(rèn)方式
UPPERCASE 將字母全部轉(zhuǎn)成大寫

這里三種輸出格式的一些組合是被禁用的。例如楔绞,'呂':

|LOWERCASE|
|----|----|----|----|
|Combination|WITH_U_AND_COLON|WITH_V|WITH_U_UNICODE|
|WITH_TONE_NUMBER|lu:3|lv3|lü3|
|WITHOUT_TONE|lu:|lv|lü|
|WITH_TONE_MARK|Exception|Exception|lǚ|

|UPPERCASE|
|----|----|----|----|
|Combination|WITH_U_AND_COLON|WITH_V|WITH_U_UNICODE|
|WITH_TONE_NUMBER|LU:3|LV3|Lü3|
|WITHOUT_TONE|LU:|LV|Lü|
|WITH_TONE_MARK|Exception|Exception|Lǚ|

Numerals in place of tone marks (聲調(diào)號的數(shù)字表示)

Tone Tone Mark Number added to end of syllable in place of tone mark Example using tone mark Example using number
First macron (ˉ) 1 ma1
Second acute accent (′) 2 ma2
Third caron (ˇ) 3 ma3
Fourth grave accent (`) 4 ma4

Links:

Combination of output format options
Unicode? character table
Pinyin
pinyin4j


pinyin4j庫的使用

  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="10dp"
    tools:context="com.shellever.hanzitopinyin.MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="No Information"
        android:textAllCaps="false"
        android:textSize="18sp"
        android:id="@+id/tv_pinyin" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Input Hanzi here"
        android:id="@+id/et_hanzi" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="HanziToPinyin"
        android:textAllCaps="false"
        android:id="@+id/btn_convert" />
</LinearLayout>
  • MainActivity.java
public class MainActivity extends AppCompatActivity {

    private TextView tv_pinyin;
    private EditText et_hanzi;
    private Button btn_convert;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_pinyin = (TextView) findViewById(R.id.tv_pinyin);
        et_hanzi = (EditText) findViewById(R.id.et_hanzi);
        btn_convert = (Button) findViewById(R.id.btn_convert);

        btn_convert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String hanzi = et_hanzi.getText().toString();
                if (TextUtils.isEmpty(hanzi)) {
                    Toast.makeText(MainActivity.this, "No hanzi, please input again.", Toast.LENGTH_SHORT).show();
                } else {
                    StringBuilder builder = new StringBuilder();
                    builder.append(hanzi);
                    builder.append("\n=>\n");
                    // 拼音字母全部小寫,沒有分隔符
                    builder.append(PinyinUtils.toPinyinString(hanzi));
                    builder.append("\n=>\n");
                    // 拼音首字母大寫
                    builder.append(PinyinUtils.toPinyinString(hanzi, PinyinUtils.CASE_CAPITALIZE));
                    builder.append("\n=>\n");
                    // 拼音取首字母且大寫唇兑,從左到右
                    builder.append(PinyinUtils.toPinyinString(hanzi,
                            PinyinUtils.CASE_UPPERCASE | PinyinUtils.LETTER_FIRST));
                    builder.append("\n=>\n");
                    // 拼音取首字母且大寫酒朵,從右到左,連字符分隔
                    builder.append(PinyinUtils.toPinyinString(hanzi,
                            PinyinUtils.CASE_UPPERCASE
                                    | PinyinUtils.LETTER_FIRST_INV
                                    | PinyinUtils.SEPARATOR_HYPHEN));
                    builder.append("\n=>\n");
                    // 拼音取尾字母且大寫扎附,從右到左
                    builder.append(PinyinUtils.toPinyinString(hanzi,
                            PinyinUtils.CASE_UPPERCASE | PinyinUtils.LETTER_LAST_INV));
                    builder.append("\n=>\n");
                    // 拼音首字母大寫且空格分開
                    builder.append(PinyinUtils.toPinyinString(hanzi,
                            PinyinUtils.CASE_CAPITALIZE | PinyinUtils.SEPARATOR_BLANK));
                    builder.append("\n=>\n");
                    // 拼音首字母大寫且英文句號分開
                    builder.append(PinyinUtils.toPinyinString(hanzi,
                            PinyinUtils.CASE_CAPITALIZE | PinyinUtils.SEPARATOR_POINT));
                    tv_pinyin.setText(builder.toString());
                    et_hanzi.setText("");
                }
            }
        });
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 點(diǎn)擊空白區(qū)域 自動(dòng)隱藏軟鍵盤
        if(this.getCurrentFocus() != null){
            InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
            return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);
        }
        return super.onTouchEvent(event);
    }
}
  • PinyinUtils.java

PinyinUtils類中提供了五組可以配置的操作模式用于返回特定格式的字符串蔫耽,不同組之間的選項(xiàng)可以使用邏輯運(yùn)算或運(yùn)算 | 進(jìn)行組合以達(dá)到想要的格式。
**注: ** 組內(nèi)選項(xiàng)之間是有優(yōu)先級的留夜,數(shù)值越小優(yōu)先級越高匙铡,當(dāng)使用了一組內(nèi)的多個(gè)選項(xiàng),只有優(yōu)先級高的選項(xiàng)才會生效碍粥。

配置使用例子:

// 和道一文字 => hedaoyiwenzi        // NONE
// 和道一文字 => HDYWZ               // CASE_UPPERCASE | LETTER_FIRST     or CASE_CAPITALIZE | LETTER_FIRST
// 和道一文字 => ZWYDH               // CASE_UPPERCASE | LETTER_FIRST_INV or CASE_CAPITALIZE | LETTER_FIRST_INV
// 和道一文字 => HeDaoYiWenZi        // CASE_CAPITALIZE
// 和道一文字 => He Dao Yi Wen Zi    // CASE_CAPITALIZE | SEPARATOR_BLANK

PinyinUtils源碼如下:

/**
 * Author: Shellever
 * Date:   11/7/2016
 * Email:  shellever@163.com
 */
public class PinyinUtils {

    // 組 0
    public static final int NONE = 0x0000;                // 全部小寫字母鳖眼,沒有分隔符
    // 組 1
    public static final int CASE_CAPITALIZE = 0x0001;     // 拼音首字母大寫
    public static final int CASE_UPPERCASE = 0x0002;      // 全部大寫字母
    // 組 2
    public static final int LETTER_FIRST = 0x0004;        // 獲取拼音首字母,方向?yàn)閺淖蟮接?    public static final int LETTER_FIRST_INV = 0x0008;    // 獲取拼音首字母嚼摩,方向?yàn)閺挠业阶?    public static final int LETTER_LAST = 0x0010;         // 獲取拼音尾字母钦讳,方向?yàn)閺淖蟮接?    public static final int LETTER_LAST_INV = 0x0020;     // 獲取拼音尾字母矿瘦,方向?yàn)閺挠业阶?    // 組 3
    public static final int TRIM_NON_CHAR = 0x0040;       // 去掉非字符
    // 組 4 (可以根據(jù)規(guī)則進(jìn)行擴(kuò)展)
    public static final int SEPARATOR_BLANK = 0x0080;     // 分隔符:空格
    public static final int SEPARATOR_POINT = 0x0100;     // 分隔符:英文句號
    public static final int SEPARATOR_HYPHEN = 0x0200;    // 分隔符:連字符


    // 默認(rèn):全部小寫字母,沒有分隔符
    public static String toPinyinString(String hanzi) {
        return toPinyinString(hanzi, NONE);
    }

    public static String toPinyinString(String hanzi, int mode) {
        StringBuilder builder = new StringBuilder();
        if (hanzi != null) {
            int length = hanzi.length();                // 長度
            String tmp;
            for (int i = 0; i < length; i++) {
                char hanziChar = hanzi.charAt(i);       // 獲取指定索引號的字符
                if (checkHanziChar(hanziChar)) {
                    tmp = toPinyinChar(hanziChar);      // 全部小寫
                    if ((mode & CASE_CAPITALIZE) != NONE) {
                        tmp = capitalize(tmp);          // 首字母大寫 (高優(yōu)先級)
                    } else if ((mode & CASE_UPPERCASE) != NONE) {
                        tmp = tmp.toUpperCase();        // 全部大寫
                    }

                    if ((mode & LETTER_FIRST) != NONE || (mode & LETTER_FIRST_INV) != NONE) {
                        tmp = tmp.substring(0, 1);              // 拼音首字母 (高優(yōu)先級)
                    } else if ((mode & LETTER_LAST) != NONE || (mode & LETTER_LAST_INV) != NONE) {
                        tmp = tmp.substring(tmp.length() - 1);  // 拼音尾字母
                    }
                } else {
                    tmp = Character.toString(hanziChar);
                    if ((mode & TRIM_NON_CHAR) != NONE) {
                        tmp = "";           // 去掉非字符
                    }
                }

                String separator = "";      // 默認(rèn)不加分隔符
                if ((mode & SEPARATOR_BLANK) != NONE) {
                    separator = " ";        // 加入空格分隔符 (高優(yōu)先級)
                } else if ((mode & SEPARATOR_POINT) != NONE) {
                    separator = ".";        // 加入英文句號分隔符
                } else if ((mode & SEPARATOR_HYPHEN) != NONE) {
                    separator = "-";        // 加入連字符分隔符
                }

                if (i >= length - 1) {      // 跳過最后一個(gè)漢字拼音的分隔符
                    separator = "";
                }

                // add the string to builder now
                if ((mode & LETTER_FIRST_INV) != NONE || (mode & LETTER_LAST_INV) != NONE) { // RTL
                    builder.insert(0, tmp);         // 1. 將tmp插入到頭部缚去,實(shí)現(xiàn)從右到左的方向
                    builder.insert(0, separator);   // 2. 將分隔符插入到頭部
                } else {    // LTR - LeftToRight
                    builder.append(tmp);            // 1. 將tmp追加到尾部,實(shí)現(xiàn)從左到右的方向
                    builder.append(separator);      // 2. 將分隔符追加到尾部
                }
            }   // for (int i = 0; i < length; i++)
        }   // if (hanzi != null)
        return builder.toString();
    }

    public static String toPinyinChar(char hanziChar) {
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        format.setCaseType(HanyuPinyinCaseType.LOWERCASE);      // 全部小寫
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);   // 沒有聲調(diào)
        format.setVCharType(HanyuPinyinVCharType.WITH_V);       // 使用v
        return toPinyinChar(hanziChar, format);
    }

    public static String toPinyinChar(char hanziChar, HanyuPinyinOutputFormat format) {
        String[] result = null;
        try {
            // 非漢字字符放回null
            result = PinyinHelper.toHanyuPinyinStringArray(hanziChar, format);
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            e.printStackTrace();
        }
        return result != null ? result[0] : "";
    }

    // 檢查輸入字符是否匹配到unicode中的漢字區(qū)間內(nèi)
    public static boolean checkHanziChar(char hanziChar) {
        return Character.toString(hanziChar).matches("[\\u4E00-\\u9FA5]+");
    }

    public static String capitalize(String s) {
        return s.substring(0, 1).toUpperCase() + s.substring(1);
    }
}
  • 效果演示
hanzitopinyin.png

源碼參考

HanziToPinyin

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末琼开,一起剝皮案震驚了整個(gè)濱河市易结,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柜候,老刑警劉巖搞动,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異改橘,居然都是意外死亡滋尉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門飞主,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狮惜,“玉大人,你說我怎么就攤上這事碌识∧氪郏” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵筏餐,是天一觀的道長开泽。 經(jīng)常有香客問我,道長魁瞪,這世上最難降的妖魔是什么穆律? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮导俘,結(jié)果婚禮上峦耘,老公的妹妹穿的比我還像新娘。我一直安慰自己旅薄,他們只是感情好辅髓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著少梁,像睡著了一般洛口。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凯沪,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天第焰,我揣著相機(jī)與錄音,去河邊找鬼妨马。 笑死挺举,一個(gè)胖子當(dāng)著我的面吹牛而叼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豹悬,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼液荸!你這毒婦竟也來了瞻佛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤娇钱,失蹤者是張志新(化名)和其女友劉穎伤柄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體文搂,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡适刀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了煤蹭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笔喉。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖硝皂,靈堂內(nèi)的尸體忽然破棺而出常挚,到底是詐尸還是另有隱情,我是刑警寧澤稽物,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布奄毡,位于F島的核電站,受9級特大地震影響贝或,放射性物質(zhì)發(fā)生泄漏吼过。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望囱挑。 院中可真熱鬧展箱,春花似錦、人聲如沸售淡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揖闸。三九已至,卻和暖如春料身,著一層夾襖步出監(jiān)牢的瞬間汤纸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工芹血, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贮泞,地道東北人楞慈。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像啃擦,于是被迫代替她去往敵國和親囊蓝。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理令蛉,服務(wù)發(fā)現(xiàn)聚霜,斷路器,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,926評論 6 13
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,146評論 2 34
  • Ubuntu的發(fā)音 Ubuntu姥芥,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音汇鞭。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,201評論 9 467
  • 一句話服務(wù)器python -m http.server 8080保存為bat文件 使用dir()如果要獲得一個(gè)對象...
    wyude閱讀 241評論 0 0