diff --git a/README.md b/README.md index 8599b1c..aaf5abd 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,8 @@ lpinyin是一个汉字转拼音的Dart Package. 主要参考Java开源类库[jpi ③支持多种拼音输出格式:带音标、不带音标、数字表示音标以及拼音首字母输出格式 ④支持常见多音字的识别,其中包括词组、成语、地名等 ⑤简繁体中文转换 -⑥支持添加用户自定义字典 +⑥支持添加用户自定义字典 +⑦支持漢字轉注音 參考自[python-zhuyin](https://github.com/rku1999/python-zhuyin) ## Pub diff --git a/example/lib/main.dart b/example/lib/main.dart index 01bbf35..2816165 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,5 +1,4 @@ import 'package:lpinyin/lpinyin.dart'; -import 'package:lpinyin/src/chinese_helper.dart'; void main() { String str = "天府广场"; @@ -12,7 +11,7 @@ void main() { String pinyin1 = PinyinHelper.getPinyin(str); //tian fu guang chang String pinyin2 = PinyinHelper.getPinyin(str, - separator: " ", format: PinyinFormat.WITHOUT_TONE); + separator: "-", format: PinyinFormat.WITHOUT_TONE); PinyinHelper.getPinyinE(str); //tian fu guang chang PinyinHelper.getPinyinE(str, @@ -23,6 +22,12 @@ void main() { print("pinyin1: " + pinyin1); print("pinyin2: " + pinyin2); + String zhuyin1 = ZhuyinHelper.getZhuyin(str); + String zhuyin2 = ZhuyinHelper.getZhuyin(str,separator: "-",format: PinyinFormat.WITH_TONE_NUMBER); + + print("zhuyin1: " + zhuyin1); + print("zhuyin2: " + zhuyin2); + String name = "😃"; String pinyin = PinyinHelper.getPinyin(name, separator: ''); print( diff --git a/lib/lpinyin.dart b/lib/lpinyin.dart index c3acb6f..ce28b6b 100644 --- a/lib/lpinyin.dart +++ b/lib/lpinyin.dart @@ -6,3 +6,5 @@ export 'src/pinyin_helper.dart'; export 'src/pinyin_exception.dart'; export 'src/pinyin_resource.dart'; export 'src/chinese_helper.dart'; +export 'src/zhuyin_helper.dart'; +export 'src/zhuyin_resource.dart'; \ No newline at end of file diff --git a/lib/src/dict_data.dart b/lib/src/dict_data.dart index 1a07a50..7fb62d0 100644 --- a/lib/src/dict_data.dart +++ b/lib/src/dict_data.dart @@ -24267,3 +24267,421 @@ const List multiPinyinDict = [ '强迫=qiǎng,pò', '削铅笔=xiāo,qiān,bǐ' ]; + +const Map pinyinToZhuyinDict = { + "a": "ㄚ", + "ai": "ㄞ", + "an": "ㄢ", + "ang": "ㄤ", + "ao": "ㄠ", + "ba": "ㄅㄚ", + "bai": "ㄅㄞ", + "ban": "ㄅㄢ", + "bang": "ㄅㄤ", + "bao": "ㄅㄠ", + "bei": "ㄅㄟ", + "ben": "ㄅㄣ", + "beng": "ㄅㄥ", + "bi": "ㄅㄧ", + "bian": "ㄅㄧㄢ", + "biao": "ㄅㄧㄠ", + "bie": "ㄅㄧㄝ", + "bin": "ㄅㄧㄣ", + "bing": "ㄅㄧㄥ", + "bo": "ㄅㄛ", + "bu": "ㄅㄨ", + "ca": "ㄘㄚ", + "cai": "ㄘㄞ", + "can": "ㄘㄢ", + "cang": "ㄘㄤ", + "cao": "ㄘㄠ", + "ce": "ㄘㄜ", + "cen": "ㄘㄣ", + "ceng": "ㄘㄥ", + "cha": "ㄔㄚ", + "chai": "ㄔㄞ", + "chan": "ㄔㄢ", + "chang": "ㄔㄤ", + "chao": "ㄔㄠ", + "che": "ㄔㄜ", + "chen": "ㄔㄣ", + "cheng": "ㄔㄥ", + "chi": "ㄔ", + "chong": "ㄔㄨㄥ", + "chou": "ㄔㄡ", + "chu": "ㄔㄨ", + "chua": "ㄔㄨㄚ", + "chuai": "ㄔㄨㄞ", + "chuan": "ㄔㄨㄢ", + "chuang": "ㄔㄨㄤ", + "chui": "ㄔㄨㄟ", + "chun": "ㄔㄨㄣ", + "chuo": "ㄔㄨㄛ", + "ci": "ㄘ", + "cong": "ㄘㄨㄥ", + "cou": "ㄘㄡ", + "cu": "ㄘㄨ", + "cuan": "ㄘㄨㄢ", + "cui": "ㄘㄨㄟ", + "cun": "ㄘㄨㄣ", + "cuo": "ㄘㄨㄛ", + "da": "ㄉㄚ", + "dai": "ㄉㄞ", + "dan": "ㄉㄢ", + "dang": "ㄉㄤ", + "dao": "ㄉㄠ", + "de": "ㄉㄜ", + "dei": "ㄉㄟ", + "den": "ㄉㄣ", + "deng": "ㄉㄥ", + "di": "ㄉㄧ", + "dia": "ㄉㄧㄚ", + "dian": "ㄉㄧㄢ", + "diao": "ㄉㄧㄠ", + "die": "ㄉㄧㄝ", + "ding": "ㄉㄧㄥ", + "diu": "ㄉㄧㄡ", + "dong": "ㄉㄨㄥ", + "dou": "ㄉㄡ", + "du": "ㄉㄨ", + "duan": "ㄉㄨㄢ", + "dui": "ㄉㄨㄟ", + "dun": "ㄉㄨㄣ", + "duo": "ㄉㄨㄛ", + "e": "ㄜ", + "ei": "ㄟ", + "en": "ㄣ", + "eng": "ㄥ", + "er": "ㄦ", + "fa": "ㄈㄚ", + "fan": "ㄈㄢ", + "fang": "ㄈㄤ", + "fei": "ㄈㄟ", + "fen": "ㄈㄣ", + "feng": "ㄈㄥ", + "fo": "ㄈㄛ", + "fou": "ㄈㄡ", + "fu": "ㄈㄨ", + "ga": "ㄍㄚ", + "gai": "ㄍㄞ", + "gan": "ㄍㄢ", + "gang": "ㄍㄤ", + "gao": "ㄍㄠ", + "ge": "ㄍㄜ", + "gei": "ㄍㄟ", + "gen": "ㄍㄣ", + "geng": "ㄍㄥ", + "gong": "ㄍㄨㄥ", + "gou": "ㄍㄡ", + "gu": "ㄍㄨ", + "gua": "ㄍㄨㄚ", + "guai": "ㄍㄨㄞ", + "guan": "ㄍㄨㄢ", + "guang": "ㄍㄨㄤ", + "gui": "ㄍㄨㄟ", + "gun": "ㄍㄨㄣ", + "guo": "ㄍㄨㄛ", + "ha": "ㄏㄚ", + "hai": "ㄏㄞ", + "han": "ㄏㄢ", + "hang": "ㄏㄤ", + "hao": "ㄏㄠ", + "he": "ㄏㄜ", + "hei": "ㄏㄟ", + "hen": "ㄏㄣ", + "heng": "ㄏㄥ", + "hong": "ㄏㄨㄥ", + "hou": "ㄏㄡ", + "hu": "ㄏㄨ", + "hua": "ㄏㄨㄚ", + "huai": "ㄏㄨㄞ", + "huan": "ㄏㄨㄢ", + "huang": "ㄏㄨㄤ", + "hui": "ㄏㄨㄟ", + "hun": "ㄏㄨㄣ", + "huo": "ㄏㄨㄛ", + "ji": "ㄐㄧ", + "jia": "ㄐㄧㄚ", + "jian": "ㄐㄧㄢ", + "jiang": "ㄐㄧㄤ", + "jiao": "ㄐㄧㄠ", + "jie": "ㄐㄧㄝ", + "jin": "ㄐㄧㄣ", + "jing": "ㄐㄧㄥ", + "jiong": "ㄐㄩㄥ", + "jiu": "ㄐㄧㄡ", + "ju": "ㄐㄩ", + "juan": "ㄐㄩㄢ", + "jue": "ㄐㄩㄝ", + "jun": "ㄐㄩㄣ", + "ka": "ㄎㄚ", + "kai": "ㄎㄞ", + "kan": "ㄎㄢ", + "kang": "ㄎㄤ", + "kao": "ㄎㄠ", + "ke": "ㄎㄜ", + "ken": "ㄎㄣ", + "keng": "ㄎㄥ", + "kong": "ㄎㄨㄥ", + "kou": "ㄎㄡ", + "ku": "ㄎㄨ", + "kua": "ㄎㄨㄚ", + "kuai": "ㄎㄨㄞ", + "kuan": "ㄎㄨㄢ", + "kuang": "ㄎㄨㄤ", + "kui": "ㄎㄨㄟ", + "kun": "ㄎㄨㄣ", + "kuo": "ㄎㄨㄛ", + "la": "ㄌㄚ", + "lai": "ㄌㄞ", + "lan": "ㄌㄢ", + "lang": "ㄌㄤ", + "lao": "ㄌㄠ", + "le": "ㄌㄜ", + "lei": "ㄌㄟ", + "leng": "ㄌㄥ", + "li": "ㄌㄧ", + "lia": "ㄌㄧㄚ", + "lian": "ㄌㄧㄢ", + "liang": "ㄌㄧㄤ", + "liao": "ㄌㄧㄠ", + "lie": "ㄌㄧㄝ", + "lin": "ㄌㄧㄣ", + "ling": "ㄌㄧㄥ", + "liu": "ㄌㄧㄡ", + "lo": "ㄌㄛ", + "long": "ㄌㄨㄥ", + "lou": "ㄌㄡ", + "lu": "ㄌㄨ", + "luan": "ㄌㄨㄢ", + "lun": "ㄌㄨㄣ", + "luo": "ㄌㄨㄛ", + "lü": "ㄌㄩ", + "lüan": "ㄌㄩㄢ", + "lüe": "ㄌㄩㄝ", + "ma": "ㄇㄚ", + "mai": "ㄇㄞ", + "man": "ㄇㄢ", + "mang": "ㄇㄤ", + "mao": "ㄇㄠ", + "me": "ㄇㄜ", + "mei": "ㄇㄟ", + "men": "ㄇㄣ", + "meng": "ㄇㄥ", + "mi": "ㄇㄧ", + "mian": "ㄇㄧㄢ", + "miao": "ㄇㄧㄠ", + "mie": "ㄇㄧㄝ", + "min": "ㄇㄧㄣ", + "ming": "ㄇㄧㄥ", + "miu": "ㄇㄧㄡ", + "mo": "ㄇㄛ", + "mou": "ㄇㄡ", + "mu": "ㄇㄨ", + "na": "ㄋㄚ", + "nai": "ㄋㄞ", + "nan": "ㄋㄢ", + "nang": "ㄋㄤ", + "nao": "ㄋㄠ", + "ne": "ㄋㄜ", + "nei": "ㄋㄟ", + "nen": "ㄋㄣ", + "neng": "ㄋㄥ", + "ni": "ㄋㄧ", + "nian": "ㄋㄧㄢ", + "niang": "ㄋㄧㄤ", + "niao": "ㄋㄧㄠ", + "nie": "ㄋㄧㄝ", + "nin": "ㄋㄧㄣ", + "ning": "ㄋㄧㄥ", + "niu": "ㄋㄧㄡ", + "nong": "ㄋㄨㄥ", + "nou": "ㄋㄡ", + "nu": "ㄋㄨ", + "nuan": "ㄋㄨㄢ", + "nun": "ㄋㄨㄣ", + "nuo": "ㄋㄨㄛ", + "nü": "ㄋㄩ", + "nüe": "ㄋㄩㄝ", + "o": "ㄛ", + "ou": "ㄡ", + "pa": "ㄆㄚ", + "pai": "ㄆㄞ", + "pan": "ㄆㄢ", + "pang": "ㄆㄤ", + "pao": "ㄆㄠ", + "pei": "ㄆㄟ", + "pen": "ㄆㄣ", + "peng": "ㄆㄥ", + "pi": "ㄆㄧ", + "pia": "ㄆㄧㄚ", + "pian": "ㄆㄧㄢ", + "piao": "ㄆㄧㄠ", + "pie": "ㄆㄧㄝ", + "pin": "ㄆㄧㄣ", + "ping": "ㄆㄧㄥ", + "po": "ㄆㄛ", + "pou": "ㄆㄡ", + "pu": "ㄆㄨ", + "q": "ㄑ", + "qi": "ㄑㄧ", + "qia": "ㄑㄧㄚ", + "qian": "ㄑㄧㄢ", + "qiang": "ㄑㄧㄤ", + "qiao": "ㄑㄧㄠ", + "qie": "ㄑㄧㄝ", + "qin": "ㄑㄧㄣ", + "qing": "ㄑㄧㄥ", + "qiong": "ㄑㄩㄥ", + "qiu": "ㄑㄧㄡ", + "qu": "ㄑㄩ", + "quan": "ㄑㄩㄢ", + "que": "ㄑㄩㄝ", + "qun": "ㄑㄩㄣ", + "ran": "ㄖㄢ", + "rang": "ㄖㄤ", + "rao": "ㄖㄠ", + "re": "ㄖㄜ", + "ren": "ㄖㄣ", + "reng": "ㄖㄥ", + "ri": "ㄖ", + "rong": "ㄖㄨㄥ", + "rou": "ㄖㄡ", + "ru": "ㄖㄨ", + "ruan": "ㄖㄨㄢ", + "rui": "ㄖㄨㄟ", + "run": "ㄖㄨㄣ", + "ruo": "ㄖㄨㄛ", + "sa": "ㄙㄚ", + "sai": "ㄙㄞ", + "san": "ㄙㄢ", + "sang": "ㄙㄤ", + "sao": "ㄙㄠ", + "se": "ㄙㄜ", + "sei": "ㄙㄟ", + "sen": "ㄙㄣ", + "seng": "ㄙㄥ", + "sha": "ㄕㄚ", + "shai": "ㄕㄞ", + "shan": "ㄕㄢ", + "shang": "ㄕㄤ", + "shao": "ㄕㄠ", + "she": "ㄕㄜ", + "shei": "ㄕㄟ", + "shen": "ㄕㄣ", + "sheng": "ㄕㄥ", + "shi": "ㄕ", + "shou": "ㄕㄡ", + "shu": "ㄕㄨ", + "shua": "ㄕㄨㄚ", + "shuai": "ㄕㄨㄞ", + "shuan": "ㄕㄨㄢ", + "shuang": "ㄕㄨㄤ", + "shui": "ㄕㄨㄟ", + "shun": "ㄕㄨㄣ", + "shuo": "ㄕㄨㄛ", + "si": "ㄙ", + "song": "ㄙㄨㄥ", + "sou": "ㄙㄡ", + "su": "ㄙㄨ", + "suan": "ㄙㄨㄢ", + "sui": "ㄙㄨㄟ", + "sun": "ㄙㄨㄣ", + "suo": "ㄙㄨㄛ", + "ta": "ㄊㄚ", + "tai": "ㄊㄞ", + "tan": "ㄊㄢ", + "tang": "ㄊㄤ", + "tao": "ㄊㄠ", + "te": "ㄊㄜ", + "teng": "ㄊㄥ", + "ti": "ㄊㄧ", + "tian": "ㄊㄧㄢ", + "tiao": "ㄊㄧㄠ", + "tie": "ㄊㄧㄝ", + "ting": "ㄊㄧㄥ", + "tong": "ㄊㄨㄥ", + "tou": "ㄊㄡ", + "tu": "ㄊㄨ", + "tuan": "ㄊㄨㄢ", + "tui": "ㄊㄨㄟ", + "tun": "ㄊㄨㄣ", + "tuo": "ㄊㄨㄛ", + "wa": "ㄨㄚ", + "wai": "ㄨㄞ", + "wan": "ㄨㄢ", + "wang": "ㄨㄤ", + "wei": "ㄨㄟ", + "wen": "ㄨㄣ", + "weng": "ㄨㄥ", + "wo": "ㄨㄛ", + "wu": "ㄨ", + "xi": "ㄒㄧ", + "xia": "ㄒㄧㄚ", + "xian": "ㄒㄧㄢ", + "xiang": "ㄒㄧㄤ", + "xiao": "ㄒㄧㄠ", + "xie": "ㄒㄧㄝ", + "xin": "ㄒㄧㄣ", + "xing": "ㄒㄧㄥ", + "xiong": "ㄒㄩㄥ", + "xiu": "ㄒㄧㄡ", + "xu": "ㄒㄩ", + "xuan": "ㄒㄩㄢ", + "xue": "ㄒㄩㄝ", + "xun": "ㄒㄩㄣ", + "ya": "ㄧㄚ", + "yai": "ㄧㄞ", + "yan": "ㄧㄢ", + "yang": "ㄧㄤ", + "yao": "ㄧㄠ", + "ye": "ㄧㄝ", + "yi": "ㄧ", + "yin": "ㄧㄣ", + "ying": "ㄧㄥ", + "yo": "ㄧㄛ", + "yong": "ㄩㄥ", + "you": "ㄧㄡ", + "yu": "ㄩ", + "yuan": "ㄩㄢ", + "yue": "ㄩㄝ", + "yun": "ㄩㄣ", + "za": "ㄗㄚ", + "zai": "ㄗㄞ", + "zan": "ㄗㄢ", + "zang": "ㄗㄤ", + "zao": "ㄗㄠ", + "ze": "ㄗㄜ", + "zei": "ㄗㄟ", + "zen": "ㄗㄣ", + "zeng": "ㄗㄥ", + "zha": "ㄓㄚ", + "zhai": "ㄓㄞ", + "zhan": "ㄓㄢ", + "zhang": "ㄓㄤ", + "zhao": "ㄓㄠ", + "zhe": "ㄓㄜ", + "zhei": "ㄓㄟ", + "zhen": "ㄓㄣ", + "zheng": "ㄓㄥ", + "zhi": "ㄓ", + "zhong": "ㄓㄨㄥ", + "zhou": "ㄓㄡ", + "zhu": "ㄓㄨ", + "zhua": "ㄓㄨㄚ", + "zhuai": "ㄓㄨㄞ", + "zhuan": "ㄓㄨㄢ", + "zhuang": "ㄓㄨㄤ", + "zhui": "ㄓㄨㄟ", + "zhun": "ㄓㄨㄣ", + "zhuo": "ㄓㄨㄛ", + "zi": "ㄗ", + "zong": "ㄗㄨㄥ", + "zou": "ㄗㄡ", + "zu": "ㄗㄨ", + "zuan": "ㄗㄨㄢ", + "zui": "ㄗㄨㄟ", + "zun": "ㄗㄨㄣ", + "zuo": "ㄗㄨㄛ", + "ȇ": "ㄝ", +}; diff --git a/lib/src/zhuyin_helper.dart b/lib/src/zhuyin_helper.dart new file mode 100644 index 0000000..427d59d --- /dev/null +++ b/lib/src/zhuyin_helper.dart @@ -0,0 +1,125 @@ +import 'package:lpinyin/lpinyin.dart'; + +class ZhuyinHelper { + static Map pinyinToZhuyinMap = + ZhuyinResource.getPinyinToZhuyinResource(); + static Map zhuyinToPinyinMap = + ZhuyinResource.getZhuyinToPinyinResource(); + + static Map toneToNumberMap = { + "": "1", + "ˊ": "2", + "ˇ": "3", + "ˋ": "4", + "˙": "5", + }; + + static Map numberToToneMap = { + "1": "", + "2": "ˊ", + "3": "ˇ", + "4": "ˋ", + "5": "˙", + }; + + /// 将字符串转换成相应格式的注音 + static String getZhuyin( + String str, { + String separator = ' ', + PinyinFormat format = PinyinFormat.WITH_TONE_MARK, + }) { + String pinyin = PinyinHelper.getPinyin( + str, + format: PinyinFormat.WITH_TONE_NUMBER, + ); + List pinyinList = pinyin.split(' '); + String zhuyin = ''; + pinyinList.forEach((singlePinyin) { + zhuyin += _singlePinyinToZhuYin(singlePinyin, format) + ' '; + }); + zhuyin = zhuyin.substring(0, zhuyin.length - 1); + zhuyin = zhuyin.replaceAll(' ', separator); + zhuyin = zhuyin.replaceAll(separator + separator, separator + ' '); + return zhuyin; + } + + /// 單個拼音轉注音 + static String _singlePinyinToZhuYin(String pinyin, PinyinFormat format) { + if (_isDigit(pinyin)) return pinyin; + String tone = '1'; + pinyin = pinyin.replaceAll("v", "ü"); + + for (int i = 0; i < pinyin.length; i++) { + if (_isDigit(pinyin[i])) { + tone = pinyin[i]; + pinyin = pinyin.replaceAll(tone, ""); + break; + } + } + return _convert(pinyin, tone, true, false, format); + } + + /// 單個注音轉拼音 + // static String _singleZhuyinToPinyin(String zhuyin, bool uToV) { + // String tone = ''; + // for (int i = 0; i < zhuyin.length; i++) { + // if (toneToNumberMap.containsKey(zhuyin[i])) { + // tone = zhuyin[i]; + // zhuyin = zhuyin.replaceAll(tone, ""); + // break; + // } + // } + // return _convert(zhuyin, tone, false, uToV); + // } + + static bool _isDigit(String s) { + return int.tryParse(s) != null; + } + + static String _convert( + String word, + String tone, + bool pinyinToZhuyin, + bool uToV, + PinyinFormat format, + ) { + String result = ""; + + if (pinyinToZhuyin) { + if (pinyinToZhuyinMap.containsKey(word)) { + result = pinyinToZhuyinMap[word]!; + } else { + return word; + } + } else { + if (zhuyinToPinyinMap.containsKey(word)) { + if (uToV) { + result = zhuyinToPinyinMap[word]!.replaceAll("ü", "v"); + } else { + result = zhuyinToPinyinMap[word]!; + } + } else { + return word; + } + } + + if (pinyinToZhuyin) { + switch (format) { + case PinyinFormat.WITH_TONE_MARK: + result = tone != '5' + ? result + numberToToneMap[tone]! + : numberToToneMap[tone]! + result; + break; + case PinyinFormat.WITH_TONE_NUMBER: + result = result + tone; + break; + case PinyinFormat.WITHOUT_TONE: + break; + } + } else { + result = result + toneToNumberMap[tone]!; + } + + return result; + } +} diff --git a/lib/src/zhuyin_resource.dart b/lib/src/zhuyin_resource.dart new file mode 100644 index 0000000..55629f4 --- /dev/null +++ b/lib/src/zhuyin_resource.dart @@ -0,0 +1,26 @@ +import 'dart:collection'; + +import 'package:lpinyin/src/dict_data.dart'; + +class ZhuyinResource{ + + /// get Pinyin To Zhuyin Resource. + static Map getPinyinToZhuyinResource() { + return pinyinToZhuyinDict; + } + + /// get Pinyin To Zhuyin Resource. + static Map getZhuyinToPinyinResource() { + List keys = pinyinToZhuyinDict.keys.toList(); + List values = pinyinToZhuyinDict.values.toList(); + Map map = HashMap(); + List> mapEntryList = []; + for(int i = 0; i < values.length; i++){ + MapEntry mapEntry = MapEntry(values[i], keys[i]); + mapEntryList.add(mapEntry); + } + map.addEntries(mapEntryList); + return map; + } + +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 9f73bb5..6d0c2d7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: lpinyin description: Chinese character conversion pinyin library.Accurate and complete Chinese character dictionary.Fast conversion. -version: 2.0.3 +version: 3.0.0 homepage: https://github.com/flutterchina/lpinyin environment: