在linux环境下,c/c++默认的中文编码为UTF-8,中文的unicode编码是双字节的编码。有趣的是,windows环境下中文utf-8的编码为两个字节,而linux环境下UTF-8的为三个字节,而匹配中文使用正则表达式为

[\u4e00-\u9fa5]

无论你是怎么搜索,百度出来匹配中文的正则基本都是上述的表达式。因此linux环境下3字节的UTF-8也用这个正则来匹配显然是不正确的。

Linux环境下的正则匹配规则中

\un,其中的 n 是一个用四个十六进制数字表示的 Unicode字符。并不支持三个字节的utf-8

\xn,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, '\x41'匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII编码。

因此得考虑将三个字节转变成2个字节,再进行中文的匹配。

先看双字节的unicode是如何转化成三字节的utf-8

   |  Unicode符号范围      |  UTF-8编码方式n |  (十六进制)           | (二进制)
---+-----------------------+------------------------------------------------------1 | 0000 0000 - 0000 007F |                                              0xxxxxxx2 | 0000 0080 - 0000 07FF |                                     110xxxxx 10xxxxxx3 | 0000 0800 - 0000 FFFF |                            1110xxxx 10xxxxxx 10xxxxxx4 | 0001 0000 - 0010 FFFF |                   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx5 | 0020 0000 - 03FF FFFF |          111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx6 | 0400 0000 - 7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

查表可知,

\u4e00-\u9fa5

处于n=3的编码处,例如4E00,那么将它先转化成16进制(不足16位的在前面补0)

0000 1110 0000 0000

根据第三行的格式,也就是将上述16个比特位重新断句

0000 111000 000000

从左至右分别放置到以下的xx处

1110xxxx 10xxxxxx 10xxxxxx

得到三字节的UTF-8编码

11100000 10111000 10000000

也就是0xE0 B8 80

经计算可知,无法只用一个范围来确定三字节的中文要怎么表示,所以还是将其转化成双字节来匹配中文。

将上述推理反推,就能知道三字节的UTF-8如何转变成双字节的unicode编码。既然知道原理,就没有必要再用正则来判断字符是否为中文了。

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
bool is_chinese(const string& str)
{unsigned char utf[4] = {0};unsigned char unicode[3] = {0};bool res = false;for (int i = 0; i < str.length(); i++) {if ((str[i] & 0x80) == 0) {res = false;}else{utf[0] = str[i];utf[1] = str[i + 1];utf[2] = str[i + 2];i++;i++;unicode[0] = ((utf[0] & 0x0F) << 4) | ((utf[1] & 0x3C) >>2);unicode[1] = ((utf[1] & 0x03) << 6) | (utf[2] & 0x3F);if(unicode[0] >= 0x4e && unicode[0] <= 0x9f){if (unicode[0] == 0x9f && unicode[1] > 0xa5)res = false;else         res = true;}elseres = false;}}return res;
}int main(){string str="中国";string str1="asdasfdsfd";string str2="中国";cout << is_chinese(str) <<endl;cout << is_chinese(str1) <<endl;cout << is_chinese(str2) <<endl;return 0;
}

