/* * Media Service * * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. * * 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. * */ #include #include #include #include #include #include #include "media-util-err.h" #include "media-svc-debug.h" #include "media-svc-localize_ch.h" #include "media-svc-util.h" #define array_sizeof(a) (sizeof(a) / sizeof(a[0])) #define CHINESE_PINYIN_SPELL_MAX_LEN 15 #define CHINESE_COUNT 20902 #define CHINESE_DUOYINZI_MAX_COUNT 6 #define CHINESE_UNICODE_START 0x4E00 #define CHINESE_UNICODE_END 0x9FA5 static const char *const pinyin_spell_table[] = { "yi", "ding|zheng", "kao|qiao|yu", "qi", "shang", "xia", "mo", "wan|mo", "zhang", "san", "shang", "xia", "qi|ji", "bu|fou", "yu", "mian", "gai", "chou", "chou", "zhuan", "qie|ju", "pi", "shi", "shi", "qiu", "bing", "ye", "cong", "dong", "si", "cheng", "diu", "qiu", "liang", "diu", "you", "liang", "yan", "bing", "sang", "gun", "jiu", "ge", "ya", "pan", "zhong", "ji", "jie", "feng", "guan|kuang", "chuan", "chan", "lin", "zhuo", "zhu", "ba", "wan", "dan", "wei", "zhu", "jing", "li", "ju", "pie", "fu", "yi|ji", "yi", "nai", "wu", "jiu", "jiu", "tuo|zhe", "me|yao|mB", "yi", "ho", "zhi", "wu", "zha", "hu", "fa", "le|yue", "yin", "ping", "pang", "qiao", "hu", "guai", "cheng|sheng", "cheng|sheng", "yi", "hao", "zhe", "mie|nie", "jiu", "qi", "ye", "xi", "xiang", "gai", "jiu", "hal", "hol", "shu", "dou", "shi", "ji", "nang", "kal", "keol", "tol", "mol", "ol", "mai", "luan", "cal", "ru", "xue", "yan", "phoi", "sha", "na", "qian", "sol", "er", "zu", "ceor", "qian|gan", "zhi|luan", "gui", "qian", "luan", "lin", "yi", "jue", "liao|le", "ma", "yu", "zheng", "shi", "shi", "er", "chu", "yu", "kui", "yu", "yun", "hu", "qi", "wu", "jing", "si", "sui", "gen", "gen", "ya", "xie|suo", "ya", "qi|zhai", "ya", "ji|qi", "tou", "wang|wu", "kang", "da", "jiao", "hai", "yi", "chan", "heng|peng", "mu", "ye", "xiang", "jing", "ting", "liang", "xiang", "jing", "ye", "qin|qing", "bo", "you", "xie", "dan", "lian", "duo", "wei|men", "ren", "ren", "ji", "ji", "wang", "yi", "shi|shen", "ren", "le", "ding", "ze", "jin", "pu", "chou|qiu", "ba", "zhang", "jin", "jie", "bing", "reng", "cong|zong", "fo", "jin|san", "lun", "bing", "cang", "zi|zai", "shi", "ta", "zhang", "fu", "xian", "xian", "tuo|cha|duo", "hong", "tong", "ren", "qian", "gan|han", "yi|ge", "bo", "dai", "ling", "yi", "chao", "chang|zhang", "sa", "chang", "yi", "mu", "men", "ren", "fan", "chao|miao", "yang|ang", "qian", "zhong", "pi", "wo", "wu", "jian", "jia|jie", "yao|fo", "feng", "cang", "ren", "wang", "fen|bin", "di", "fang", "zhong", "qi", "pei", "yu", "diao", "dun", "wen", "yi", "xin", "kang", "yi", "ji", "ai", "wu", "ji|qi", "fu", "fa", "xiu|xu", "jin", "pi", "dan", "fu", "tang", "zhong", "you", "huo", "hui|kuai", "yu", "cui", "yun", "san", "wei", "chuan|zhuan", "che|ju", "ya", "qian", "shang", "chang", "lun", "cang|chen", "xun", "xin", "wei", "zhu", "chi", "xian|xuan", "nu", "bo|bai|ba", "gu", "ni", "ni", "xie", "ban", "xu", "ling", "zhou", "shen", "qu", "si|ci", "peng", "si|shi", "qie|jia|ga", "pi", "zhi", "si", "yi|chi", "zheng", "dian|tian", "han|gan", "mai", "dan", "zhu", "bu", "qu", "bi", "zhao|shao", "ci", "wei", "di", "zhu", "zuo", "you", "yang", "ti|ben", "zhan|dian", "he", "bi", "tuo", "she", "yu", "yi|die", "fo|fu|bi|bo", "zuo", "gou|kou", "ning", "tong", "ni", "xian", "qu", "yong", "wa", "qian", "shi", "ka", "bao", "pei", "hui|huai", "ge", "lao", "xiang", "ge", "yang", "bai", "fa", "ming", "jia", "er|nai", "bing", "ji", "hen", "huo", "gui", "quan", "tiao", "jiao", "ci", "yi", "shi", "xing", "shen", "tuo", "kan", "zhi", "gai", "lai", "yi", "chi", "kua", "gong", "li", "yin", "shi", "mi", "zhu", "xu", "you", "an", "lu", "mou", "er", "lun", "dong|tong", "cha", "chi", "xun", "gong", "zhou", "yi", "ru", "cun", "xia", "si", "dai", "lv", "ta", "jiao|yao", "zhen", "ce|ze|zhai", "qiao", "kuai", "chai", "ning", "nong", "jin", "wu", "hou", "jiong", "cheng|ting", "zhen", "zuo", "hao", "qin", "lv", "jv", "shu|dou", "ting", "shen", "tuo|tui", "bo", "nan", "xiao", "bian|pian", "tui", "yu", "xi", "cu", "e", "qiu", "xu", "guang", "ku", "wu", "jun", "yi", "fu", "liang", "zu", "qiao|xiao", "li", "yong", "hun", "jing", "qian", "san", "pei", "su", "fu", "xi", "li", "fu", "ping", "bao", "yu|shu", "si|qi", "xia", "xin|shen", "xiu", "yu", "di", "che|ju", "chou", "zhi", "yan", "liang|lia", "li", "lai", "si", "jian", "xiu", "fu", "huo", "ju", "xiao", "pai", "jian", "biao", "chu|ti", "fei", "feng", "ya", "an", "bei", "yu", "xin", "bi", "hu|chi", "chang", "zhi", "bing", "jiu", "yao", "cui|zu", "liang|lia", "wan", "lai", "cang", "zong", "ge", "guan", "bei", "tian", "shu", "shu", "men", "dao", "tan", "jue", "chui", "xing", "peng", "tang|chang", "hou", "yi", "qi", "ti", "gan", "liang|jing", "jie", "sui", "chang", "jie", "fang", "zhi", "kong", "juan", "zong", "ju", "qian", "ni", "lun", "zhuo", "wo|wei", "luo", "song", "leng", "hun", "dong", "zi", "ben", "wu", "ju", "nai", "cai", "jian", "zhai", "ye", "zhi", "sha", "qing", "ning", "ying", "cheng|chen", "qian", "yan", "ruan", "zhong|tong", "chun", "jia", "ji|jie", "wei", "yu", "bing", "ruo", "ti", "wei", "pian", "yan", "feng", "tang|dang", "wo", "e", "xie", "che", "sheng", "kan", "di", "zuo", "cha", "ting", "bei", "xie", "huang", "yao", "zhan", "chou|qiao", "an", "you", "jian", "xu", "zha", "ci", "fu", "bi", "zhi", "zong", "mian", "ji", "yi", "xie", "xun", "cai|si", "duan", "ce|ze|zhai", "zhen", "ou", "tou", "tou", "bei", "zan|za|zBn", "lv|lou", "jie", "wei", "fen", "chang", "kui|gui", "sou", "zhi|si", "su", "xia", "fu", "yuan", "rong", "li", "nu", "yun", "jiang|gou", "ma", "bang", "dian", "tang", "hao", "jie", "xi", "shan", "qian|jian", "que|jue", "cang|chen", "chu", "san", "bei", "xiao", "rong", "yao", "ta|tan", "suo", "yang", "fa", "bing", "jia", "dai", "zai", "tang", "gu", "bin", "chu", "nuo", "can", "lei", "cui", "yong", "zao|cao", "zong", "peng", "song", "ao", "chuan|zhuan", "yu", "zhai", "qi|cou", "shang", "chuang", "jing", "chi", "sha", "han", "zhang", "qing", "yan", "di", "xie", "lv|lou", "bei", "piao|biao", "jin", "lian", "lu", "man", "qian", "xian", "tan", "ying", "dong", "zhuan", "xiang", "shan", "qiao", "jiong", "tui", "zun", "pu", "xi", "lao", "chang", "guang", "liao", "qi", "cheng|deng", "zhan|zhuan|chan", "wei", "ji", "bo", "hui", "chuan", "tie|jian", "dan", "jiao|yao", "jiu", "seng", "fen", "xian", "yu|ju", "e|wu", "jiao", "jian", "tong|zhuang", "lin", "bo", "gu", "xian", "su", "xian", "jiang", "min", "ye", "jin", "jia|jie", "qiao", "pi", "feng", "zhou", "ai", "sai", "yi", "jun", "nong", "chan|tan|shan", "yi", "dang", "jing", "xuan", "kuai", "jian", "chu", "dan", "jiao", "sha", "zai", "can", "bin", "an", "ru", "tai", "chou", "chai", "lan", "ni|yi", "jin", "qian", "meng", "wu", "ning", "qiong", "ni", "chang", "lie", "lei", "lv", "kuang", "bao", "yu", "biao", "zan", "zhi", "si", "you", "hao", "qing", "chen", "li", "teng", "wei", "long", "chu", "chan", "rang|xiang", "shu", "hui|xie", "li", "luo", "zan", "nuo", "tang", "yan", "lei", "nang", "er", "wu", "yun", "zan", "yuan", "xiong", "chong", "zhao", "xiong", "xian", "guang", "dui|rui|yue", "ke", "dui|rui|yue", "mian", "tu", "chang|zhang", "er", "dui|rui|yue", "er|ni", "jin", "tu", "si", "yan", "yan", "shi", "shike", "dang", "qibnke", "dou", "gongfenPPPU", "hboke", "shen", "dou", "baike", "jing", "gongli", "huang", "ru", "wang", "nei", "quan", "liang", "yu|shu", "ba", "gong", "liu|lu", "xi", "han", "lan", "gong", "tian", "guan", "xing", "bing", "qi|ji", "ju", "dian", "zi|ci", "bun", "yang", "jian", "shou", "ji", "yi", "ji", "chan", "jiong", "mao", "ran", "nei|na", "yuan", "mao", "gang", "ran", "ce", "jiong", "ce", "zai", "gua", "jiong", "mao", "zhou", "mao|mo", "gou", "xu", "mian", "mi", "rong", "yin|you", "xie", "kan", "jun", "nong", "yi", "shen", "shi", "guan", "meng", "zhong", "zui", "yuan", "ming", "kou", "lin", "fu", "xie", "mi", "bing", "dong", "tai", "gang", "feng|ping", "bing", "hu", "chong", "jue", "ya", "kuang", "ye", "leng", "pan", "fa", "min", "dong", "xian", "lie", "qia", "jian", "jing|cheng", "sou", "mei", "tu", "qi", "gu", "zhun", "song", "jing|cheng", "liang", "qing", "diao", "ling", "dong", "gan", "jian", "yin", "cou", "ai", "li", "cang", "ming", "zhun", "cui", "si", "duo", "jin", "lin", "lin", "ning", "xi", "du", "ji", "fan", "fan", "fan", "feng", "ju", "chu", "yi kB|yi kB no bo li|tB ko", "feng", "mu", "zhi", "fu", "feng", "ping", "feng", "kai", "huang", "kai", "gan", "deng", "ping", "kan|qian", "xiong", "kuai", "tu", "ao|wa", "chu", "ji", "dang", "han", "han", "zao", "dao", "diao", "dao", "ren", "ren", "chuang", "fen", "qie", "yi", "ji", "kan", "qian", "cun", "chu", "wen", "ji", "dan", "xing", "hua", "wan", "jue", "li", "yue", "lie", "liu", "ze", "gang", "chuang", "fu", "chu", "qu", "diao", "shan", "min", "ling", "zhong", "pan", "bie", "jie", "jie", "pao|bao", "li", "shan", "bie", "chan", "jing", "gua", "geng", "dao", "chuang", "kui", "ku", "duo", "er", "zhi", "shua", "quan|xuan", "cha|sha", "ci", "ke", "jie", "gui", "ci", "gui", "kai", "duo", "ji", "ti", "jing", "dou", "luo", "ze", "yuan", "cuo", "xiao|xue", "kei|ke", "la", "qian", "cha|sha", "chuang", "gua", "jian", "cuo", "li", "ti", "fei", "pou", "chan", "qi", "chuang", "zi", "gang", "wan", "bao|bo", "ji", "duo", "qing", "yan|shan", "du|zhuo", "jian", "ji", "bao|bo", "yan", "ju", "huo", "sheng", "jian", "duo", "zhi|duan", "wu", "gua", "fu|pi", "sheng", "jian", "ge", "da|zha", "kai", "chuang", "chuan", "chan", "tuan|zhuan", "lu|jiu", "li", "peng", "shan", "piao", "kou", "jiao|chao", "gua", "qiao", "jue", "hua", "zha", "zhuo", "lian", "ju", "pi", "liu", "gui", "jiao|chao", "gui", "jian", "jian", "tang", "huo", "ji", "jian", "yi", "jian", "zhi", "chan", "zuan", "mo", "li", "zhu", "li", "ya", "quan", "ban", "gong", "jia", "wu", "mai", "lie", "jin|jing", "keng", "xie|lie", "zhi", "dong", "zhu|chu", "nu", "jie", "qu", "shao", "yi", "zhu", "miao", "li", "jin|jing", "lao", "lao", "juan", "kou", "yang", "wa", "xiao", "mou", "kuang", "jie", "lie", "he", "shi", "ke", "jin|jing", "gao", "bo|bei", "min", "chi", "lang", "yong", "yong", "mian", "ke", "xun", "juan", "qing", "lu", "bu", "meng", "chi", "le|lei", "kai", "mian", "dong", "xu", "xu", "kan", "wu", "yi", "xun", "weng|yang", "sheng", "lao", "mu", "lu", "piao", "shi", "ji", "qin", "jiang", "jiao|chao", "quan", "xiang", "yi", "qiao", "fan", "juan", "tong|dong", "ju", "dan", "xie", "mai", "xun", "xun", "lv", "li", "che", "rang|xiang", "quan", "bao", "shao", "yun", "jiu", "bao", "gou", "wu", "yun", "mo", "xiong", "gai", "gai", "bao", "cong", "yi", "xiong", "peng", "ju", "tao|yao", "ge", "pu", "e", "pao", "fu", "gong", "da", "jiu", "gong", "bi", "hua", "bei", "nao", "chi|shi", "fang", "jiu", "yi", "za", "jiang", "kang", "jiang", "kuang", "hu", "xia", "qu", "fan", "gui", "qie", "zang|cang", "kuang", "fei", "hu", "yu", "gui", "kui|gui", "hui", "dan", "kui|gui", "lian", "lian", "suan", "du", "jiu", "jue", "xi", "pi", "qu|ou", "yi", "ke|qia", "yan", "bian", "ni", "qu|ou", "shi", "xun", "qian", "nian", "sa", "zu", "sheng", "wu", "hui", "ban", "shi", "xi", "wan", "hua", "xie", "wan", "bei", "zu|cu", "zhuo", "xie", "dan|shan|chan", "mai", "nan|na", "dan", "ji", "bo", "shuai|lv", "bu|bo", "guan|kuang", "bian", "bu", "zhan", "qia|ka", "lu", "you", "lu", "xi", "gua", "wo", "xie", "jie", "jie", "wei", "yang|ang", "qiong", "zhi", "mao", "yin", "wei", "shao", "ji", "que", "luan", "chi", "juan", "xie", "xu", "jin", "que", "wu", "ji", "e", "qing", "xi", "san", "chang|an|han", "wei", "e", "ting", "li", "zhe|zhai", "han|an", "li", "ya", "ya", "yan", "she", "di", "zha|zhai", "pang", "ya", "qie", "ya", "zhi|shi", "ce", "mang", "ti", "li", "she", "hou", "ting", "zui", "cuo", "fei", "yuan", "ce", "yuan", "xiang", "yan", "li", "jue", "sha|xia", "dian", "chu", "jiu", "jin", "ao", "gui", "yan", "si", "li", "chang", "qian|lan", "li", "yan", "yan", "yuan", "si|mou", "gong|hong", "lin|miao", "rou|qiu", "qu", "qu", "ke", "lei", "du", "xian|xuan", "zhuan", "san", "can|shen|cen|san", "can|shen|cen|san", "can|shen|cen|san", "can|shen|cen|san", "ai|yi", "dai", "you", "cha", "ji", "you", "shuang", "fan", "shou", "guai", "ba", "fa", "ruo", "li", "shu", "zhuo|yi|li|jue", "qu", "shou", "bian", "xu", "jia", "pan", "sou", "ji", "wei|yu", "sou", "die", "rui", "cong", "kou", "gu", "ju|gou", "ling", "gua", "tao|dao", "kou", "zhi", "jiao", "zhao|shao", "ba", "ding", "ke", "tai", "chi", "shi", "you", "qiu", "po", "ye|xie", "hao", "si", "tan", "chi", "le", "diao", "ji", "dug", "hong", "mie", "xu|yu", "mang", "chi", "ge", "xuan|song", "yao", "zi", "he|ge", "ji", "diao", "dou|cun", "tong", "ming", "hou", "li", "tu", "xiang", "zha", "xia|he", "ye", "lv", "a", "ma|mB", "ou", "huo", "yi", "jun", "chou", "lin", "tun", "yin", "fei", "pi|bi", "qin", "qin", "jie|ge", "bu", "fou|pi", "ba", "dun", "fen", "e|hua", "han", "ting", "hang|keng", "shun", "qi", "hong", "zhi|zi", "yin|shen", "wu", "wu", "chao", "na|ne", "xue|chuo|jue", "xi", "chui", "dou|ru", "wen", "hou", "hou|hong|ou", "wu|yu", "gao", "ya|yB", "jun", "lv", "e", "ge", "wen", "dai", "qi", "cheng", "wu", "gao", "fu", "jiao", "hong", "chi", "sheng", "na|ne", "tun|tian", "fu|?", "yi", "dai", "ou", "li", "bei|bai", "yuan|yun", "wai|he|wo|wa|gua|guo", "hua|qi", "qiang", "wu", "e", "shi", "juan", "pen", "wen|min", "ne", "mou|m", "ling", "ran", "you", "di", "zhou", "shi", "zhou", "tie|che", "xi", "yi", "qi|zhi", "ping", "zi|ci", "gua|gu", "zi|ci", "wei", "xu|hou|gou", "he|a|ke", "nao", "xia", "pei", "yi", "xiao|hao", "shen", "hu", "ming", "da|dan", "qu", "ju|zui", "xian|gan", "za", "tuo", "duo", "pou", "pao", "bi", "fu", "yang", "he", "zha|za", "he|huo|hu", "hai", "jiu", "yong", "fu", "da", "zhou", "wa", "ka", "gu", "ka|ga", "zuo", "bu", "long", "dong", "ning", "tuo", "si", "xian", "huo", "qi", "er", "e", "guang", "zha", "die|xi", "yi", "lie", "zi", "mie", "mi", "zhi", "yao", "ji|xi|qia", "zhou", "ka|luo|lo|ge", "shu|xun", "zan|za|zBn", "xiao", "ke|hai", "hui", "kua", "huai|shi", "tao", "xian", "e|an", "xuan", "xiu", "wai|he|wo|wa|gua|guo", "yan|ye", "lao", "yi", "ai", "pin", "shen", "tong", "hong", "xiong", "duo", "wa|wB", "ha", "zai", "you", "die|di", "pai", "xiang", "ai", "gen|hen", "kuang", "ya", "da", "xiao", "bi", "yue|hui", "nian", "hua", "xing", "kuai", "duo", "po", "ji|jie|zhai", "nong", "mou", "yo", "hao", "yuan|yun", "long", "pou", "mang", "ge", "o", "chi", "shao", "li", "na|nei|nB|ne", "zu", "he", "ku", "xiao", "xian", "lao", "po|ba|bo", "zhe", "zha", "liang|lang", "ba", "mie", "lie|lv", "sui", "fu", "bu", "han", "heng|hng", "geng", "chuo|yue", "ge|jia", "you", "yan", "gu", "gu", "bei|bai", "han", "suo", "chun", "yi", "ai", "jia|qian", "tu", "dan|xian|yan", "wan", "li", "xi", "tang", "zuo", "qiu", "che", "wu", "zao", "ya", "dou", "qi", "di", "qin", "ma", "ma", "gong|hong", "dou", "ge", "lao", "liang", "suo", "zao", "huan", "leng", "sha|shB", "ji", "zu", "wo|wei", "feng", "jin|yin", "hu|xia", "qi", "shou", "wei", "shua", "chang", "er|wa", "li", "qiang", "an", "jie|ze|zuo", "yo", "nian", "yu", "tian", "lai", "sha", "xi", "tuo", "hu", "ai", "zhou|zhao|tiao", "gou", "ken", "zhuo", "zhuo|zhao", "shang", "di", "heng", "lan|lin", "a", "cai", "qiang", "zhun|tun|xiang|dui", "wu", "wen", "cui|qi", "sha|jie|die|ti", "gu", "qi", "qi", "tao", "dan", "dan", "yue|wa", "zi|ci", "bi|tu", "cui", "chuo|chuai", "he", "ya", "qi", "zhe", "fei", "liang", "xian", "pi", "sha", "lB|la", "ze", "qing|ying", "gua", "pa", "ze|shi", "se", "zhuan", "nie", "guo", "luo", "yan", "di", "quan", "tan|chan|tuo", "bo", "ding", "lang", "xiao", "ju", "tang", "chi", "ti", "an", "jiu", "dan", "ka", "yong", "wei", "nan", "shan", "yu", "zhe", "la", "jie", "hou", "han", "die|zha", "zhou", "chai", "wai", "nuo|re", "huo|guo|xu", "yin", "zan|za|zBn", "yao", "o|wo", "mian", "hu", "yun", "chuan", "hui", "huan", "huan|yuan|xuan|he", "xi", "he|ye", "ji", "kui", "zhong|chuang", "wei", "sha", "xu", "huang", "duo|zha", "yan", "xuan", "liang", "yu", "sang", "chi", "qiao|jiao", "yan", "dan|shan|chan", "pen|ben", "can|sun|qi", "li", "yo", "zha|cha", "wei", "miao", "ying", "pen", "pbo", "kui", "xi", "yu", "jie", "lou", "ku", "zao|qiao", "hu", "ti", "yao", "he|xiao|hu", "sha|a", "xiu", "qiang", "se", "yong", "su", "gong|hong", "xie", "yi|ai", "suo", "ma|mB", "cha", "hai", "ke", "ta|da", "sang", "chen", "ru", "sou", "wa|gu", "ji", "beng|pang", "wu", "xian|qian|qie", "shi", "ge", "zi", "jie", "lao", "weng", "wa", "si", "chi", "hao", "suo", "jia", "hai|hei", "suo", "qin", "nie", "he", "zi", "sai", "ng", "ge", "na", "dia", "ai", "qiang", "tong", "bi", "ao", "ao", "lian", "zui|sui", "zhe|zhu", "mo", "sou", "sou", "tan", "di", "qi", "jiao", "chong", "jiao|dao", "kai|ge", "tan", "shan|can", "cao", "jia", "ai", "xiao", "piao", "lou", "ga", "gu", "xiao|jiao", "hu", "hui", "guo", "ou", "xian", "ze", "chang", "xu|shi", "po", "de|dei", "ma", "ma", "hu", "le", "du", "ga", "tang", "ye", "beng", "ying", "sai", "jiao", "mi", "xiao", "hua", "mai", "ran", "zuo", "peng", "lao", "xiao", "ji", "zhu", "chao|zhao", "kui", "zui", "xiao", "si", "hao", "fu|?", "liao", "qiao", "xi", "chu|xu|shou", "tan|chan", "dan|tan", "hei|mo", "xun", "e", "zun", "fan|bo", "chi", "hui", "zan", "chuang", "cu|za|he", "dan", "jue", "tun|kuo", "ceng", "jiao", "ye", "xi", "qi", "hao", "lian", "xu|shi", "deng", "hui", "yin", "pu", "jue", "qin", "xun", "nie", "lu", "si", "yan", "ying", "da", "zhan", "o", "zhou|zhuo", "jin", "nong", "yue|hui", "xie", "qi", "e", "zao", "yi", "shi", "jiao|qiao|chi", "yuan", "ai", "yong", "jue|xue", "kuai", "yu", "pen", "dao", "ga", "xin|hen", "dun", "dang", "xin", "sai", "pi", "pi", "yin", "zui", "ning", "di", "lan", "ta", "huo|o", "ru", "hao", "he|xia", "yan", "duo", "xiu|pi", "zhou|chou", "ji|jie|zhai", "jin", "hao", "ti", "chang", "xun", "me", "ca|cha", "ti", "lu", "hui", "bo|pao|bao", "you", "nie", "yin", "hu", "mei|me|mo", "hong", "zhe", "li", "liu", "xie|hai", "nang", "xiao", "mo", "yan", "li", "lu", "long", "po", "dan", "chen", "pin", "pi", "xiang", "huo", "me", "xi", "duo", "ku", "yan", "chan", "ying", "rang", "dian", "la", "ta", "xiao", "jiao|jue", "chuo", "huan", "huo", "zhuan", "nie", "xiao", "ca", "li", "chan", "chai", "li", "yi", "luo", "nang", "za|zan|can", "su", "xi", "zeng", "jian", "yan|za|nie", "zhu", "lan", "nie", "nang", "ramo", "luo", "wei|guo", "hui", "yin", "qiu", "si", "nin", "jian|nan", "hui", "xin", "yin", "nan", "tuan", "tuan", "dun|tun", "kang", "yuan", "jiong", "pian", "yun", "cong", "hu", "hui", "yuan", "e", "guo", "kun", "cong", "wei|tong", "tu", "wei", "lun", "guo", "qun", "ri", "ling", "gu", "guo", "tai", "guo", "tu", "you", "guo", "yin", "hun", "pu", "yu", "han", "yuan", "lun", "quan|juan", "yu", "qing", "guo", "chuan|chui", "wei", "yuan", "quan|juan", "ku", "pu", "yuan", "yuan", "ya", "tuan", "tu", "tu", "tuan", "lve", "hui", "yi", "huan|yuan", "luan", "luan", "tu", "ya", "tu", "ting", "sheng", "pu", "lu", "kuai", "ya", "zai", "wei|xu", "ge", "yu|zhun", "wu", "gui", "pi", "yi", "di|de", "qian|su", "qian", "zhen", "zhuo", "dang", "qia", "xia", "shan", "kuang", "chang", "qi|yin", "nie", "mo", "ji", "jia", "zhi", "zhi", "ban", "xun", "yi", "qin", "mei|fen", "jun", "rong|keng", "tun|dun", "fang", "ben|fen", "ben", "tan", "kan", "huai|pei|pi", "zuo", "keng", "bi", "jing", "di|lan", "jing", "ji", "kuai", "di", "jing", "jian", "tan", "li", "ba", "wu", "fen", "zhui", "po", "pan|ban", "tang", "kun", "qu", "tan", "zhi", "tuo", "gan", "ping", "dian", "gua", "ni", "tai", "pi", "jiong", "yang", "fo", "ao", "lu", "qiu", "mu", "ke", "gou", "xue", "fa", "di|chi", "che", "ling", "zhu", "fu", "hu", "zhi", "chui", "la", "long", "long", "lu", "ao", "dai", "pao", "min", "xing", "dong|tong", "ji", "he", "lv", "ci", "chi", "lei", "gai", "yin", "hou", "dui", "zhao", "fu", "guang", "yao", "duo", "duo", "gui", "cha", "yang", "yin", "fa", "gou", "yuan", "die", "xie", "ken", "shang", "shou", "e", "bing", "dian", "hong", "ya", "kua", "da", "ka", "dang", "kai", "hang", "nao", "an", "xing", "xian", "yuan|huan", "bang", "pou|fu", "ba", "yi", "yin", "han", "xu", "chui", "cen", "geng", "ai", "beng|feng", "di|fang", "que|jue", "yong", "jun", "xia|jia", "di", "mai|man", "lang", "juan", "cheng", "yan|shan", "qin|jin", "zhe", "lie", "lie", "pu|bu", "cheng", "hua", "bu", "shi", "xun", "guo", "jiong", "ye", "nian", "di", "yu", "bu", "ya", "quan", "sui|su", "pi", "qing|zheng", "wan", "ju", "lun", "zheng|cheng", "kong", "chong|shang", "dong", "dai", "tan", "an", "cai", "chu|tou", "beng", "xian|kan", "zhi", "duo", "yi|shi", "zhi", "yi", "pei", "ji", "zhun", "qi", "sao", "ju", "ni", "ku", "ke", "tang", "kun", "ni", "jian", "dui", "jin", "gang", "yu", "e", "peng|beng", "gu", "tu", "leng", "fang", "ya", "qian|zan|jian", "kun", "an", "shen", "duo|hui", "nao", "tu", "cheng", "yin", "huan", "bi", "lian", "guo", "die", "zhuan", "hou", "bao|bu|pu", "bao", "yu", "di", "mao|mou|wu", "jie", "ruan", "e|ai|ye", "geng", "kan", "zong", "yu", "huang", "e", "yao", "yan", "bao", "ji", "mei", "chang", "du", "tuo", "yin", "feng", "zhong", "jie", "jin", "feng", "gang", "chuan", "jian", "ping", "lei", "jiang", "huang", "leng", "duan", "wan", "xuan", "xi", "ji", "kuai", "ying", "ta", "cheng", "yong", "kai", "su", "su", "shi", "mi", "ta", "weng", "cheng", "tu", "tang", "que", "zhong", "li", "peng", "bang", "sai|se", "zang", "dui", "tian", "wu", "zheng", "xun", "ge", "zhen", "ai", "gong", "yan", "xian", "tian|zhen", "yuan", "wen", "xie", "liu", "hai", "lang", "chang", "peng", "beng", "chen", "lu", "lu", "ou|qiu", "qian|zan|jian", "mei", "mo", "zhuan|tuan", "shuang", "shu", "lou", "chi", "man", "biao", "jing", "qi", "shu", "zhi|di", "zhang", "kan", "yong", "dian", "chen", "zhi|zhuo", "xi", "guo", "qiang", "jin", "shang", "shang", "mu", "cui", "yan", "ta", "zeng", "qian", "qiang", "liang", "wei", "zhui", "qiao", "zeng", "xu", "shan", "shan", "fa", "pu", "kuai|tui", "tuan|dong", "fan", "qiao|que", "mo", "dun", "dun", "zun|dun", "di", "sheng", "duo|hui", "duo", "tan", "deng", "wu", "fen", "huang", "tan", "da", "ye", "zhu", "jian", "ao", "qiang", "ji", "qiao|ao", "ken", "yi|tu", "pi", "bi", "dian", "jiang", "ye", "yong", "xue|bo|jue", "tan", "lan", "ju", "huai", "dang", "rang", "qian", "xun", "xian|lan", "xi", "he", "ai", "ya", "dao", "hao", "ruan", "jin", "lei", "kuang", "lu", "yan", "tan", "wei", "huai", "long", "long", "rui", "li", "lin", "rang", "chan", "xun", "yan", "lei", "ba", "wan", "shi", "ren", "san", "zhuang", "zhuang", "sheng", "yi", "mai", "ke|qiao", "zhu", "zhuang", "hu", "hu", "kun", "yi", "hu", "xu", "kun", "shou", "mang", "dun", "shou", "yi", "zhi|zhong", "gu|ying", "chu", "jiang|xiang", "feng|pang", "bei", "zhai", "bian", "sui", "qun", "ling", "fu", "cuo", "xia", "xiong|xuan", "xie", "nao", "xia", "kui", "xi", "wai", "yuan|wan", "mao|wan", "su", "duo", "duo", "ye", "qing", "yi", "gou", "gou", "qi", "meng", "meng", "yin", "huo", "chen", "da|dai", "ce", "tian", "tai", "fu", "guai", "yao", "yang", "hang|ben", "gao", "shi", "tao|ben", "tai", "tou", "yan|tao", "bi", "yi", "kua", "jia|ga|xia", "duo", "hua", "kuang", "yun", "jia|ga|xia", "ba", "en", "lian", "huan", "di|ti", "yan", "pao", "juan", "qi|ji", "nai", "feng", "xie", "fen", "dian", "quan|juan", "kui", "zou", "huan", "qi|qie|xie", "kai", "she|chi|zha", "ben", "yi", "jiang", "tao", "zang|zhuang", "ben", "xi", "huang", "fei", "diao", "xun|zhui", "beng", "dian", "ao", "she", "weng", "po|ha|tai", "ao|yu", "wu", "ao|yu", "jiang", "lian", "duo", "yun", "jiang", "shi", "fen", "huo", "bi", "luan", "duo|che", "nv", "nu", "ding|tian", "nai", "qian", "jian", "ta|jie", "jiu", "nuan", "cha", "hao", "xian", "fan", "ji", "shuo", "ru", "fei|pei", "wang", "hong", "zhuang", "fu", "ma", "dan", "ren", "fu|you", "jing", "yan", "hai|jie", "wen", "zhong", "pa", "du", "ji", "keng|hang", "zhong", "yao", "jin", "yun", "miao", "fou|pei|pi", "chi", "yue|jue", "zhuang", "niu", "yan", "na|nan", "xin", "fen", "bi", "yu", "tuo", "feng", "wan|yuan", "fang", "wu", "yu", "gui", "du", "ba", "ni", "zhou", "zhuo", "zhao", "da", "ni|nai", "yuan", "tou", "xian|xuan|xu", "zhi|yi", "e", "mei", "mo", "qi", "bi", "shen", "qie", "e", "he", "xu", "fa", "zheng", "min", "ban", "mu", "fu", "ling", "zi", "zi", "shi", "ran", "shan", "yang", "gan", "jie", "gu", "si", "xing", "wei", "zi", "ju", "shan", "pin", "ren", "yao", "dong", "jiang", "shu", "ji", "gai", "xiang", "hua|huo", "juan", "jiao|xiao", "gou|du", "mu|lao", "jian", "jian", "yi", "nian", "zhi", "zhen", "ji", "xian", "heng", "guang", "jun|xun", "kua|hu", "yan", "ming", "lie", "pei", "e", "you", "yan", "cha", "shen|xian", "yin", "shi", "gui", "quan", "zi", "song", "wei", "hong", "wa", "lou", "ya", "rao", "jiao", "luan", "ping", "xian", "shao", "li", "cheng|sheng", "xie", "mang", "fu", "suo", "wu|mu", "wei", "ke", "chuo|lai", "chuo", "ting", "niang", "xing", "nan", "yu", "na|nuo", "pou|bi", "nei|sui", "juan", "shen", "zhi", "han", "di", "zhuang", "e", "pin", "tui", "man", "mian", "wu|yu", "yan", "wu", "xi|ai", "yan", "yu", "si", "yu", "wa", "li", "xian", "ju", "qu", "zhui|shui", "qi", "xian", "zhuo", "dong", "chang", "lu", "ai|e", "e", "e", "lou", "mian", "cong", "pou|pei|bu", "ju", "po", "cai", "ling", "wan", "biao", "xiao", "shu", "qi", "hui", "fu|fan", "wo", "wo", "tan", "fei", "fei", "jie", "tian", "ni", "quan|juan", "jing", "hun", "jing", "qian|jin", "dian", "xing", "hu", "wan|wa", "lai", "bi", "yin", "zhou|chou", "chuo|nao", "fu", "jing", "lun", "an|n= CHINESE_COUNT, MS_MEDIA_ERR_INVALID_PARAMETER, "src is invalid"); len = strlen(pinyin_spell_table[offset]); for (i = 0, j = 0; i <= len; i++) { if (pinyin_spell_table[offset][i] == DUOYINZI_SEPERATOR || pinyin_spell_table[offset][i] == '\0') { strncpy(spell[count], pinyin_spell_table[offset] + j, i - j); j = i + 1; count++; } } return count; } static inline bool __media_svc_is_chinese(const UChar *src) { if (CHINESE_UNICODE_START <= *src && *src <= CHINESE_UNICODE_END) return true; return false; } #define MEDIA_SVC_CHINESE_MULTIPLE_PINYIN_MAX_LEN 3 int _media_svc_convert_chinese_to_pinyin(const char *src, pinyin_name_s **name, int *size) { UChar temp_result[strlen(src) + 1]; int count = 0, len = 0, total_count = 0; int ret, i, j; int multi_pinyin_count = 0; UErrorCode status = 0; pinyin_name_s *temp_name = NULL; *size = 0; media_svc_retvm_if(src == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "src is NULL"); media_svc_retvm_if(!*src, MS_MEDIA_ERR_INVALID_PARAMETER, "*src is NULL"); u_strFromUTF8(temp_result, array_sizeof(temp_result), NULL, src, -1, &status); if (U_FAILURE(status)) { media_svc_error("u_strFromUTF8 Failed(%s)", u_errorName(status)); return MS_MEDIA_ERR_INTERNAL; } len = u_strlen(temp_result); char spell[len][CHINESE_DUOYINZI_MAX_COUNT][CHINESE_PINYIN_SPELL_MAX_LEN]; int pinyin_spell_count[len]; memset(spell, 0x0, len * CHINESE_DUOYINZI_MAX_COUNT * CHINESE_PINYIN_SPELL_MAX_LEN); for (count = 0; count < len; count++) { if (temp_result[count] == 0xFEFF || temp_result[count] == 0xFFFE) { /* ||temp_result[count] == 0xFF) { */ media_svc_error("FIND BOM, GO TO THE NEXT CHARACTER"); pinyin_spell_count[count] = 1; continue; } if (__media_svc_is_chinese(&temp_result[count])) { ret = __media_svc_get_pinyinspell(temp_result[count], spell[count]); media_svc_retvm_if(ret < MS_MEDIA_ERR_NONE, MS_MEDIA_ERR_INTERNAL, "__media_svc_get_pinyinspell() Failed(%d)", ret); if (multi_pinyin_count >= MEDIA_SVC_CHINESE_MULTIPLE_PINYIN_MAX_LEN) ret = 1; pinyin_spell_count[count] = ret; if (total_count == 0) total_count = ret; else total_count *= ret; if (ret > 1) multi_pinyin_count++; } else { UChar temp[2]; int temp_size; temp[0] = temp_result[count]; temp[1] = 0x00; u_strToUTF8(spell[count][0], 10, &temp_size, temp, -1, &status); media_svc_retvm_if(U_FAILURE(status), MS_MEDIA_ERR_INTERNAL, "u_strToUTF8() Failed(%s)", u_errorName(status)); spell[count][0][temp_size] = '\0'; pinyin_spell_count[count] = 1; } } *size = total_count; temp_name = g_new0(pinyin_name_s, total_count); int repeat = 1; int name_len[total_count]; int initial_len[total_count]; int pinyin_name_len = sizeof(char) * ((len + 2) * CHINESE_PINYIN_SPELL_MAX_LEN); int pinyin_initial_len = sizeof(char) * (len * 5 + 1); for (i = 0; i < count ; i++) { for (j = 0; j < total_count; j++) { if (pinyin_spell_count[i] == 0) continue; int index = (j / repeat) % pinyin_spell_count[i]; if (i == 0) { name_len[j] = 0; initial_len[j] = 0; temp_name[j].pinyin_name = (char *)g_malloc0(pinyin_name_len); temp_name[j].pinyin_initial = (char *)g_malloc0(pinyin_initial_len); } if (spell[i][index][0]) { /*if(temp_name[j].pinyin_name[0]) */ /* name_len[j] += snprintf(temp_name[j].pinyin_name + name_len[j], pinyin_name_len - name_len[j], " "); */ name_len[j] += snprintf(temp_name[j].pinyin_name + name_len[j], pinyin_name_len - name_len[j], "%s", spell[i][index]); int char_len = __media_svc_check_utf8(spell[i][index][0]); if (char_len > 0) { if (char_len == 1) initial_len[j] += snprintf(temp_name[j].pinyin_initial + initial_len[j], pinyin_initial_len - initial_len[j], "%c", spell[i][index][0]); else { char temp[10]; snprintf(temp, sizeof(temp), "%s", spell[i][index]); temp[char_len] = '\0'; initial_len[j] += snprintf(temp_name[j].pinyin_initial + initial_len[j], pinyin_initial_len - initial_len[j], "%s", temp); } } else { media_svc_error("_media_svc_check_utf8 failed"); continue; } } } repeat *= pinyin_spell_count[i]; } *name = temp_name; return MS_MEDIA_ERR_NONE; } void _media_svc_pinyin_free(pinyin_name_s *pinyinname, int size) { int i; if (pinyinname == NULL) return; for (i = 0; i < size; i++) { g_free(pinyinname[i].pinyin_initial); g_free(pinyinname[i].pinyin_name); } g_free(pinyinname); }