七库下载 手游攻略 手游攻略 字符c对应的ascii码值是多少,字符编码c语言

字符c对应的ascii码值是多少,字符编码c语言

时间:2024-04-21 10:22:01 来源:头条 浏览:0

在计算机世界中,只有二进制数0和1,但它们是如何表示和显示字符的呢?

表示字符肯定是通过编码进行数字化、二值化。例如,ASCII编码方案使用65来表示字母A。

如何显示字母A?它可以显示为位图,当然也可以显示为函数定义的矢量图。

不同的编码方案对应不同的字符集。

使用一个字节进行编码就足以表示所有英文字母、数字以及ASCII编码等常见的标点符号。

随着更多的字节用于编码,可以表示的字符数量自然会增加。如果使用多个字节(例如4 个字节)进行编码,则实际上不需要4 个字节来存储编码序列开头的字符。第一个字节就够了,然后是2个字节,然后是3个字节,那么只有序列的最后一个字节需要使用4个字节,因此可以使用相同的编码方案使用不同的存储方案。这就是Unicode编码和UTF(Unicode Transformation Format)的关系。前者是一种编码方式,后者是Unicode编码的存储方式(存储实现)。

Unicode是由一个国际组织设计的,可以用于世界各地的所有语言。 Unicode的学名是“通用多八位字节编码字符集”,简称UCS。 UCS 可以看作是“Unicode 字符集”的缩写。

大端(big endian)和小端(little endian)是CPU处理多字节数字的不同方式,各自有不同的优缺点。例如,字符“汉”的Unicode 编码是6C49。那么,写入文件时,应该在前面写6C还是在前面写49呢?如果6C写在开头,那就是big endian。如果49写在开头,就是little endian。

所有Intel x86系列CPU都采用Little Endian模式,这样可以节省内存(因为如果将序列开头的某些编码存储在多个字节中,则高字节都为0)并且消除了类型转换时的截断,操作方便。 (无需更改内存地址)。 Motorola680x CPU采用big-endian对齐,Java虚拟机字节顺序是big-endian,网络字节顺序也是big-endian。

所有需要处理文本的操作系统、应用程序和文件都必须考虑字符编码和字符集选择的问题。

1 设置操作系统代码页和区域设置如今,Windows 内核已经支持Unicode 字符集,这使得内核可以支持世界上所有语言。然而,现有的许多程序和文档都使用特定的语言编码,例如GBK,因此Windows 不可能在不支持现有编码的情况下完全使用Unicode。

Windows使用代码页来适应不同的国家和地区。代码页可以理解为内部代码。 GBK对应的代码页是CP936。

如果操作系统的系统区域设置设置为简体中文,则根据GB2312 编码解析两个连续的扩展ASCII 码。

#include using namespace std;int main(){ char* pStr='Gaaa'; //1 个汉字、1 个字母、1 个双字节cout 的输出结果如下。

6ffffffceffffffd2 “I”在GB2312中的编码是ced2。 GB2312 还兼容ASCII。

虽然GB2312作为一个整体可以按照上面的方式进行处理,但是当它被分解成单个字符时就会出现处理问题,此时就需要显式地使用Unicode编码来进行处理。

string str='china'; cout str.length() C95 支持两种表示大字符集的方式:宽字符(字符集中的每个字符使用相同的位长度)和多字节字符,其中每个字符可以从1 到多个字节,特定字节序列的字符值由字符串或流所处的环境决定。

多字节字符和宽字符(即wchar_t)之间的主要区别在于,宽字符占用相同的字节数,而多字节字符占用不同的字节数。这种表示形式使多字节字符串比宽字符更大。 使用字符串更加困难。例如,字符“A”可以用一个字节表示,但不能使用简单的字节比较来在多字节字符串中查找该字符。即使在特定位置字节找到匹配的字符串,该字节也可能不是字符,而是另一个不同字符的一部分。

如果您不使用setlocale 函数设置程序中的其他参数(例如空格),则程序运行时区域设置将初始化为默认的C 区域设置。使用的字符编码是所有本地ANSI字符集编码的公共部分,并且是用于编写C语言源程序的最小字符集。

