首页 > 其他分享 >字符集与字符编码

字符集与字符编码

时间:2024-08-11 11:27:09浏览次数:12  
标签:编码 字节 字符 字符集 len ANSI wstr NULL

文章目录


ANSI多字节字符集

最初,Internet上只有一种字符集——ANSI(American National Standard Institute)的ASCII(American Standard Code for Information Interchange)字符集。

后来,不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。从ANSI标准派生的字符集被习惯的统称为ANSI字符集,它们正式的名称应该是MBCS(Multi-Byte Chactacter System,即多字节字符系统)。

由字节数据的最高位判断:

  • 最高位为0,代表是单字节,按照ASCII表进行编码
    ASCII编码是用一个字节(8bit)表示的字符编码,其中只用到了7位,表示127个字符。
  • 最高位为1,代表是本地化扩展字符,需要将相邻的两个字节组成一个整体,来进行码值求取,得到的码值对应的本地化字符集中可以得到相应的字符是什么。
    • 简体中文系统下,ANSI编码代表GB2312编码(GBK是GB2312的扩展,兼容GB2312)
    • 繁体中文系统下,ANSI编码代表BIG5编码
    • 日文系统下,ANSI编码代表JIS编码

不同ANSI编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段ANSI编码的文本中。需要将不同的ANSI编码都转换成UTF-8编码,进而存储。

Unicode字符集

Unicode即Universal Multiple-Octet Coded Character Set,通用多八位编码字符集。
国际组织制定的可以容纳世界上所有文字和字符的编码方案,分为多个平面,一般常用0号平面也叫基本多文种平面(Basic Multilingual Plane)即Ox0000-OxFFFF来表示一个字符(对于英文浪费了一个字节)。

  • UTF-8(最主流的编码方式)
    UTF-8是Unicode的实现方式之一,是一种针对Unicode的可变长度字符编码,使用1-4个字节进行编码。
Unicode编号范围码位数UTF-8使用字节数UTF-16使用字节数二进制最大有效位数转换为字节编码
00-7F1281270xxxxxxx
80-7FF19202211110xxxxx 10xxxxxx
800-FFFF6348832161110xxxx 10xxxxxx 10xxxxxx
100000-10FFFF1048576442111110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  • UTF-16
    可变长度字符编码,将字符编码成2字节或者4字节
  • UTF-32
    固定长度的编码,始终占用4字节。

Windows平台的字符转换

头文件<tchar.h>作用就是为了进行ASCII码和UNICODE(wide-character)码的头文件(该头文件由微软提供)

L指令

字符串前面加L表示该字符串是Unicode字符串,可以将ANSI字符串转换为Unicode字符串,就是每个字符占2个字节。

strlen("abc") = 3;
strlen(L"abc") = 6;

_T()宏

_T(“”)是一个宏定义在tchar.h下。

_T()或者TEXT()宏,可以把引号括起来的字符串,根据环境选择合适的编码方式。

  • 如果定义的是Unicode,那么_T(“abc”)就相当于L"abc",也就是宽字符;
  • 如果是多字节编码,那么英文采用单字节,汉字采用双字节;
  • 在Unicode环境下,要求LPCWSTR的地方不可以给一个char*,而在多字节编码下可以。

比如

wchar_t Str[] = L"Hello World!";是双字节存储字符串,_T是与之适配的宏。

当有#ifdef _UNICODE的时候,_T()就是L;

当没有#ifdef _UNICODE的时候,_T()就是ANSI的。

MFC中CString

CString实际是CStringT,也就是模板类

在Unicode环境下,实际是CStringW

在多字符集环境下,实际是CStringA

GB2312与UTF-8的转换

	char* U2G(const char* utf8)
	{
		int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
		wchar_t* wstr = new wchar_t[len + 1];
		memset(wstr, 0, len + 1);
		MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
		len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
		char* str = new char[len + 1];
		memset(str, 0, len + 1);
		WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
		if (wstr) delete[] wstr;
		return str;
	}

	char* G2U(const char* gb2312)
	{
		int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
		wchar_t* wstr = new wchar_t[len + 1];
		memset(wstr, 0, len + 1);
		MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
		len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
		char* str = new char[len + 1];
		memset(str, 0, len + 1);
		WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
		if (wstr) delete[] wstr;
		return str;
	}

