GB/T 2312,GB/T 2312–80 或 GB/T 2312–1980 是中华人民共和国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,通常简称GB(“国标”汉语拼音首字母),又称GB0,由中国国家标准总局于1980年发布,1981年5月1日实施。GB/T 2312编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB/T 2312。
GB/T 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符。
GB/T 2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。但对于人名、古汉语等方面出现的罕用字和繁体字,GB/T 2312不能处理,因此后来GBK及GB 18030汉字字符集相继出现以解决这些问题。
GB/T 2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号,共计94个区。用所在的区和位来表示字符(实际上就是码位),因此称为区位码(或许叫“区位号”更为恰当)。表示方式也称为区位码。例如“万”字在45区82位,所以“万”字的区位码是:45 82(注意,GB类汉字编码为双字节编码,因此,45相当于高位字节,82相当于低位字节)。
为了避开ASCII字符中的CR0不可显示字符(十六进制为0 ~ 1F,十进制为0 ~ 31)及空格字符0010 0000(十六进制为20,十进制为32),国标码(又称为交换码)规定表示汉字双字节编码范围为十六进制为(21,21) ~ (7E,7E),十进制为(33,33) ~ (126,126) 。因此,须将“区码”和“位码”分别加上32(十六进制为20H),作为国标码。以避免与ASCII字符中0~32的不可显示字符和空格字符相冲突。
例如: “万”字的国标码十进制为:(45+32,82+32) = (77,114),十六进制为:(4D,72H)。
国标码和通用的ASCII码冲突。把国标码中的每个字节的最高位都从0换成1,即相当于每个字节都再加上128(十六进制为80,即80H;二进制为1000 0000),从而得到国标码的“机内码”表示,简称“内码”。
在使用GB/T 2312的程序通常采用EUC储存方法,以便兼容于ASCII。这种格式称为EUC-CN。浏览器编码表上的“GB2312”就是指这种表示法。
每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。
“高位字节”使用了0xA1–0xF7(把01–87区的区号加上0xA0),“低位字节”使用了0xA1–0xFE(把01–94加上0xA0)。由于一级汉字从16区起始,汉字区的“高位字节”的范围是0xB0–0xF7,“低位字节”的范围是0xA1–0xFE,占用的码位是72*94=6768。其中有5个空位是D7FA–D7FE。
例如“啊”字在大多数程序中,会以两个字节,0xB0(第一个字节)0xA1(第二个字节)储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。
GB 5007.1–85《信息交换用汉字 24x24 点阵字模集》首次附录对 GB/T 2312 之更正,包括:
GB/T 2312 本身一直未有修订,但此等修订部分收入相关字模集(下详)、GB/T 12345、后续之 GBK 及 GB 18030。
GB/T 2312 亦用于 ISO-IR-165。
有两种不同的GB/T 2312实现,在它们之间存在少量的差别,其中至少有一个是错误的。
GBK子集与GBK/GB 18030兼容,GB2312.TXT则不兼容。后者基于ftp.unicode.org曾经提供的GB2312.TXT实现,于2011年由官方弃用,2016年9月时已无原文件踪迹。此外还有很多种厂商实现。
截至2015年 (2015-Missing required parameter 1=!),微软.NET使用的是“GBK子集”实现。ICU(英语:International Components for Unicode)、libiconv-1.14、php-5.6、ActivePerl-5.20、Java 1.7、Python 3.4都使用“GB2312.TXT”实现。Ruby 2.2兼容两者编码,但内部使用“GBK子集”实现。W3C的编码技术指南规定,应将gb2312
字节流视为GBK编码,与GB18030一并使用同一解码器解码。