#include #include #include //_T()#include int main(){ wchar_t wcs[3]=L'Chinese'; char *p1,*p2; //设置区域设置或设置区域设置信息Get p1=setlocale ( LC_ALL, NULL); p2=setlocale(LC_ALL, ''); //'' 代表默认本地环境,如'chs' wprintf(L'%ls\n', wcs); printf('区域设置: %s\n', p1); printf('区域设置: %s\n', p2); while(1); return 0;}/*中文区域设置: C 区域设置: 中文(简体)_中华人民共和国中国.936*/2文本文件编码方案并保存在Windows记事本中,可以在GBK、Unicode、Unicode big endian、UTF-8编码之间进行转换,使用“另存为”。

这也是一个txt文件,但是Windows是如何识别编码方式的呢?

当软件打开文本时,它首先确定保存文本的字符集和编码。该软件有三种方法来确定文本的字符集和编码。最标准的方法是在文件的开头写入元数据(关于数据的数据),如下表所示。

起始字节的字符集/编码

EF BB BF UTF-8 FE FF UTF-16/UCS-2,小端

FF FE UTF-16/UCS-2,大端

FF FE 00 00 UTF-32/UCS-4,小端。

00 00 FE FF UTF-32/UCS-4,大端。

UTF-8使用字节作为编码单位,因此不存在字节顺序问题。 UTF-16使用2个字节作为编码单元。在解释UTF-16文本之前,必须首先了解每个编码单元的字节顺序。例如,“Kui”的Unicode编码是594E,“B”的Unicode编码是4E59。如果我收到一个UTF-16字节流“594E”,这是“Ku”还是“B”?

Unicode 规范中推荐的标记字节顺序的方法是BOM。 BOM 是字节顺序标记,而不是“物料清单”BOM 列表。 BOM 是一个有点聪明的想法。

UCS 编码具有字符“ZERO WIDTH NO-BREAK SPACE”,其编码为FEFF。 FFFE是UCS中不存在的字符,所以在实际传输中不应该出现。 UCS 规范建议在发送字节流之前发送字符“ZERO WIDTH NO-BREAK SPACE”。

这样,如果接收方收到FEFF,则表明该字节流是大端字节流,如果接收方收到FFFE,则表明该字节流是小端字节流。因此,文字“ZERO WIDTH NO-BREAK SPACE”也称为BOM。

例如,如果您使用bat 重定向来生成文本文件,则可以在第一行声明chcp,如下所示:

chcp 65001echo ^more.htmlecho 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'^ more.htmlecho ^ more.htmlecho ^ more.htmlecho ^ more.htmlecho ^ more.htmlecho ^内容^^ 详细信息.html中生成的more.html文件对应的存储方式是chcp 65001对应的存储方式,即UTF-8。

3 编程中的编译环境字符集设置、字符类型和库函数在强类型语言中,不同的字符集对应不同的字符类型,常量需要不同的标签,库函数有不同的版本,我们提供

3.1 编译环境字符集设置

VC6 中使用的默认配置是Multibyte (_MBCS),它是非Unicode,而VC2010 中使用的默认配置是Unicode。

不同的字符集设置使用不同的类型和库函数。

//ANSI:charbuffer[8];sprintf(buffer,'Time%d',123); //Unicodewcharbuffer[8];swprintf(buffer,L'Time%d',123);下面以VC6.0 配置为例提供了UNICODE 编译环境来说明一些细节。

