輸出格式選項(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 | mā | ma1 |
Second | acute accent (′) | 2 | má | ma2 |
Third | caron (ˇ) | 3 | mǎ | ma3 |
Fourth | grave accent (`) | 4 | mà | 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);
}
}
- 效果演示