示例#1
0
        public void ResultOrderTest()
        {
            var str = "你不行,他好不,好么";

            var v = PinyinConvert.ToPinyinSearchFomat(str);

            Assert.AreEqual("NBH,THB,HM;NBX,THB,HM;NBH,THB,HY;NBX,THB,HY;NIBUHANG,TAHAOBU,HAOME;NIBUHENG,TAHAOBU,HAOME;NIBUXING,TAHAOBU,HAOME;NIBUHANG,TAHAOBU,HAOYAO;NIBUHENG,TAHAOBU,HAOYAO;NIBUXING,TAHAOBU,HAOYAO", v);
        }
示例#2
0
        public void ToPinyinsTest()
        {
            var v = PinyinConvert.ToPinyins("行行好吧");

            Assert.AreEqual(9, v.Length);

            Assert.IsTrue(v.Contains("XINGXINGHAOBA"));
            Assert.IsTrue(v.Contains("XINGHENGHAOBA"));
            Assert.IsTrue(v.Contains("XINGHANGHAOBA"));
            Assert.IsTrue(v.Contains("HENGXINGHAOBA"));
            Assert.IsTrue(v.Contains("HENGHENGHAOBA"));
            Assert.IsTrue(v.Contains("HENGHANGHAOBA"));
            Assert.IsTrue(v.Contains("HANGXINGHAOBA"));
            Assert.IsTrue(v.Contains("HANGHENGHAOBA"));
            Assert.IsTrue(v.Contains("HANGHANGHAOBA"));


            v = PinyinConvert.ToPinyins("行行好吧", true);

            Assert.AreEqual(9, v.Length);

            Assert.IsTrue(v.Contains("XINGXINGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("XINGHENGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("XINGHANGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("HENGXINGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("HENGHENGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("HENGHANGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("HANGXINGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("HANGHENGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("HANGHANGHAOBA".ToLower()));


            try
            {
                v = PinyinConvert.ToPinyins(null);
                Assert.Fail("这里应该抛出异常");
            }
            catch
            {
            }

            try
            {
                v = PinyinConvert.ToPinyins("");
                Assert.Fail("这里应该抛出异常");
            }
            catch
            {
            }
        }
示例#3
0
        public void Performance1000()
        {
            Stopwatch watch = new Stopwatch();

            watch.Start();
            Parallel.For(0, 10000, i =>
            {
                //ChineseChar.IsValidChar('行');
                var str = PinyinConvert.ToPinyinSearchFomat("沙发沙发沙发行杀放上士大夫士大夫好士大夫似的空撒旦解放立刻");
            });

            watch.Stop();

            //11000 ms  normal
        }
示例#4
0
        public void BigMemoryTest()
        {
            var str = "长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长";

            var v1 = PinyinConvert.ToPinyins(str);

            Assert.AreEqual(10000, v1.Length);


            var v2 = PinyinConvert.ToPinyinInitials(str);

            Assert.AreEqual(10000, v1.Length);
            var v3 = PinyinConvert.ToPinyinSearchFomat(str, maxLength: 20000);

            Assert.AreEqual(20000, v3.Length);
        }
示例#5
0
        public void ToPinyinInitialsTest()
        {
            var v = PinyinConvert.ToPinyinInitials("行行好吧");

            Assert.AreEqual(4, v.Length);
            Assert.AreEqual(0, System.Array.IndexOf(v, "HHHB"));
            Assert.AreEqual(1, System.Array.IndexOf(v, "XHHB"));
            Assert.AreEqual(2, System.Array.IndexOf(v, "HXHB"));
            Assert.AreEqual(3, System.Array.IndexOf(v, "XXHB"));


            v = PinyinConvert.ToPinyinInitials("行行好吧", true);
            Assert.AreEqual(4, v.Length);
            Assert.AreEqual(0, System.Array.IndexOf(v, "HHHB".ToLower()));
            Assert.AreEqual(1, System.Array.IndexOf(v, "XHHB".ToLower()));
            Assert.AreEqual(2, System.Array.IndexOf(v, "HXHB".ToLower()));
            Assert.AreEqual(3, System.Array.IndexOf(v, "XXHB".ToLower()));


            try
            {
                v = PinyinConvert.ToPinyinInitials(null);
                Assert.Fail("这里应该抛出异常");
            }
            catch
            {
            }

            try
            {
                v = PinyinConvert.ToPinyinInitials("");
                Assert.Fail("这里应该抛出异常");
            }
            catch
            {
            }
        }
示例#6
0
        public void ToPinyinSearchFomatTest()
        {
            var v = PinyinConvert.ToPinyinSearchFomat("行行好吧");

            Assert.IsTrue(v.Contains(";"));
            Assert.IsTrue(v.Contains("XINGXINGHAOBA"));
            Assert.IsTrue(v.Contains("XINGHENGHAOBA"));
            Assert.IsTrue(v.Contains("XINGHANGHAOBA"));
            Assert.IsTrue(v.Contains("HENGXINGHAOBA"));
            Assert.IsTrue(v.Contains("HENGHENGHAOBA"));
            Assert.IsTrue(v.Contains("HENGHANGHAOBA"));
            Assert.IsTrue(v.Contains("HANGXINGHAOBA"));
            Assert.IsTrue(v.Contains("HANGHENGHAOBA"));
            Assert.IsTrue(v.Contains("HANGHANGHAOBA"));
            Assert.IsTrue(v.Contains("XXHB"));
            Assert.IsTrue(v.Contains("XHHB"));
            Assert.IsTrue(v.Contains("HXHB"));
            Assert.IsTrue(v.Contains("HHHB"));

            v = PinyinConvert.ToPinyinSearchFomat("行行好吧", separator: ",", lower: true);
            Assert.IsTrue(v.Contains(","));
            Assert.IsTrue(v.Contains("XINGXINGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("XINGHENGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("XINGHANGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("HENGXINGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("HENGHENGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("HENGHANGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("HANGXINGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("HANGHENGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("HANGHANGHAOBA".ToLower()));
            Assert.IsTrue(v.Contains("XXHB".ToLower()));
            Assert.IsTrue(v.Contains("XHHB".ToLower()));
            Assert.IsTrue(v.Contains("HXHB".ToLower()));
            Assert.IsTrue(v.Contains("HHHB".ToLower()));



            Assert.AreEqual(145, v.Length);

            v = PinyinConvert.ToPinyinSearchFomat("行行好吧", separator: ",", lower: true, maxLength: 100);
            Assert.AreEqual(100, v.Length);

            v = PinyinConvert.ToPinyinSearchFomat("行行好吧", separator: ",", lower: true, maxLength: 0);
            Assert.AreEqual(145, v.Length);

            v = PinyinConvert.ToPinyinSearchFomat("行行好吧", separator: ",", lower: true, maxLength: -1);
            Assert.AreEqual(145, v.Length);

            v = PinyinConvert.ToPinyinSearchFomat("行行好吧", separator: ",", lower: true, maxLength: 146);
            Assert.AreEqual(145, v.Length);


            try
            {
                v = PinyinConvert.ToPinyinSearchFomat(null);
                Assert.Fail("这里应该抛出异常");
            }
            catch
            {
            }

            try
            {
                v = PinyinConvert.ToPinyinSearchFomat("");
                Assert.Fail("这里应该抛出异常");
            }
            catch
            {
            }
        }
示例#7
0
        public void ToPinyins_WithLower_Letter()
        {
            var r = PinyinConvert.ToPinyins("张S");

            Assert.AreEqual("ZHANGS", r[0]);
        }
示例#8
0
        public void ToPinyins_WithUpper_Letter()
        {
            var r = PinyinConvert.ToPinyins("张S", true);

            Assert.AreEqual("zhangs", r[0]);
        }
示例#9
0
        public void ToPinyinInitials_WithLower_Letter()
        {
            var r = PinyinConvert.ToPinyinInitials("张s");

            Assert.AreEqual("ZS", r[0]);
        }
示例#10
0
        /// <summary>
        /// 查询姓名的拼音
        /// </summary>
        /// <returns></returns>
        public string GetChineseNamePinYin(string name)
        {
            //校验姓名是否为空,如果为空,直接抛错
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException(nameof(name));
            }
            //百家姓字典
            Dictionary <string, string> dictionary = GetBaiJiaXing();

            //只有一个字符
            if (name.Length == 1)
            {
                //命中百家姓单姓,直接返回单姓
                if (dictionary.ContainsKey(name))
                {
                    return(dictionary[name]);
                }
                return(PinyinConvert.ToPinyins(name, true)[0]);
            }
            var namePinYin = new StringBuilder();
            var num        = 0;

            //判断key是否存在
            if (dictionary.ContainsKey(name.Substring(0, 2)))
            {
                namePinYin.Append(dictionary[name.Substring(0, 2)]);
                num = 2;
            }
            else
            {
                //判断key是否存在
                if (dictionary.ContainsKey(name.Substring(0, 1)))
                {
                    namePinYin.Append(dictionary[name.Substring(0, 1)]);
                    num = 1;
                }
            }
            //名命中
            var ming = name.Remove(0, num);

            if (ming.Length > 0)
            {
                var redisPinYin = GetDuoYinZi();
                //尝试命中多音字
                foreach (var item in ming)
                {
                    var zi = item.ToString();
                    if (redisPinYin.ContainsKey(zi))
                    {
                        namePinYin.Append(redisPinYin[zi]);
                    }
                    else
                    {
                        //常规拼音转换
                        namePinYin.Append(PinyinConvert.ToPinyins(zi, true)[0]);
                    }
                }
            }
            return(namePinYin.ToString());
        }
示例#11
0
        /// <summary>
        /// 获取姓名拼音
        /// </summary>
        /// <param name="name">姓名</param>
        /// <param name="dbConnect">数据库连接字符串</param>
        /// <param name="redisConnect">redis连接字符串</param>
        /// <param name="cachePrefix">缓存</param>
        /// <param name="expiry">缓存过期时间</param>
        /// <returns>转换后的拼音</returns>
        public static string GetChineseNamePinYin(string name, string dbConnect = null, string redisConnect = null, string cachePrefix = null, DateTime?expiry = null)
        {
            ReadPinYinConfigurationT();
            //校验姓名是否为空,如果为空,直接抛错
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException(nameof(name));
            }
            //只有一个字符
            if (name.Length == 1)
            {
                //命中百家姓单姓,直接返回单姓
                if (dictionary.ContainsKey(name))
                {
                    return(dictionary[name]);
                }
                return(PinyinConvert.ToPinyins(name, true)[0]);
            }
            var namePinYin = new StringBuilder();
            var num        = 0;

            //判断key是否存在
            if (dictionary.ContainsKey(name.Substring(0, 2)))
            {
                namePinYin.Append(dictionary[name.Substring(0, 2)]);
                num = 2;
            }
            else
            {
                //判断key是否存在
                if (dictionary.ContainsKey(name.Substring(0, 1)))
                {
                    namePinYin.Append(dictionary[name.Substring(0, 1)]);
                    num = 1;
                }
            }
            //名命中
            var ming = name.Remove(0, num);

            if (ming.Length > 0)
            {
                //判断dbHost和redisHost是否配置
                if (!string.IsNullOrWhiteSpace(dbConnect) || !string.IsNullOrWhiteSpace(redisConnect))
                {
                    //判断多音字优先字典是否存在
                    var redisPinYin = GetPinyinByRedis(redisConnect, cachePrefix);
                    if (redisPinYin == null || redisPinYin.Count() <= 0)//不存在
                    {
                        //从db获取多音字优先字典
                        redisPinYin = GetPinYinDictionary(dbConnect);
                        //存入redis
                        SetPinYinToRedis(redisPinYin, redisConnect, cachePrefix, expiry);
                    }
                    //尝试命中多音字
                    foreach (var item in ming)
                    {
                        var zi = item.ToString();
                        if (redisPinYin.ContainsKey(zi))
                        {
                            namePinYin.Append(redisPinYin[zi]);
                        }
                        else
                        {
                            //常规拼音转换
                            namePinYin.Append(PinyinConvert.ToPinyins(zi, true)[0]);
                        }
                    }
                }
                else
                {
                    //常规拼音转换
                    namePinYin.Append(PinyinConvert.ToPinyins(ming, true)[0]);
                }
            }
            return(namePinYin.ToString());
        }