标签:编码,字节,字符,字符集,len,ANSI,wstr,NULL
From: https://blog.csdn.net/qq_39281631/article/details/141098322

相关文章

  • 通信编码揭秘:(二)信道编码(汉明码、循环冗余校验码、里德所罗门码)与其应用
    通信编码揭秘:2.信道编码(汉明码、循环冗余校验码、里德所罗门码)与其应用摘要信道编码的目的是提高数据传输的可靠性,确保即使在噪声环境下传输的数据也能被正确接收。本文将探讨汉明码、循环冗余校验(CRC)和里德-所罗门码三种常见的信道编码方法,并通过实际例子说明它们的应用......
  • 【C语言】字符函数和字符串函数
    目录一、字符函数(1)字符分类函数(2)字符转换函数二、字符串函数(1)strlen①函数原型②注意事项③模拟实现函数(2)strcpy①函数原型②注意事项③模拟实现函数(3)strcat①函数原型②注意事项③模拟实现函数(4)strcmp①函数原型②模拟实现函数(5)strncpy①函......
  • C/C++数字与字符串互相转换
    前言:在C/C++程序中,会需要把数字与字符串做出互相转换的操作,用于实现程序想要的效果。下面将介绍多种方法实现数字与字符串互相转换。字符串转为数字一、利用ASCII我们知道每个字符都有一个ASCII码,利用这一点可以将字符-'0'转为数字。在字母大小写转换时也可以利用这个性质......
  • 如何用工具检查 ABAP 代码是否符合 Clean ABAP 编码规范
    本文在ABAP系统里的操作截图,来自SAP社区博客,地址如下:https://community.sap.com/t5/application-development-blog-posts/how-to-enable-clean-code-checks-for-abap/ba-p/13544856https://community.sap.com/t5/technology-blogs-by-sap/clean-code-checks-for-aba......
  • transformer的位置编码具体是如何做的
    VisionTransformer(ViT)位置编码VisionTransformer(ViT)位置编码1.生成位置编码对于每个图像块(patch),根据其位置生成一个对应的编码向量。假设每个图像块的嵌入向量维度为D,则位置编码的维度也是D。ViT通常使用可学习的绝对位置编码,这意味着这些位置编码是在训练过程......
  • 熵编码(五)-CABAC(一) 基础篇
    目录1.前言2.二进制算术编码3.CABAC编码原理分析3.1.自适应算术编码3.1.1.算法流程流程3.1.2.自适应3.1.3.码流输出(区间缩放)3.1.4自适应算术编码的计算复杂度及优化3.1.4.1自适应概率模型背景3.1.4.2.自适应概率模型设计3.1.4.2.1.自适应概率模型量化3.1.4.2.1.自适......
  • Java中字符串的常量池
    计算机存储中存在一个堆区域,堆区域中存在一个常量池,当申请了字符串变量后,会将值放入常量池中,下次申请新的变量时,会优先从常量池中查找,如果常量池中已经存在,则变量会直接指向常量池中的值,从而节省空间(jdk1.8之后的字符串常量池存在于堆中) Stringx1="aaa";//在常量池......
  • 常见 字符串库函数 的使用与模拟实现 #strlen #strcpy #strcat #strcmp#strstr #strto
    文章目录前言路漫漫其修远兮,吾将上下而求索。在C语言之中,提供了字符类型,也有字符串的概念,但是却并没有字符串的类型。没有类型就不方便操作,于是乎就提供了一系列的字符串函数来支持对字符串的操作;一、求字符串长度strlen专门用来求字符串长度的函数size_t strl......
  • 字符串逆序(递归实现)
    题目内容: 编写一个函数reverse_string(char*string)(逆序实现) 实现:将参数字符串中的字符反向排列,不是逆序打印。 要求:不能使用C函数库中的字符串操作函数 比如:char[]="abcdef"   逆序之后是数组内容变成:"fedcba";非函数:#include<stdio.h>intmain(){ ch......
  • C++ int32, int64 和十六进制字符串的转换
       #include<iostream>#include<string>#include<cstring>//用于memset,strlen#include<algorithm>/***@brife:将一个int64数字转为十六进制字符串*@note:int64Value:0,hexStr:0000000000000000int64Value:-1,h......