I 安装完成后: VC98\MFC\LIB 下的MFC42U.LIB 和MFC42UD.LIB 必须手动复制到相应的安装目录下II 在工程中添加UNICODE 和_UNICODE 预处理选项:【工程】打开设置。]对话框中,从C/C++标签对话框的“预处理器定义”中删除_MBCS(多位字符集),并添加_UNICODE和UNICODE。 (请注意,它们之间用逗号分隔。)在定义UNICODE 和_UNICODE 之前,所有函数和类型都默认为ANSI 版本,但是在定义UNICODE 和_UNICODE 后,所有MFC 类和Windows API 都是宽字节版本。 III 配置程序入口点:MFC 应用程序具有仅限Unicode 的程序入口点,因此必须配置入口点。否则您将收到连接错误。要设置入口点,请打开[Project] [Settings.]对话框,然后在链接页面的输出类别的入口点中输入wWinMainCRTStartup。四、使用常见的ANSI/Unicode数据类型:微软提供了兼容ANSI和Unicode的常见数据类型或宏,如_T、TCHAR、LPTSTR、LPCTSTR等。顺便说一下,LPCTSTR 和const TCHAR* 是完全相同的。 L 代表长指针,是从Windows 3.1 等16 位操作系统继承下来的,而长指针、近指针和远修饰符都是为了与Win32 等32 位操作系统兼容。它没有实际意义。 P(指针)表示这是一个指针,C(const)表示这是一个常量,T(_T宏)表示它兼容ANSI和Unicode,STR(字符串)表示这个变量是一个字符串。总而言之,我们可以看到LPCTSTR 表示一个指向常量固定地址的字符串,该常量的语义可以根据某些宏定义而改变。例如:

TCHAR* szText=_T("Hello!");TCHAR szText[]=_T("I Love You");LPCTSTR lpszText=_T("HelloEveryone!"); 最好更改函数内的参数。示例: MessageBox(_T("Hello")); 事实上,在上面的语句中,MessageBox 函数会自动强制转换“Hello”字符串,而无需添加_T 宏。但是,我们建议使用_T 宏来表明您了解Unicode 编码。

3.2 字符类型

3.2.1 人物

char 关键字指定一个8 位数据项。

char 关键字指定一个8 位数据项。

默认情况下,char 相当于unsigned char。

对应的ANSI字符集(_MBCS)是char类型。

3.2.2 wchar_t

wchar_t 是宽类型。

wchar_t 关键字指定Wide_character 类型。 MSDN 关于wchar_t 的注释也指出了这一点: wchar_t 类型由MIDL 定义为16 位无符号短整型。 wchar_t可以重新定义,可以声明为const,只要不与之前的定义冲突即可。 通过在wchar_t 之前使用L 字符或使用字符串常量来指定wchar_t 常量。 Unicode字符集对应wchar_t类型。

wchar_t中的字符t可以理解为typedef。

3.2.3 TCHAR 对于Windows 程序,TCHAR 是一个映射宏。如果定义了UNICODE,则数据类型将映射到wchar_t。如果未定义UNICODE,则数据类型映射为char。如果程序定义为UNICODE,则TCHAR定义为wchar_t(16位字符类型),否则TCHAR定义为char(8位字符类型)。 TCHAR中的字符T可以理解为TEXT(参见下面3.3中字符串常量的定义)。

3.2.4 字符串

该类型定义了一个具体的char类型的类模板字符串,属于STL模板类库。

typedef Basic_string string;此类型描述了模板类Basic_string 对char 类型元素的特化。

3.2.5 CString

CString是MFC的模板类库。 CString 没有基类; CString 对象由可变长度的有序字符组成; CString 是基于TCHAR 的数据类型。如果程序定义为UNICODE,则TCHAR 定义为wchar_t,其中wchar_t 为(16 位字符类型);否则,TCHAR 定义为char(8 位字符类型)。在Unicode 中,CString 对象由16 位字符组成。如果没有Uniconde,CString 由8 位长的字符组成。

3.2.6 Windows32上一些特殊的字符串指针定义

PWSTR 指向Unicode 字符串的指针。

PCWSTR 常量指向Unicode 字符串的指针。

相应的ANSI 数据类型是CHAR、LPSTR 和LPCSTR。

常见的ANSI/Unicode 数据类型有TCHAR、PTSTR 和LPCTSTR。

LPSTR=char * LPCSTR=const char * LPWSTR=wchar_t * LPCWSTR=const wchar_t * LPOLESTR=OLECHAR *=BSTR=LPWSTR(Win32) LPCOLESTR=const OLECHAR *=LPCWSTR(Win32) LPTSTR=_TCHAR * LPCTSTR=const _TCHAR *3.3 常量代表一个字符串

