c# .Net Core 判断字符串是否为英文(包括符号)

做短信网关程序, 有英文和非英文短信的计费问题. 需要根据短信内容类型来确定条数.
英文短信为140个字符为一条, 非英文内容的则为70个字符为一条.
该方法的原理是根据字符编码规范来检查是否是纯英文字符.
UTF8编码规范中, 中文为3或者4位, ASCII字符为1位, 只需要将内容转换为UTF8码后判断长度是否和原内容一致即可.

public static bool IsEn(string content){
    if(string.IsNullOrWhiteSpace(content))
    {
        return false;
    }
    var bytes = Encoding.UTF8.GetBytes(content);
    bool result = bytes.Length == content.Length;
    return result;
}

示例代码如下

using System;
using System.Diagnostics;
using System.Text;

namespace ConsoleDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] arr = new[] {"张三", "zhangsan", "张三aa", "zhangsan123.//*-" };
            for (int i = 0; i < arr.Length; i++)
            {
                Console.WriteLine($"'{arr[i]}' 为 {(IsEn(arr[i])? "英文" : "非英文")}");
            }

            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 0; i < 100000; i++)
            {
                IsEn("zhangsan11111");
            }
            sw.Stop();
            Console.WriteLine($"英文循环10万次用时{sw.ElapsedMilliseconds} 毫秒");

            Stopwatch sw1 = new Stopwatch();
            sw1.Start();
            for (int i = 0; i < 100000; i++)
            {
                IsEn("张三zhangsan11111");
            }
            sw1.Stop();
            Console.WriteLine($"非英文循环10万次用时{sw1.ElapsedMilliseconds} 毫秒");
        }

        public static bool IsEn(string content)
        {
            if (string.IsNullOrWhiteSpace(content))
            {
                return false;
            }
            var bytes = Encoding.UTF8.GetBytes(content);
            bool result = bytes.Length == content.Length;
            return result;
        }
    }
}

执行结果

'张三' 为 非英文
'zhangsan' 为 英文
'张三aa' 为 非英文
'zhangsan123.//*-' 为 英文
英文循环10万次用时7 毫秒
非英文循环10万次用时7 毫秒

发表评论

电子邮件地址不会被公开。 必填项已用*标注