unicode
对于汉语、日语、韩语等 ASCII 编码之外的单个字符使用宽字符的编码方式。常见的宽字符编码有 UTF-8 , UTF-16 和 UTF-32,它们都是基于 Unicode 字符集的,能够支持全球各种语言,每个字符用 16位表示。总之,Unicode是给字符分配码位,UTF-8是将字符转成可存储的字节顺序。
宽字符
C语言的宽字符是基于 wchar_t 数据类型的。这个数据类型被定义在 wchar.h
typedef unsigned short wchar_t;
#include <wchar.h>//宽字符头文件
#include <locale.h>//setlocale设置本地环境的头文件
void wcharprint();
// 可以使用宽字符存储中文字符
void wcharprint(){
wchar_t a = L'A'; //英文字符(基本拉丁字符)
wchar_t b = L'9'; //英文数字(阿拉伯数字)
wchar_t c = L'中'; //中文汉字
wchar_t d = L'国'; //中文汉字
wchar_t e = L'。'; //中文标点
wchar_t m_ask[] = L"Who are you?";
wchar_t *u_name = L"你是谁?";
//将本地环境设置为简体中文
// setlocale(LC_ALL, "zh_CN");//for windows
setlocale(LC_ALL, "zh_CN.UTF-8");//simple chinese for linux ,mac os
/*
en,en_GB ,en_US,*/
//使用专门的 putwchar 输出宽字符
putwchar(a); putwchar(b); putwchar(c); putwchar(d);
putwchar(e); putwchar(L'\n'); //只能使用宽字符
//使用通用的 wprintf 输出宽字符
wprintf(L"Wide chars: %lc %lc %lc %lc\n",a, b, c, d);
wprintf(L"m_ask: %ls \nu_name: %ls\n", m_ask, u_name);
//输入宽字符
wscanf(L"%ls",m_ask);
wprintf(L"h: %ls \m_ask: %ls\n", h, m_ask);
}
UTF-8使用一至四个字节为每个字符编码:
-
128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
-
带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要二个字节编码(Unicode范围由U+0080至U+07FF)。
-
其他基本多文种平面(BMP)中的字符(这包含了大部分常用字)使用三个字节编码。
-
其他极少使用的Unicode辅助平面的字符使用四字节编码。
UTF-8 编码是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。对于英文字符较多的论坛则用UTF-8 节省空间。
GBK
GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准,向上支持 ISO 10646.1国际标准。支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字,都是双字节的。使用的时候需要中文语言包支持。
ASCII
主流编码方式,占用8个字节,主要服务英语。
常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。