今天更新公司内部插件的时候遇到一个问题,就是需要识别一个字符串是中文还是英文,如果字符串中不存在中文字符就要用另一种方法处理。因为以前在学校的时候就没学好C语言和C++的字符串处理,再加上字符串不怎么遇到,有关字符串的知识基本忘完了。

过程:

源数据是从一个Access数据库中读取的字段,然后转化为string字符串。首先想到的是用ASCⅡ码的长度来看。但是网上查了下看到有人说.NET是把string统一处理为Unicode的,不论中英文都是一个字符。查阅了MSDN的.NET手册(4.7.2)后得知,string其实是引用自String类的的类型,一个string其实是一个或多个UTF-16的Unicode 字符的序列。而.NET一个string最多可以存储1亿个char(约2GB)。

通过搜索得知,UTF-16编码的Unicode使用16位无符号整型的格式进行编码,所以一个Unicode字符就是两字节。中文字符的Unicode只位于几个特定范围之内(都是16进制)——4E00-9FA5,2E80-A4CF,F900-FAFF,FE30-FE4F,其中第一个最常用,其他的都是扩展集、部首、象形字、注间字母等。

写了段小代码做实验,发现直接把byte[] bytes_en_cn里面的东西打印出来是一串数字:

114,101,0,101,0,98,0,111,0,107,0,16,149,101,107,

namespace unicode_test_1
{class Program{static void Main(string[] args){string en_cn = "reebok锐步";byte[] bytes_en_cn = Encoding.Unicode.GetBytes(en_cn);foreach (byte i in bytes_en_cn){Console.WriteLine("{0},",i);}Console.Write("rn");Console.ReadKey();}}
}

我:????,然后注意到

|114,0|101,0|101,0|98,0|111,0|107,0|16,149,101,107|
|  r  |  e  |  e  |  b |  o  |  k  |     锐步     | ???

然后猜这可能是十进制的,接着算了下16(十进制)=10(十六进制),149(十进制)=95(十六进制),利用在线的字符/Unicode转换工具得出汉字“锐”的Unicode是38160,这对不上啊。思考了一下想到这两个16进制整数应该是代表一个类似编号的东西,16和149是两个数就不太对了,接着计算一下中文字符的范围4E00-9FA5的十进制表示是19968-40869,38160正好落在中间,算一下38160的十六进制是9510,正好是10,95反过来。再上网一查发现妈个鸡Unicode转换为字符的时候顺序是反过来的。

这样一来,把上面打印出来的数全换成16进制得到

|72,0|65,0|65,0|62,0|6f,0|6b,0|10,95|65,6b|
| r  |  e |  e |  b |  o |  k |     锐步  | 

从后往前看072就是72,十进制为114,6B65的十进制是27493,这下捋顺了。

再写个控制台程序试试能不能在字符串“reebok锐步”中找出中文,这里我用了一个很直接的办法,当然实际上实现这一目的的方法是很多的,比如正则表达式(但是本菜鸡不太会)。

namespace unicode_test_1
{class Program{static void Main(string[] args){string en_cn = "reebok锐步";char[] name = en_cn.ToCharArray();byte[] bytes_en_cn = Encoding.Unicode.GetBytes(en_cn);Console.Write("字符数组name:");foreach (char i in name){Console.WriteLine("{0},",i);}Console.Write("rn");Console.Write("直接显示byte:");foreach (byte i in bytes_en_cn){Console.WriteLine("{0},",i);}Console.Write("rn");Console.WriteLine("显示为16位");foreach (byte i in bytes_en_cn){Console.Write("{0:X},", i);}Console.Write("rn");Console.Write("结果:");foreach (char i in name){if (i >= 0x4e00 && i <= 0x9fa5){Console.Write("{0},", i);}}Console.ReadKey();}}
}

结果:

这里还有一点不太明白的就是为啥前两个遍历除了第一个元素每一个都在打印的时候换行了??

参考资料:

https://www.iteye.com/topic/977671​www.iteye.comhttps://blog.csdn.net/u011511086/article/details/72865006​blog.csdn.netString Class (System)​docs.microsoft.com