在开头添加L 表示该字符串是Unicode 字符串。

_T 是一个宏。如果项目使用Unicode 字符集(定义了UNICODE 宏),则会自动在字符串前面添加L,否则字符串不会发生变化。因此,Visual C++ 在定义字符串时使用_T 来实现兼容性。 VC 支持两种字符类型:ASCII 和Unicode,使用_T 可以消除从ASCII 编码类型转换为Unicode 编码类型时更改程序的需要。

ANSI 字符串文字写为: "abc string" Unicode 字符串文字写为: L"abc string" ANSI/Unicode 字符串文字写为: T("abc string") 或_TEXT("abc string" ) 语句以下三行:

TCHAR szStr1[]=TEXT('str1');char szStr2[]='str2';WCHAR szStr3[]=L('str3');TEXT、_TEXT、_T 相同。如果定义了UNICODE,则语句的第一行解释为语句的第三行,如果未定义UNICODE,则等于语句的第二行。但是,无论是否定义了UNICODE,该语句的第二行都会生成一个ANSI 字符串,而该语句的第三行始终会生成一个UNICODE 字符串。我们建议使用第一种表示形式以实现程序可移植性。但是,在某些情况下,如果某些字符必须是ANSI 或UNICODE,请使用后两种方法。

3.4 库函数

ANSI 数学函数以str 开头,例如strcpy()、strcat() 和strlen()。

Unicode 操作函数以wcs 开头,例如wcscpy、wcscpy () 和wcslen()。

MBCS操作函数以_mbs _mbscpy开头

以_tcscpy 开头的_tcs ANSI/Unicode 数学函数(C 运行时库)

以lstr lstrcpy 开头的ANSI/Unicode 数学函数(Windows 函数)

在Windows 上,所有新的和未过时的函数都有ANSI 和Unicode 版本。 ANSI 版本的函数以A 结尾,Unicode 版本的函数以W 结尾。

Microsoft 设计了适用于Unicode 的Windows API,以便最大限度地减少代码影响。事实上,您可以创建一个可以使用或不使用Unicode 进行编译的单个源代码文件。要修改和重新编译源文件,只需定义两个宏(UNICODE 和_UNICODE)。

_UNICODE 宏用于C 运行时头文件,UNICODE 宏用于Windows 头文件。编译源代码模块时,通常需要同时定义这两个宏。

#ifdef UNICODE#define CreateWindowEx CreateWindowExW#else#define CreateWindowEx CreateWindowExA#endif //!UNICODE3.5 类型转换(Windows 程序)

使用MultiByteTowideChar() 将Unicode 转换为ANSI。

使用WideCharToMultiByte() 将ANSI 转换为Unicode。

void CString2Char(CString str, char ch[]) { int i;char *tmpch;int wLen=WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);//Char tmpch 长度Get=new char[wLen + 1]; //分配变量地址大小WideCharToMultiByte(CP_ACP, 0, str, -1, tmpch, wLen, NULL, NULL); //CString 给char*for(i=0 ); tmpch [i ] !='/0'; i++) ch[i]=tmpch[i]; ch[i]='/0'; }3.6 创建符合ANSI 和Unicode 的应用程序我应该做什么?

a 编程时使用TCHAR 数据类型。该类型可以根据预编译宏定义转换为ANSI 或Unicode。

b 对字节、字节指针和数据缓存使用显式数据类型(例如BYTE 和PBYTE)。

c 对文字字符和字符串使用TEXT 宏。

d 预编译宏_MBCS、_UNICODE 和UNICODE。 _MBCS 是用于多字节和ANSI 字符串的编译宏。此时,TCHAR 转换为char。 _UNICODE 和UNICODE 是用于Unicode 编码的预编译宏,它将TCHAR 转换为wchar_t。编译时不能同时定义_UNICODE、UNICODE、_MBCS。 _UNICODE 宏用于C 运行时库头文件,UNICODE 宏用于Windows 头文件。这两个宏通常是同时定义的。

