浅析字符编码

维吾尔文unicode编码表 标准的unicode 编码表,提供的是现代维吾尔文的字母,标点符号等字符的编码 立即下载

由于在项目中遇到小语种的坑,要在文本中筛选出来做特殊处理。本以为很快解决的问题,各种google,百度后还是糊里糊涂,一知半解,没有很好找出来,于是决定仔细研究一下字符编码。

        藏文:དུས་དབང

        维文:ئوغلانلىرى

首先要区分编码和编码方式这两个概念

       我们常说的的ascii码,unicode码,gbk码是编码(可以理解为一个码表),而utf8,utf16是编码方式(就像视频压缩方式一样,将视频转化为mp4格式、rmvb格式来存储)

       学计算机的都知道,计算机信息都是以二进制的方式存储的,为了在屏幕上显示这些信息(字符串),60年代美国指定了一套字符编码,对,就是ASCII码,它是编码表,用8位来表示,可以表示256种字符,这个是一一对应的,比如字符0010 0001 就表示‘!’ ,而0100 0001 就表示‘A’ ;

      明显256种是不够的,中文呢?日文呢(やめて)?韩文呢(오빠)?所以计算机科学领域的专家就提出来了Unicode编码,这位兄弟用16位来表示,可以标志65536种字符,我们伟大的中文的unicode编码是0x4E00~0x9FA5;

具体的码表http://blog.youkuaiyun.com/hherima/article/details/9045861

       同样GBK码就是中国人制定,它向下与 GB 2312 编码兼容, 亦采用双字节表示,总体编码范围为 8140-FEFE, 首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。

具体的码表http://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php

       但是unicode编码带来了一些问题,怎么区分assii?如果都用两个字节来表示,那就很浪费存储。

这个时候就需要utf编码方式出现了。

       我们动手做个实验

       分别以utf8编码和unicode编码来输入字符串:jeff是中国人(可以用iconv -c -f utf8 -t unicode 来转换, )然后用od命令来查看存储的二进制文件。

                看不清楚?这样呢?

       

       看到没有,这是极度的浪费存储,因为欧美基本都是英文字符,所以这样肯定不能广泛应用。

       UTF-8是UNICODE的一种变长字符编码,优点就不多说了,自行百度,它和unicode不是一对一的转换的,而是有规则算法转换的,utf8分为1~6字节来存储,具体的转换规则如下

       

       现在是不是阔然开朗了?

实践

       那现在来考考你

       1、根据上面的表,怎么判断utf8里面那些是中文或者说剔除非中文?

       答案:第一步,先将utf8转化unicode ; 第二步,判断unicode码的大小是否在0x4E00~0x9FA5;在实践中,我取了巧,只选取第三行的(三个字节)来判断是否为 中文,主要代码如下。       

         

/获取UTF8码字的长度
        uint16_t UTF8GetWordLength(unsigned char cFirst)
        {
            if (cFirst < 0x80 ) return 1;

            if (cFirst >= 0xC0 &&  cFirst < 0xE0) return 2;

            if (cFirst >= 0xE0 &&  cFirst < 0xF0) return 3;

            if (cFirst >= 0xF0 &&  cFirst < 0xF8) return 4;

            if (cFirst >= 0xF8 &&  cFirst < 0xFC) return 5;

            if (cFirst >= 0xFC ) return 6;

            //码字错误也返回 1 ,依次跳过错误码字使之恢复到正常码字
            return 1;
        }
//转换为unicode判断是否为中文
bool UTF8ChineseChar(unsigned char uc1st, unsigned char uc2nd, unsigned char uc3rd)
        {
            uint64_t ddwUnicode;
            ddwUnicode = (uc1st & 0x0F) << 12;
            ddwUnicode |= (uc2nd & 0x3F) << 6;
            ddwUnicode |= (uc3rd & 0x3F);
            return (ddwUnicode >= 0x4E00 &&  ddwUnicode <= 0x9FA5);
        }

 

     2、怎么将GBK 转化为utf8?(其实中文存储两者大小一样)

     答案:没有捷径,只能先将GBK转化为unicode,再将unicode转化为UTF8;GBK和unicode只两种不同的编码,所以可以通过查表的方式来转换。

      