getbytes方法_关于C#中识别和查找中英文字符串的解决方法和字符串处理方式的笔记...相关推荐

  1. java中日期比较方法_在java中进行日期时间比较的4种方法

    1. Date.compareTo() java.util.Date 提供了在 Java 中比较两个日期的经典方法compareTo(). 如果两个日期相等,则返回值为0. 如果Date在date参数 ...

  2. getparameter方法中文显示问号解决方法_电脑显示器花屏怎么办 电脑显示器花屏解决方法【原因分析】...

    本文告诉大家电脑显示器花屏怎么办呢,电脑显示器花屏解决方法和原因分析: 指电脑屏幕上有与常色不同的条纹,斑点或色块,或有位置颠倒.错乱,屏幕抖动.扭曲等情况. 显示器花屏是极其常见的故障,产生的原因有 ...

  3. idea卡顿的解决方法_《王者荣耀》卡顿及无法下载资源解决方法说明 5周年祈愿活动出错了怎么办...

    导读 王者荣耀5周年祈愿活动出错了怎么处理?在王者荣耀的游戏中,5周年祈愿活动会让玩家回答两个问题,回答正确的玩家将 有机会获得永久英雄和皮肤,但是玩家在更新版本的过程中却遇到卡顿及无法下载资源的问题 ...

  4. systemctl start named失败的解决方法_京东白条激活失败什么原因怎么办 开通不了解决方法...

    [闽南网] 白条是京东推出的先消费,后付款的全新支付方式,可以免费享受账期内延后付款或者最长24期的分期付款方式,另外急需一笔资金应急的小伙伴也可以尝试开通,可是部分用户在激活时提示无法提供该服务,这 ...

  5. cad2014卡顿的解决方法_微软Office打开文件卡顿、缓慢的解决方法

    最近电脑运行比较忙,从网上找了一个解决方法,试过以后果然很好用,现在分享给大家,大家可以保存,今后电脑卡顿了可以试试. 一.问题描述 1.我最近安装了office2016,但是在打开新版的Office ...

  6. 苹果闪退解决方法_关于10月16日csgo闪退的解决方法

    今天中午12点更新后,csgo无法进入,黑屏闪退,尝试了各种办法,首先这是v社更新的bug,文件完整性是无缺失的,steam其他游戏可以进入,不要怀疑自己电脑的问题. 解决方法可以直接重置电脑网络配置 ...

  7. java配置解决方法_如何配置Java环境变量及可能出现问题的解决方法

    配置java环境变量: 1.开发环境相关: 1)JDK:JavaDevelopmentKItJava开发工具包 2)JRE:JavaRuntimeEnvironmentJava运行环境 3)JVM:J ...

  8. ft2232驱动安装方法_教你win10系统显卡驱动安装失败的解决方法「系统天地」

    我们日常在对电脑的使用过程中,经常都会遇到这样或那样的问题.比如说win10系统显卡驱动安装失败该怎么办呢?别着急,还有小编在呢?接下来小编就来告诉大家win10电脑系统显卡驱动安装失败怎么解决. 详 ...

  9. mysql自增列修改方法_如何修改自增列值以及相应的解决方法

    今天工作中遇到特殊的一个任务,就是将两个自增列值的进行对调变更. SQL Server 平台修改自增列值 由于之前处理过sql server数据库的迁移工作,尝试过其自增列值的变更,但是通过SQL 语 ...

最新文章

  1. StingBuffer
  2. lol服务器显示未知错误,运行英雄联盟出现未知错误的处理方法
  3. ROW_NUMBER() 分页
  4. JUC多线程:CountDownLatch、CyclicBarrier、Semaphore同步器原理总结
  5. Bigraph Extension
  6. Android Splash闪屏页秒开 Activity白屏、Activity黑屏问题
  7. 31岁博士副县长拟提任正处,3年前毕业被人才引进
  8. 打钱!我的数据库被黑客勒索了!
  9. 手动制作python安装模块
  10. 职称计算机xp系统试题,2020年职称计算机WindowsXP测试题及答案.doc
  11. 智能移动项目打包发布经验交流
  12. python数据结构与算法分析 第2版_题库 | 百度数据结构 / 算法面试题型介绍及解析 第 2 期...
  13. 人工智能python3+tensorflow人脸识别_Tensorflow+opencv2实现人脸识别
  14. Cookie、Session、Token、RefreshToken
  15. 传说中的世界500强面试题-推理能力(1)
  16. 牛客小白月赛5-E-面积(area)(波尔约-格维也定理+皮克公式)
  17. emc re 整改 超标_CE认证EMC测试不合格,如何整改 ;
  18. bh1750采集流程图_基于BH1750的光照度检测)教程.doc
  19. 【docker】三、Permission denied与sudo命令
  20. TC358779XBG,HDMI转MIPI DSI,支持全高清,东芝转接芯片

热门文章

  1. 下载、安装、配置 java jdk1.8
  2. Layui Excle/csv数据导出
  3. 使用ExpandableListView以及如何优化view的显示减少内存占用
  4. 求助大神!怎样除去XML节点反复的值的数据
  5. Mac OS X 使用命令sed替换tab
  6. Cruise Control
  7. 偶然发现的QQ的一个挺讨厌的BUG
  8. 在局域网访问_管理Windows访问凭证,快速访问局域网上的共享资源
  9. addroutes刷新_vue 解决addRoutes动态添加路由后刷新失效问题
  10. 转换图像分辨率c++代码_哈工大等提出轻量级盲超分辨模型LESRCNN,代码已开源...