linux c/c++ 判断是否为中文(不包括中文符号,非正则)相关推荐

  1. 最近一波对中文编程(包括中文命名)的攻势

    相信很多人看到了这篇文章: 如果我们的编程替换成中文会变成怎样?-聚能聊-云栖社区-阿里云 由于带着太明显的水文气息, 不禁花点功夫进行探究. 下面是之前的发现(原帖在专用帖: 对中文编程的质疑, 困 ...

  2. linux jdk 编码格式,java中文编码(字符集)分析-中文乱码分析及解决方案

     注:本文部分内容摘自网络,摘抄内容版权归原作者所有. 1.     背景知识 1.1.    Http协议 1.1.1.  URL和URI 1.1.2.  媒体类型定义 HTTP在 Conten ...

  3. LINUX环境下资源下载中文目录及中文文件名称问题

    为什么80%的码农都做不了架构师?>>>    http://www.yeeach.com/2009/04/09/linux%E7%8E%AF%E5%A2%83%E4%B8%8B%E ...

  4. 怎么看linux电脑是不是双核,Linux系统如何判断CPU是双核还是单核

    Linux系统如何判断CPU是双核还是单核 Linux下可以在/proc/cpuinfo中看到每个cpu的详细信息. 但是对于双核的cpu,在cpuinfo中会看到两个cpu.常常会让人误以为是两个单 ...

  5. windows查看linux文件中文,Linux 系统下无法查看Windows 中创建的中文文件名

    标  题: Linux 系统下无法查看Windows 中创建的中文文件名 我是Linux初学者,在网上搜索了很久,经过多次尝试仍然无法解决问题,只好在这里发贴请教了,还望各位高手指点一下. 问题描述: ...

  6. java 判断是否包含中文_java判断字符串中是否包含中文并过滤中文

    java判断字符串中是否包含中文并过滤掉中文,具体内容如下 1.判断字符串中是否包含中文方法封装 /** * 判断字符串中是否包含中文 * @param str * 待校验字符串 * @return ...

  7. linux判断cpu是否过载,Linux CPU 如何判断忙

    原标题:Linux CPU 如何判断忙 摘录自:http://www.ruanyifeng.com/blog/2016/12/user_space_vs_kernel_space.html 学习 Li ...

  8. SQL判断某列中是否包含中文字符、英文字符、纯数字,数据截取

    SQL判断某列中是否包含中文字符.英文字符.纯数字 一.包含中文字符 select * from 表名 where 列名 like '%[吖-座]%' [吖-座]是中文字符集第一个到最后一个的范围,虽 ...

  9. linux中安装openoffice,及解决转pdf时中文乱码或者中文不显示问题【离线】

    linux中安装openoffice[离线] 目录安装openoffice启动openoffice查看openoffice运行状态启动时可能出现的问题openoffice在转pdf时,中文乱码或者中文 ...

  10. linux判断目录是否存在命令,linux shell 中判断文件、目录是否存在的方法

    本文主要介绍了linux shell 中判断文件.目录是否存在的方法,分享给大家 -e filename 如果 filename存在,则为真 -d filename 如果 filename为目录,则为 ...

最新文章

  1. 一、迁移学习与fine-tuning有什么区别?
  2. 展望:模型驱动的深度学习
  3. Java 压缩字符串
  4. 【算法】Kruskal算法(解决最小生成树问题) 含代码实现
  5. leetcode——242. 有效的字母异位词
  6. leetcode1169. 查询无效交易
  7. 零基础入门Python I/O:从print函数开始
  8. sass玩转颜色总结笔记
  9. Python练习:平方值格式化
  10. filereader php,AJAX_File, FileReader 和 Ajax 文件上传实例分析(php),File FileReader 可以干什么? Ajax...
  11. XML内容要有根标签:Extra content at the end of the document
  12. Strut2 annotation配置时action到另一个action跳转参数传递
  13. 书写程序时应遵循的规则_您可能在计算自由职业者率时全错了,因此请遵循此策略...
  14. 可视化大屏设计尺寸_数据可视化大屏设计尺寸怎么定?
  15. java 什么是过滤器_java中的过滤器是什么
  16. coreldraw的线条怎么变成圆头_CDR的一些技巧
  17. 程序员职业技能编写_程序员不需要的不需要编写代码的技能
  18. 带你了解地址分配DHCP,IP地址管理方式及分配原则
  19. 基于U-Net的眼底图像血管分割实例
  20. 合天网安 在线实验 CTF竞赛 writeup(第六周 | 套娃一样的上传、第二十一周 | 你的空格哪去了、第十周 | 试试协议吧、第十一周 | 签到般的包含、第九周 | 试下phpinfo吧)

热门文章

  1. 这场景像不像你修Bug的样子?
  2. 现在的学生太强了,徒手撸了一个小米商城项目(附源码)!
  3. Java 离 Linux 内核有多远?
  4. 经典面试题:在这个场景下,你怎么进行性能调优?
  5. 你想学习Java ?资源都在这里了
  6. Dubbo官方的Starter发布1.0.0测试版,与Spring Boot的结合将更加自然
  7. $.ajax的type属性,$.ajax中contentType属性为“application/json”和“application/x-www-form-urlencoded”的区别...
  8. linux shell脚本字符串连接符,学习Linux shell脚本中连接字符串的方法
  9. java neo4j rest api_Neo4j REST API使用教程
  10. 将矩阵转为一行_矩阵与矩阵乘积简介