static const unsigned short tab_GBK_to_UCS2[][2] =  
{  
   /* GBK    Unicode     字 */  
  
    {0x8140, 0x4E02}, // 丂  
    {0x8141, 0x4E04}, // 丄  
    {0x8142, 0x4E05}, // 丅  
    {0x8143, 0x4E06}, // 丆  
    {0x8144, 0x4E0F}, // 丏  
    ... ...  
    {0x817F, 0x0001}, // XXXXX  
    ... ...  
};  

      3、怎么找到我文本的问题,小语种?

     提示在这里可以查询到https://unicode-table.com/cn/blocks/tibetan/
     藏文的unicode编码是0x0F00—0x0FFF
     维文的unicode编码0x0600-0x06FF

      4、那linux下怎么读取utf8和unicode文件?

      答:用可以用字符串的方式打开文件然后用fgets来读取utf8  但是不用用字符串的方式打开unicode文件来读取,必须用二进制的方式然后用fread来读取,因为有的字节是0x00,字符串方式读取就截断。另外不能用strlen来判断中文字数的多少~~

      

   

#include<stdlib.h>
#include<stdio.h>
#include<string.h>


void PrintHex(const char *src,int len )
{
  
  for(int i=0;i<len;i++){
	printf(" %02x",(unsigned char )src[i]); 
  }
  printf("\n");
}


int main(int argc,char ** argv)
{
   FILE *fp;
   if((fp=fopen(argv[1],"r"))==NULL)
   {
   		printf("open file error %s\n",argv[1]);
		exit(0);
   }
   char szLine[512];
   char c;
   while(!feof(fp))
   {
         if(fgets(szLine,512,fp)!=NULL){
              printf("%s len %d \n",szLine,strlen(szLine));
              PrintHex(szLine,strlen(szLine));
         }
   }
   return 1;
}

维吾尔文字符集unicode编码表 标准的现代维吾尔文字符集unicode编码表 立即下载

相关推荐

幸狐RV1106开发板实战:5分钟搞定Yolo8模型部署(附避坑指南)

本文详细介绍了在幸狐RV1106开发板上快速部署YOLOv8模型的实战流程。通过RKNN-Toolkit2工具链,将ONNX模型转换为RV1106 NPU专用的RKNN格式,并完成交叉编译与上板运行。文章重点分享了环境搭建、模型转换的关键步骤以及常见的避坑指南,帮助开发者高效实现边缘AI目标检测应用。

weixin_28677451的博客 913

Unicode 编码表 -来自wiki百科

Unicode 编码表0000-0FFF8000-8FFF10000-10FFF20000-20FFF28000-28FFFE0000-E0FFF  1000-1FFF9000-9FFF 21000-21FFF

WB.HUANG's TIPs 1819

从零开始用TS开发babylonjs - 本机环境搭建

babylonjs,初始化本地安装,web3d引擎

han3527638的专栏 795

维文、哈萨克文、柯尔克孜文检测 (java实现把UTF-8转为unicode)

对于特定语言的检测并不是一个困难的问题:统计一段文字中有多少个字符落在某语言的基本语素集合(例如:中文中的声韵母)中,然后计算比例,就可以给出答案。 已经有ibm的icu在这方面做得很好,而且计算速度很快。但是对于少数民族的语言并未全部提供支持,譬如维文、柯尔克孜文。 因为icu复杂性较高,研究通透,再做二次开发需要一段时间。为了满足当前简单的需求,手写了一个简单的检测程序。原理同上,但是其中...

weixin_30632883的博客 1317

带挂牵引车倒车运动模型推导及仿真实现

半挂牵引车在倒车时,由于鞍座主销的连接限制,其运动方式与乘用车有显著差异。例如,乘用车在右侧倒车入库时,只需确定泊车起点并将方向盘向右打死。相反,牵引车在倒车时需要先向左转方向盘,当铰接角达到防折叠的临界值时,再将方向盘向右转回,以调整牵引车与挂车至直线状态,完成泊车入库。本研究旨在建立一个基于牵引车带挂车倒车运动学模型,该模型基于以下假设: 道路在车辆行驶过程中保持平坦,无凹凸不平; 车辆以低速行驶,且在运行过程中车身不发生侧倾或俯仰; 行驶过程中,轮胎无变形,无侧向滑动,且不产