e 修复字符串操作问题。例如,函数通常希望以字符而不是字节形式传递缓存大小。这意味着您需要传递(sizeof(szBuffer)/sizeof(TCHAR),而不是传递sizeof(szBuffer)。您还需要为字符串分配一块内存,并且如果您需要字符数,请记住,不要忘记以字节为单位分配内存,这意味着你应该调用malloc(nCharacters *sizeof(TCHAR)) 而不是malloc(nCharacters) 的意思。

4 要使用特定编码读取和写入文件,请参阅以下示例。

void test(){ CFile myFile; if ( myFile.Open( _T('c:\\myfile.txt'), CFile:modeCreate | CFile:modeReadWrite ) ) { CString str=TEXT('a w'); //myFile.Write(' \xff\xfe',2); myFile.Write( str, str.GetLength()*sizeof(TCHAR) ); myFile.Flush(); }} 运行程序并使用Wordpad、Notepad、Memopad++,当我打开每个文件时在UE(UEdit)中查看mfile.txt,发现有的可以正常显示,有的则乱码。您需要知道写入myfile.txt 的是两个字符的Unicode 编码。使用文本程序打开myfile.txt。如果程序默认读取文本并按照Unicode进行解析,就不会出现乱码。否则会出现乱码。如果删除注释代码行中的注释,则在支持Unicode 的文本程序中打开myfile.txt 时将不会收到错误。这是因为文本中的前两个字节FF FE 暴露给尝试打开文件的程序。 text:表示文本应该以Unicode解析(使用NotePad++以Unicode格式创建一些新文本,随意保存一些字符,然后使用UE解析它)它可以以十六进制格式显示(你可能可以通过前两个,Unicode 文本字节是FF FE)。如何将CString 转换为char*? 在问这个问题之前,你需要知道你的目的是什么,为什么需要执行这样的转换,以及你当前的项目是否有Unicode 最好先问自己是否是配置。如果设置了Unicode,您应该知道CString 存储的是Unicode 字符串。将其转换为char* 后,如果直接显示此char* 或将其写入文件并打开它(不在文件开头写入FF FE)那么是(打开文件的程序不会解析它默认情况下为Unicode) ) 转换为char* 在这种情况下没有多大意义,因为您会看到乱码。转换为char*。这是完全可以实现的。本质上,这只是检索Unicode 字符串“alive”的内存内容。不管怎样,下面的代码重新修改了OnInitDialog函数来演示一些情况。

void test(){ CFile myFileW,myFileA,myFileCharArrow,myFileWOrA; if ( myFileW.Open( _T('c:\\myfileW.txt'), CFile:modeCreate | CFile:modeReadWrite ) myFileA.Open( _T('c:\\myfileA.txt') ), CFile:modeCreate | CFile:modeReadWrite ) myFileCharArrow.Open( _T('c:\\myfileCharArrow.txt'), CFile:modeCreate | CFile:modeReadWrite ) myFileWOrA.Open( _T('c3 33 60\\myFileWO rA.txt'), CFile:modeCreate | CFile:modeReadWrite )) { CString strW=TEXT('aself');//本项目设置Unicode字符集,CString替换为CStringW CStringA strA(strW); myFileW.Write( strW, strW.GetLength()*2) ; myFileW.Flush ( ); myFileA.Write(strA,strA.GetLength()); myFileA.Flush(); //GetString 或CString 返回的const 指针。

右边强转,要么左边用const类型的char*去接 //注意指针命名:p是pointer,c是const,如果有t则是TEXT,w是wide,l是long char* pstr=(char*)strA.GetString(); /* 下面这行代码若不注掉,会报错,因为本程序是Unicode程序, * strW会是一个CStringW类型的字符串,它的GetString返回的是LPCWSTR类型指针 * 当然不能赋值给LPCSTR类型指针了,一个是const wchar_t*,另一个是const char* */ //const char* pcstr1=strW.GetString(); myFileCharArrow.Write(pstr,strlen(pstr)); myFileCharArrow.Flush(); // 假设我们在编程中,不知道有没有使用Unicode设置,为了通用, // 我们可以尽量使用宏及通用版本的相关函数(如_tcslen) CString strWOrA=TEXT("a我"); //注意这里的TCHAR不一定就是wchar_t,这取决于程序是否设置了Unicode const TCHAR* pctstr=strWOrA.GetString();//CString的GetString返回的是const指针 myFileWOrA.Write(ptstr,_tcslen(pctstr)*sizeof(TCHAR)); myFileWOrA.Flush();}}其中,CED2是”我“的GB2312编码,6211(注意字节高低次序)是”我“的Unicode编码,我们可知,CStringA strA(strW)这行代码,一定进行了码表间的转换。 GB2312编码查询: https://wwuhn.github.io/witisoPC/21/code/GB2312简体中文编码表.html Unicode编码查询: https://wwuhn.github.io/witisoPC/21/code/Unicode汉字编码表(中日韩).html 实例2:将文本框内容写入一个utf-8的html文件: //string path = (const_casteNovel).GetBuffer(0); CString path = eNovel; CString dir,fn; GetDlgItem(IDC_title2)->GetWindowText(dir); GetDlgItem(IDC_new2)->GetWindowText(fn); CString contents; GetDlgItem(IDC_textbox)->GetWindowText(contents); path += dir+"\\"; string fname = path.GetBuffer(0); fname += fn.GetBuffer(0); fname += ".html"; ofstream ofs(fname.c_str(),fstream::out); //可以新建文件,但不能新建路径 if(!ofs) { string str = fname+"文件没有正常打开"; GetDlgItem(IDC_status)->SetWindowText(str.c_str()); return; } string strLine; // 写入文件框内容,需要UTF-8的格式写入,否则是乱码 wchar_t* wszString = contents.AllocSysString(); // unicode to UTF8 //预转换,得到所需空间的大小 int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL); //同上,分配空间要给'\0'留个空间 //UTF8虽然是Unicode的压缩形式,但也是多字节字符串,所以可以以char的形式保存 char* szU8 = new char[u8Len + 1]; //转换 //unicode版对应的strlen是wcslen ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), szU8, u8Len, NULL, NULL); //最后加上'\0' szU8[u8Len] = '\0'; //MessageBox不支持UTF8 //写文本文件,UTF8-BOM的标识符是0xbfbbef //文件开头 //cFile.SeekToBegin(); ofs.seekp(0,ios::beg); //写BOM,低位写在前 //cFile.Write("\xef\xbb\xbf", 3); ofs<<"\xef\xbb\xbf"; //写入内容 //cFile.SeekToEnd(); //ofs.seekp(0,ios::end); ofs.seekp(ios::end); //mFile.Write(sUNICODE,sizeof(sUNICODE)); //将文件变为UNICODE编码 //cFile.Write(szU8, u8Len * sizeof(char)); ofs< ref https://blog.csdn.net/garfield2005/article/details/7681299
标题:字符c对应的ascii码值是多少,字符编码c语言
链接:https://www.7kxz.com/news/gl/23213.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
天地劫幽城再临归真4-5攻略:第四章归真4-5八回合图文通关教学

天地劫幽城再临归真4-5攻略:第四章归真4-5八回合图文通关教学[多图],天地劫幽城再临归真4-5怎么样八回合内通

2024-04-21
航海王热血航线艾尼路怎么玩?艾尼路加点连招攻略大全

航海王热血航线艾尼路怎么玩?艾尼路加点连招攻略大全[多图],航海王热血航线艾尼路怎么加点?艾尼路怎么连招?关

2024-04-21
坎公骑冠剑国际服怎么玩?国际服新手攻略

坎公骑冠剑国际服怎么玩?国际服新手攻略[多图],坎公骑冠剑国际服的玩法是什么样的?关于游戏中的一些新手玩法

2024-04-21
王者荣耀鸿运6+1地狱之眼怎么抽?鸿运抽奖地狱之眼概率获取攻略

王者荣耀鸿运6+1地狱之眼怎么抽?鸿运抽奖地狱之眼概率获取攻略[多图],王者荣耀鸿运抽奖活动的奖池中还有传说

2024-04-21