jianmo的博客 2697

NLTK中WordNet与同义词处理

通过本教程,学习了如何使用NLTK中的WordNet进行自然语言处理任务。首先介绍了WordNet的基本概念及其在NLTK中的集成使用,接着讲解了如何查找同义词、反义词等词汇关系,并结合实际应用演示了语义相似性计算。这些技能在文本分析、情感分析、信息检索等场景中有广泛应用,可以帮助开发者构建更智能的自然语言处理系统。掌握这些基本操作后,可以进一步探索WordNet的其他高级功能,结合其他NLTK工具进行更复杂的语言分析。

Mr数据杨 472

java 维文生成图片_维文、哈萨克文、柯尔克孜文检测 (java实现把UTF-8转为unicode)...

对于特定语言的检测并不是一个困难的问题:统计一段文字中有多少个字符落在某语言的基本语素集合(例如:中文中的声韵母)中,然后计算比例,就可以给出答案。已经有ibm的icu在这方面做得很好,而且计算速度很快。但是对于少数民族的语言并未全部提供支持,譬如维文、柯尔克孜文。因为icu复杂性较高,研究通透,再做二次开发需要一段时间。为了满足当前简单的需求,手写了一个简单的检测程序。原理同上,但是其中的代码有...

weixin_39836530的博客 1049

Microsoft Bitlocker企业级管理部署方案

BitLocker是Windows 10以及更高版本中内置的磁盘加密工具,是一种可靠的数据保护机制,可以保护计算机上的敏感数据不被未经授权的人访问。BitLocker的工作原理是将整个系统卷或其他数据卷加密的同时,向某个可信软件或硬件模块请求密钥解密数据。BitLocker最大的好处在于其内置于Windows系统,所以用户无需安装其他软件或购买额外的许可证或硬件设备。本文将介绍Microsoft BitLocker企业级管理部署方案,包括:BitLocker部署前的准备工作。

xueyunshengling的博客 2075

python 字符编码处理_浅析Python 字符编码与文件处理

Python字符编码目前计算机内存的字符编码都是Unicode,目前国内的windows操作系统采用的是gbk。python2默认的字符编码方式是ASCIIpython3默认的字符编码方式是Unicode.py文件头部的#coding:utf-8是帮助python识别.py文件的编码方式,故在写.py文件时要注意文件头和文件保存时的编码方式要相同,否则可能会出现乱码python程序运行过程:pyt...

weixin_39830588的博客 116

YOLOv8改进 | Conv篇:基于FasterBlock与C2f结构的二次创新,参数量下降70万【附保姆级代码】

通过引入FasterBlock二次创新C2f结构,我们成功地对YOLOv8模型进行了优化,显著降低了其参数量,并提升了推理速度,而精度保持不变甚至有所提升。该模型在多个实际应用场景中展现出了优异的性能,尤其是在嵌入式设备、移动端和自动驾驶等领域,具有广泛的应用潜力。未来的研究将进一步优化模型结构,探索更多的应用场景,为目标检测技术的发展做出贡献。

一键难忘的博客 3215

50、压电微泵与技术设备驱动的研究分析

本文研究了压电微泵在弹性微通道中的流体流动特性及技术设备驱动的振动行为。通过建立轴对称流固耦合模型,利用FreeFem++进行数值模拟,分析了不同数量压电致动器和频率对微泵流量的影响,发现多个致动器按特定时序压缩可产生净正向流量,并提出了稳态流量的近似解析公式。同时,针对技术设备驱动系统,探讨了周期性负载引起的强迫振动特性,明确了共振条件及影响因素,并比较了主动、被动和优化设计等振动控制策略。最后展望了实验验证、多物理场耦合与智能控制等未来研究方向,为相关设备的优化设计与高效运行提供了理论支持。

convnet3designer的博客 148

字符编码浅析

ASCII (American Standard Code for Information Interchange) 美国信息交换标准代码 ASCII是一种单字节字符编码方案,即使用1 byte(字节)= 8 bit(比特位)来表示一个字符。一个字节能表示的最大的整数就是255(二进制 11111111 = 十进制 255),0 - 255被用来表示大小写英文字母、数字和一些符号。但是要表示中文...

mypowerhere的专栏 195

【即插即用模块】注意力篇 | TGRS 2025 | ASD:自适应频域解耦,动态拆分高低频+空间注意力,频域空间特征双增强!

摘要: FDMF-Net提出了一种频域解耦多模态融合网络,核心组件为振幅谱解耦模块(ASD)。ASD通过自适应频域拆分和频域-空域协同增强,有效分离模态不变与模态特定特征。该模块利用MLP学习动态阈值调整高低频比例,并通过空间注意力分别强化频域特征,在遥感语义分割任务中实现了细节与结构的协同增强。实验表明,ASD模块能减少模态内冗余,提升特征判别性,为多模态数据融合提供了新思路。代码已开源,适用于需要强化细节与结构的视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 308

python 执行文件 字符编码_浅析Python 字符编码与文件处理

Python字符编码目前计算机内存的字符编码都是Unicode,目前国内的windows操作系统采用的是gbk。python2默认的字符编码方式是ASCIIpython3默认的字符编码方式是Unicode.py文件头部的#coding:utf-8是帮助python识别.py文件的编码方式,故在写.py文件时要注意文件头和文件保存时的编码方式要相同,否则可能会出现乱码python程序运行过程:pyt...

weixin_39971138的博客 154

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

浅析字符集和字符编码

浅析字符集和字符编码 字符集 即编码字符集(coded character set),可以理解为一个包含了该字符集里每一个元素的key-value表,key是字符,value是该字符对应的二进制序号,学名是代码(又称代码点)。 ASCII:英文字母、数字 ISO 8859:向下兼容ASCII(其前128位即ASCII字符集,编号保持不变),针对不同语言有不同版本 不同ISO版本具体参考这篇☞链接 GB:汉字的字符集,主要有GB2312, GBK,GB1300, GB10830等 Unicod

zwy的博客 201

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

python可以处理任何字符编码文本是对的吗_浅析Python 字符编码与文件处理

目前计算机内存的字符编码都是Unicode,目前国内的windows操作系统采用的是gbk。python2默认的字符编码方式是ASCIIpython3默认的字符编码方式是Unicode.py文件头部的#coding:utf-8是帮助python识别.py文件的编码方式,故在写.py文件时要注意文件头和文件保存时的编码方式要相同,否则可能会出现乱码python程序运行过程:python的解释器现在内...

weixin_39824191的博客 521

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Python学习-字符编码浅析

1.什么是字符编码 字符编码,看名字就是一种字符的编码格式,由于计算机内部采用二进制,想要将人类的语言字符输入到计算机就需要一种编码格式,这就是字符编码.字符-------编码(字符编码表)----->二进制. 计算机存取人类输入的内容并不是直接保存的,因为计算机并不懂人的语言,每个国家还有每个国家的语言.那么怎么办呢?于是就有一种统一的规定,人类输入到内存中的信息都存为unc...

dianzhuohe9411的博客 102

Visual studio 与字符编码浅析

转自:https://blog.youkuaiyun.com/liangbch/article/details/79608635 关于字符编码 1. 西方文字的编码。 1.1 ASCII 码,ASCII是通用的英文字符的编码,对于英文字符,他采用7位2进制数来表示一个英文字符,我们知道1个byte包含8个bit,对于ASCII码来说,最高bit为0. 1.2 ISO 8859,西方广泛使用的编码标准。用...

chenxijie1985的专栏 572

java字符编码原理浅析

 本周遇到一个java乱码问题,于是对java的编码问题做了一些实验和了解。简单分析如下:先看下如下代码:importjava.io.UnsupportedEncodingException;publicclassCharSetTest { publicstaticvoid

abing37的专栏 6329

springmvc字符编码过滤器CharacterEncodingFilter浅析

web.xml spring springmvc 配置字符编码过滤器 characterEncodingFilter

lianjunzongsiling的博客 1万+
上一篇: 分享一个双目测距的项目
下一篇: nginx+lua搭建文件上传下载服务
ExtraMan
博客等级 码龄14年 9粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值