搜档网
当前位置:搜档网 › 字符编码之间的相互转换 UTF8与GBK

字符编码之间的相互转换 UTF8与GBK

字符编码之间的相互转换 UTF8与GBK
字符编码之间的相互转换 UTF8与GBK

C++ UTF8编码转换CChineseCode

一预备知识

1,字符:字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代表一个符号,没有任何实际值的意义。

2,字符集:字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。这也说明了字符和字符集之间的关系,字符组成字符集(iso8859-1,GB2312/GBK,unicode)。

3,代码点:字符集中的每个字符都被分配到一个“代码点”。每个代码点都有一个特定的唯一数值,称为标值。该标量值通常用十六进制表示。

4,代码单元:在每种编码形式中,代码点被映射到一个或多个代码单元。“代码单元”是各个编码方式中的单个单元。代码单元的大小等效于特定编码方式的位数:UTF-8 :UTF-8 中的代码单元由8 位组成;在UTF-8 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个、三个或四个代码单元;UTF-16 :UTF-16 中的代码单元由16 位组成;UTF-16 的代码单元大小是8 位代码单元的两倍。所以,标量值小于U+10000 的代码点被编码到单个代码单元中;UTF-32:UTF-32 中的代码单元由32 位组成;UTF-32 中使用的32 位代码单元足够大,每个代码点都可编码为单个代码单元;GB18030:GB18030 中的代码单元由8 位组成;在GB18030 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个或四个代码单元。

5,举例:“中国北京香蕉是个大笨蛋”这是我定义的aka字符集;

各字符对应代码点为:

北00000001

京00000010

香10000001

蕉10000010

是10000100

个10001000

大10010000

笨10100000

蛋11000000

中00000100

国00001000

下面是我定义的zixia 编码方案(8位),可以看到它的编码中表示了aka字符集的所有字符对应的代码单元;

北10000001 京10000010 香00000001 蕉00000010 是00000100 个00001000 大00010000 笨00100000 蛋01000000 中10000100 国10001000

所谓文本文件就是我们按一定编码方式将二进制数据表示为对应的文本如00000001000000100000010000001000000100000010000001000000这样的文件。我用一个支持zixia编码和aka字符集的记事本打开,它就按照编码方案显示为“香蕉是个大笨蛋” 如果我把这些字符按照GBK另存一个文件,那么则肯定不是这个,而是1100111111100011 1011110110110110 1100101011000111 1011100011110110 1011010011110011 1011000110111111 1011010110110000 110100001010

二,字符集

1,常用字符集分类 ASCII及其扩展字符集作用:表语英语及西欧语言。位数:ASCII是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符。范围:ASCII从00到7F,扩展从00到FF。 ISO-8859-1字符集作用:扩展ASCII,表示西欧、希腊语等。位数:8位,范围:从00到FF,兼容ASCII字符集。 GB2312字符集作用:国家简体中文字符集,兼容ASCII。位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所有高频率汉字。范围:高字节从A1到F7, 低字节从A1到FE。将高字节和低字节分别加上0XA0即可得到编码。 BIG5字符集作用:统一繁体字编码。位数:使用2个字节表示,表示13053个汉字。范围:高字节从A1到F9,低字节从40到7E,A1到FE。 GBK字符集作用:它是GB2312的扩展,加入对繁体字的支持,兼容GB2312。位数:使用2个字节表示,可表示21886个字符。范围:高字节从81到FE,低字节从40到FE。 GB18030字符集作用:它解决了中文、日文、朝鲜语等的编码,兼容GBK。位数:它采用变字节表示(1 ASCII,2,4字节)。可表示27484个文字。范围:1字节从00到7F; 2字节高字节从81到FE,低字节从40到7E和80到FE;4字节第一三字节从81到FE,第二四字节从30到39。 UCS字符集作用:国际标准ISO 10646 定义了通用字符集(Universal Character Set)。它是与UNICODE同类的组织,UCS-2和UNICODE兼容。位数:它有UCS-2和UCS-4两种格式,分别是2字节和4字节。范围:目前,UCS-4只是在UCS-2前面加了0×0000。 UNICODE字符集作用:为世界650种语言进行统一编码,兼容ISO-8859-1。位数:UNICODE字符集有多个编码方式,分别是UTF-8,UTF-16和UTF-32。

2 ,按所表示的文字分类语言字符集正式名称英语、西欧语ASCII,ISO-8859-1 MBCS 多字节简体中文GB2312 MBCS 多字节繁体中

文BIG5 MBCS 多字节简繁中

文GBK MBCS 多字节中文、日文及朝鲜

语GB18030 MBCS 多字节各国语言UNICODE,UCS DBCS 宽字节三

,编码UTF-8:采用变长字节(1 ASCII, 2 希腊字母, 3 汉字, 4 平面符号) 表示,网络传输, 即使错了一个字节,不影响其他字节,而双字节只要一个错了,其他也错了,具体如下:如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。UTF-8最多可用到6个字节。UTF-16:采用2字节,Unicode中不同部分的字符都同样基于现有的标准。这是为了便于转换。从0×0000到0×007F是ASCII 字符,从0×0080到0×00FF是ISO-8859-1对ASCII的扩展。希腊字母表使用从0×0370到0×03FF 的代码,斯拉夫语使用从0×0400到0×04FF的代码,美国使用从0×0530到0×058F的代码,希伯来语使用从0×0590到0×05FF的代码。中国、日本和韩国的象形文字(总称为CJK)占用了从0×3000到0×9FFF的代码;由于0×00在c语言及操作系统文件名等中有特殊意义,故很多情况下需要UTF-8编码保存文本,去掉这个0×00。举例如下:UTF-16: 0×0080 = 0000 0000 1000 0000

UTF-8: 0xC280 = 1100 0010 1000 0000 UTF-32:采用4字节。优缺点UTF-8、UTF-16和UTF-32都可以表示有效编码空间(U+000000-U+10FFFF) 内的所有Unicode字符。使用UTF-8编码时ASCII字符只占1个字节,存储效率比较高,适用于拉丁字符较多的场合以节省空间。对于大多数非拉丁字符(如中文和日文)来说,UTF-16所需存储空间最小,每个字符只占2个字节。Windows NT内核是Unicode(UTF-16),采用UTF-16编码在调用系统API时无需转换,处理速度也比较快。采用UTF-16和UTF-32会有Big Endian和Little Endian之分,而UTF-8则没有字节顺序问题,所以UTF-8适合传输和通信。UTF-32采用4字节编码,一方面处理速度比较快,但另一方面也浪费了大量空间,影响传输速度,因而很少使用。

四,如何判断字符集1,字节序首先说一下字节序对编码的影响,字节序分为Big Endian字节序和Little Endian字节序。不同的处理器可能不一样。所以,传输时需要告诉处理器当时的编码字节序。对于前者而言,高位字节存在低地址,低字节存于高地址;后者相反。例如,0X03AB, Big Endian字节序0000: 0 3 0001: AB Little Endian字节序是0000: AB 0001: 0 3 2,编码识别UNICODE,根据前几个字节可以判断UNICODE字符集的各种编码,叫做Byte Order Mask方法BOM:UTF-8: EFBBBF (符合UTF-8格式,请看上面。但没有含义在UCS即UNICODE中) UTF-16 Big Endian:FEFF (没有含义在UCS-2中) UTF-16 Little

Endian:FFFE (没有含义在UCS-2中) UTF-32 Big Endian:0000FEFF (没有含义在UCS-4中) UTF-32 Little Endian:FFFE0000 (没有含义在UCS-4中) GB2312:高字节和低字节的第1位都是1。BIG5,GBK&GB18030:高字节的第1位为1。操作系统有默认的编码,常为GBK,可以下载别的并升级。通过判断高字节的第1位从而知道是ASCII或者汉字编码。

#include

#include

//GBK编码转换到UTF8编码

int GBKToUTF8(unsigned char * lpGBKStr,unsigned char * lpUTF8Str,int nUTF8StrLen)

{

wchar_t * lpUnicodeStr = NULL;

int nRetLen = 0;

if(!lpGBKStr) //如果GBK字符串为NULL则出错退出

return0;

nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,NULL,NULL); //获取转换到Unicode编码后所需要的字符空间长度

lpUnicodeStr = new WCHAR[nRetLen + 1]; //为Unicode字符串空间

nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,lpUnicodeStr,nRetLen); //转换到Unicode编码

if(!nRetLen) //转换失败则出错退出

return0;

nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,NULL,0,NULL,NULL); //获取转换到UTF8编码后所需要的字符空间长度

if(!lpUTF8Str) //输出缓冲区为空则返回转换后需要的空间大小

{

if(lpUnicodeStr)

delete []lpUnicodeStr;

return nRetLen;

}

if(nUTF8StrLen < nRetLen) //如果输出缓冲区长度不够则退出

{

if(lpUnicodeStr)

delete []lpUnicodeStr;

return0;

}

nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,(char

*)lpUTF8Str,nUTF8StrLen,NULL,NULL); //转换到UTF8编码

if(lpUnicodeStr)

delete []lpUnicodeStr;

return nRetLen;

}

//使用这两个函数的例子

int main()

{

char cGBKStr[] = "我是中国人!";

char * lpGBKStr = NULL;

char * lpUTF8Str = NULL;

FILE * fp = NULL;

int nRetLen = 0;

nRetLen = GBKToUTF8((unsigned char *) cGBKStr,NULL,NULL);

printf("转换后的字符串需要的空间长度为:%d ",nRetLen);

lpUTF8Str = new char[nRetLen + 1];

nRetLen = GBKToUTF8((unsigned char *)cGBKStr,(unsigned char *)lpUTF8Str,nRetLen);

if(nRetLen)

{

printf("GBKToUTF8转换成功!");

}

else

{

printf("GBKToUTF8转换失败!");

goto Ret0;

}

fp = fopen("C:\\GBKtoUTF8.txt","wb"); //保存到文本文件

fwrite(lpUTF8Str,nRetLen,1,fp);

fclose(fp);

getchar(); //先去打开那个文本文件看看,单击记事本的“文件”-“另存为”菜单,在对话框中看到编码框变为了“UTF-8”说明转换成功了

Ret0:

{

if(lpGBKStr)

delete []lpGBKStr;

if(lpUTF8Str)

delete []lpUTF8Str;

return0;

}

Karlson,2009-07-25 13:39:57

1class CChineseCode

2

3 {

4

5public:

6

7static void UTF_8ToUnicode(wchar_t* pOut,char *pText); // 把UTF-8转换成Unicode

8

9static void UnicodeToUTF_8(char* pOut,wchar_t* pText); //Unicode 转换成UTF-8

10

11static void UnicodeToGB2312(char* pOut,wchar_t uData); // 把Unicode 转换成 GB2312 12

13static void Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer);// GB2312 转换成Unicode 14

15static void GB2312ToUTF_8(string& pOut,char *pText, int pLen);//GB2312 转为 UTF-8

16

17static void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//UTF-8 转为 GB2312

18

19 };

20

21类实现

22

23void CChineseCode::UTF_8ToUnicode(wchar_t* pOut,char *pText)

24

25 {

26

27char* uchar = (char *)pOut;

28

29 uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);

30

31 uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);

32

33return;

34

35 }

37void CChineseCode::UnicodeToUTF_8(char* pOut,wchar_t* pText)

38

39 {

40

41// 注意 WCHAR高低字的顺序,低字节在前,高字节在后

42

43char* pchar = (char *)pText;

44

45 pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));

46

47 pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6); 48

49 pOut[2] = (0x80 | (pchar[0] & 0x3F));

50

51return;

52

53 }

54

55void CChineseCode::UnicodeToGB2312(char* pOut,wchar_t uData)

56

57 {

58

59 WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(wchar_t),NULL,NULL); 60

61return;

62

63 }

64

65void CChineseCode::Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer)

66

67 {

68

69 ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);

70

71return ;

72

73 }

74

75void CChineseCode::GB2312ToUTF_8(string& pOut,char *pText, int pLen)

76

77 {

78

79char buf[4];

81int nLength = pLen* 3;

82

83char* rst = new char[nLength];

84

85 memset(buf,0,4);

86

87 memset(rst,0,nLength);

88

89int i = 0;

90

91int j = 0;

92

93while(i < pLen)

94

95 {

96

97//如果是英文直接复制就可以

98

99if( *(pText + i) >= 0)

100

101 {

102

103 rst[j++] = pText[i++];

104

105 }

106

107else

108

109 {

110

111 wchar_t pbuffer;

112

113 Gb2312ToUnicode(&pbuffer,pText+i); 114

115 UnicodeToUTF_8(buf,&pbuffer);

116

117 unsigned short int tmp = 0;

118

119 tmp = rst[j] = buf[0];

120

121 tmp = rst[j+1] = buf[1];

122

123 tmp = rst[j+2] = buf[2];

125 j += 3;

126

127 i += 2;

128

129 }

130

131 }

132

133 rst[j] = '';

134

135//返回结果

136

137 pOut = rst;

138

139 delete []rst;

140

141return;

142

143 }

144

145void CChineseCode::UTF_8ToGB2312(string &pOut, char *pText, int pLen) 146

147 {

148

149char * newBuf = new char[pLen];

150

151char Ctemp[4];

152

153 memset(Ctemp,0,4);

154

155int i =0;

156

157int j = 0;

158

159while(i < pLen)

160

161 {

162

163if(pText > 0)

164

165 {

166

167 newBuf[j++] = pText[i++];

169 }

170

171else

172

173 {

174

175 WCHAR Wtemp;

176

177 UTF_8ToUnicode(&Wtemp,pText + i);

178

179 UnicodeToGB2312(Ctemp,Wtemp);

180

181 newBuf[j] = Ctemp[0];

182

183 newBuf[j + 1] = Ctemp[1];

184

185 i += 3;

186

187 j += 2;

188

189 }

190

191 }

192

193 newBuf[j] = '';

194

195 pOut = newBuf;

196

197 delete []newBuf;

198

199return;

200

201 }

1、将GBK转换成UTF8

string GBKToUTF8(const std::string& strGBK)

{ string strOutUTF8 = "";

WCHAR * str1;

int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0); str1 = new WCHAR[n];

MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n); n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);

char * str2 = new char[n];

WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);

strOutUTF8 = str2;

delete[]str1;

str1 = NULL;

delete[]str2;

str2 = NULL;

return strOutUTF8;

}

Wi d e C h a r To M u l t i B y t e把U N I C O D E转换成A S C I I码。

2、将UTF8转换成GBK

string UTF8ToGBK(const std::string& strUTF8)

{

int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);

unsigned short * wszGBK = new unsigned short[len + 1]; memset(wszGBK, 0, len * 2 + 2); MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUTF8.c_str(), -1, wszGBK, len);

len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);

char *szGBK = new char[len + 1];

memset(szGBK, 0, len + 1);

WideCharToMultiByte(CP_ACP,0, wszGBK, -1, szGBK, len, NULL, NULL); //strUTF8 = szGBK;

std::string strTemp(szGBK);

delete[]szGBK;

delete[]wszGBK;

return strTemp;

}

常用字符集编码详解:ASCII 、GB2312、GBK、GB18030、...

ASCII ASCII码是7位编码,编码范围是0x00-0x7F。ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。其中0x00-0x20和0x7F共33个控制字符。 只支持ASCII码的系统会忽略每个字节的最高位,只认为低7位是有效位。HZ字符编码就是早期为了在只支持7位ASCII系统中传输中文而设计的编码。早期很多邮件系统也只支持ASCII编码,为了传输中文邮件必须使用BASE64或者其他编码方式。 GB2312 GB2312是基于区位码设计的,区位码把编码表分为94个区,每个区对应94个位,每个字符的区号和位号组合起来就是该汉字的区位码。区位码一般用10进制数来表示,如1601就表示16区1位,对应的字符是“啊”。在区位码的区号和位号上分别加上0xA0就得到了GB2312编码。 区位码中01-09区是符号、数字区,16-87区是汉字区,10-15和88-94是未定义的空白区。它将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。一级汉字是按照拼音排序的,这个就可以得到某个拼音在一级汉字区位中的范围,很多根据汉字可以得到拼音的程序就是根据这个原理编写的。 GB2312字符集中除常用简体汉字字符外还包括希腊字母、日文平假名及片假名字母、俄语西里尔字母等字符,未收录繁体中文汉字和一些生僻字。可以用繁体汉字测试某些系统是不是只支持GB2312编码。 GB2312的编码范围是0xA1A1-0x7E7E,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE。 EUC-CN可以理解为GB2312的别名,和GB2312完全相同。 区位码更应该认为是字符集的定义,定义了所收录的字符和字符位置,而GB2312及EUC-CN是实际计算机环境中支持这种字符集的编码。HZ和ISO- 2022-CN是对应区位码字符集的另外两种编码,都是用7位编码空间来支持汉字。区位码和GB2312编码的关系有点像Unicode和UTF-8。 GBK GBK编码是GB2312编码的超集,向下完全兼容GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字。同GB2312一样,GBK也支持希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。GBK还收录了GB2312不包含的汉字部首符号、竖排标点符号等字符。 GBK的整体编码范围是为0x8140-0xFEFE,不包括低字节是0×7F的组合。高字节范围是0×81-0xFE,低字节范围是0x40-7E和0x80-0xFE。

字符编码方式介绍及编码方式测试

第一部分编码方式介绍 一、编码: 美国标准信息交换标准码( , ) 在计算机内部,所有地信息最终都表示为一个二进制地字符串.每一个二进制位()有和两种状态.一个字节()共由八个二进制位来组成,共有种状态,从到. 阿拉伯数字、英文字母、标点符号等这些字符,怎么定义才能让计算机识别呢?因为计算机只识别二进制位和,所以以上这些字符就必须与二进制位(和)建立关系,才能让计算机识别. 年代初,计算机界制定了一套统一地字符编码,来表示字符与二进制位之间地关系.这种统一地字符编码就叫做编码.码一共规定了个字符地编码,比如空格是(二进制),大写地字母是(二进制).这个符号(包括个不能打印出来地控制符号),只占用了一个字节地后面位,最前面地位统一规定为. 在英语国家,个编码足以表达所有字符,但其它非英语国家,字符不是由英文字符组成,这样就需要增加编码以表达这些字符,对于超过个字符地编码被称为非编码.比如:在中国,我们用简体中文,字符编码方式为.个人收集整理勿做商业用途 二、编码: 看到上面地介绍后,我们了解了最早编码是码.它只用个二进制位来表示,由于那个时期生产地大多数计算机使用位大小地字节,因此用户不仅可以存放所有可能地字符,而且有整整一位空余下来.如果你技艺高超,可以将该位用做自己离奇地目地:中那个发暗地灯泡实际上设置这个高位,以指示一个单词中地最后一个字母,同时这也宣示了只能用于英语文本. 由于字节有多达位地空间,因此许多人在想:“呀!我们可以把之间地编码用做个人地应用目地.”问题在于,同时产生这种想法地人相当多,而且在之间地各个位置上应该存放什么这一问题上,真是仁者见仁智者见智.事实上,只要人们开始在美国以外地地方购买计算机,那么各种各样地不同字符集都会进入规划设计行列,并且各人都会根据自己地需要使用高位地个字符.如此一来,甚至在同语种地文档之间就不容易实现互换. 可被扩展,最优秀地扩展方案是,通常称之为.包括了足够地附加字符集来写基本地西欧语言. 最后,这个人参与地终于以标准地形式形成文件.在标准中,每个人都认同如何使用低端地个编码,这与相当一致.不过,根据所在国籍地不同,处理编码以上地字符有许多不同地方式.这些不同地系统称为代码页. 同时,甚至更为令人头疼地事情正在逐步上演,亚洲国家地字符表有成千上万个字符,这样地字符表是用位二进制无法表示地.该问题地解决通常有赖于称为(,双字节字符集)地繁杂字符系统. 不过,仍然需要指出一点,多数人还是姑且认为一个字节就是一个字符,以及一个字符就是个二进制位,并且只要确保不将字符串从一台计算机移植到另一台计算机,或者说一种以上地语言,那么这几乎总是可以凑合.当然,只要一进入,从一台计算机向另一台计算机移植字符串就成为家常便饭了,而各种复杂状况也随之呈现出来.令人欣慰地是,随即问世了.个人收集整理勿做商业用途 字符集(简称为),国际标准组织于年月成立工作组,针对各国文字、符号进行统一性编码.年美国跨国公司成立,并于年月与达成协议,采用同一编码字集.目前是采用位编码体系,其字符集内容与地()相同.于年月通过(),目前版本于公布,内容包含符号个,汉字个,韩文拼音个,造字区个,保留个,共计个.编码后地大小是一样地.例如一个英文字母"" 和一个汉字"好",编码后都是占用地空间大小是一样地,都是两个字节!个人收集整理勿做商业用途 可以用来表示所有语言地字符,而且是定长双字节(也有四字节地)编码,包括英文字

常用字符集介绍和编码转换原理

常用字符集介绍和编码转换原理 目录 1. GB2312编码介绍 (2) 1.1 基本信息 (2) 1.2 GB标准 (2) 1.3 分区表示 (2) 1.4 字节结构 (2) 2. 通用字符集UCS (3) 2.1 定义 (3) 2.2 概要 (3) 2.3 实现级别 (3) 2.4 与UNICODE的兼容关系 (3) 3. unicode编码介绍 (3) 3.1 基本简介 (4) 3.2 编码实现 (4) 3.2.1 编码方式 (4) 3.2.2 实现方式 (5) 4. UTF-8介绍 (5) 4.1 基本介绍 (5) 4.2 编码原理 (5) 4. 转换原理 (7)

1. GB2312编码介绍 1.1 基本信息 1.2 GB标准 GB2312或GB2312-80是一个简体中文字符集的中国国家标准,全称为《信息交换用汉字编码字符集·基本集》,又称为GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB2312。 GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。 GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。 对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB18030汉字字符集的出现。 1.3 分区表示 GB 2312中对所收汉字进行了―分区‖处理,每区含有94个汉字/符号。这种表示方式也称为区位码。 01-09区为特殊符号。 16-55区为一级汉字,按拼音排序。 56-87区为二级汉字,按部首/笔画排序。 10-15区及88-94区则未有编码。 举例来说,―啊‖字是GB2312之中的第一个汉字,它的区位码就是1601。 1.4 字节结构

unicode编码区对照表

unicode編碼區對照表 2150-218F Number Forms 數字形式 2190-21FF Arrows 箭頭符號 2200-22FF Mathematical Operators 數學運算符號 2300-23FF Miscellaneous Technical 混合專門符號 3000-303F CJK Symbols and Punctuation 中日韓符號和標點3040-309F Hiragana 平假名 30A0-30FF Katakana 片假名 3100-312F Bopomofo 注音符號 31C0-31EF CJK Strokes 中日韓筆畫部件 31F0-31FF Katakana Phonetic Extensions 片假名音標擴充3200-32FF Enclosed CJK Letters and Months 中日韓括號字母及月份 3300-33FF CJK Compatibility 中日韓相容字元 3400-4DBF CJK Unified Ideographs Extension A 中日韓統一表意文字擴充A 4DC0-4DFF Yijing Hexagram Symbols 易經六十四卦象 4E00-9FFF CJK Unified Ideographs 中日韓統一表意文字 其他。。。。

0000-007F Basic Latin 基本拉丁字母 0080-00FF Latin-1 Supplement 拉丁字母補充-1 0100-017F Latin Extended-A 拉丁字母擴充-A 0180-024F Latin Extended-B 拉丁字母擴充-B 0250-02AF IPA Extensions 國際音標擴充 02B0-02FF Spacing Modifier Letters 進格修飾字元 0300-036F Combining Diacritical Marks 組合音標附加符號0370-03FF Greek and Coptic 希臘字母 0400-04FF Cyrillic 西里爾字母 0500-052F Cyrillic Supplement 西里爾字母補充 0530-058F Armenian 亞美尼亞文 0590-05FF Hebrew 希伯來文 0600-06FF Arabic 基本阿拉伯文 0700-074F Syriac 敘利亞文 0750-077F Arabic Supplement 阿拉伯文補充 0780-07BF Thaana 塔納文 07C0-07FF N'Ko 0900-097F Devanagari 天城體梵文字母 0980-09FF Bengali 孟加拉文 0A00-0A7F Gurmukhi 古爾穆基文 0A80-0AFF Gujarati 古吉拉特文 0B00-0B7F Oriya 奧里亞文

国标(GB2312-80)汉字编码对照表

汉字编码简明对照表 说明: 1、下列汉字取自国标(GB 2312-80)中的分级与排列内容;包含所有的第一级汉字和第二级汉字中的常用部分。 2、第一级汉字(16—55区的汉字)以拼音字母为序进行排列,同音字以笔形顺序横、竖、撇、捺、折为序,起笔相同的按第二笔,依次类推;第二级汉字(56-87区的汉字)按部首为序进行排列。 3、对于多音字,仅在表中出现一次。如:柏,音(bai,bo),表中仅出现在“bai”中。 4、汉字区位码用阿拉伯数字表示,每个汉字对应4个数字。 5、本汉字代码表摘自《字符集和信息编码国家标准汇编》,(中国标准出版社,1998年编)。 a 啊 1601 阿 1602 吖 6325 嗄 6436 腌 7571 锕 7925 ai 埃 1603 挨 1604 哎 1605 唉 1606 哀 1607 皑 1608 癌 1609 蔼 1610 矮 1611 艾 1612 碍 1613 爱 1614 隘 1615 捱 6263 嗳 6440 嗌 6441 嫒 7040 瑷 7208 暧 7451 砹 7733 锿 7945 霭 8616 an 鞍 1616 氨 1617 安 1618 俺 1619 按 1620 暗 1621 岸 1622 胺 1623 案 1624 谙 5847 埯 5991 揞 6278 犴 6577 庵 6654 桉 7281 铵 7907 鹌 8038 黯 8786 ang 肮 1625 昂 1626 盎 1627 ao

凹 1628 敖 1629 熬 1630 翱 1631 袄 1632 傲 1633 奥 1634 懊 1635 澳 1636 坳 5974 拗 6254 嗷 6427 岙 6514 廒 6658 遨 6959 媪 7033 骜 7081 獒 7365 聱 8190 螯 8292 鏊 8643 鳌 8701 鏖 8773 ba 芭 1637 捌 1638 扒 1639 叭 1640 吧 1641 笆 1642 八 1643 疤 1644 巴 1645 拔 1646 跋 1647 靶 1648 把 1649 耙 1650 坝 1651 霸 1652 罢 1653 爸 1654 茇 6056 菝 6135 岜 6517 灞 6917 钯 7857 粑 8446 鲅 8649 魃 8741 bai 白 1655 柏 1656 百 1657 摆 1658 佰 1659 败 1660 拜 1661 稗 1662 捭 6267 呗 6334 掰 7494 ban 斑 1663 班 1664 搬 1665 扳 1666 般 1667 颁 1668 板 1669 版 1670 扮 1671 拌 1672 伴 1673 瓣 1674 半 1675 办 1676 绊 1677 阪 5870 坂 5964 钣 7851 瘢 8103 癍 8113 舨 8418 bang 邦 1678 帮 1679 梆 1680 榜 1681 膀 1682 绑 1683 棒 1684 磅 1685 蚌 1686 镑 1687 傍 1688 谤 1689 蒡 6182 浜 6826 bao 苞 1690 胞 1691 包 1692 褒 1693 剥 1694 薄 1701 雹 1702 保 1703 堡 1704 饱 1705 宝 1706 抱 1707 报 1708 暴 1709 豹 1710 鲍 1711 爆 1712 葆 6165 孢 7063 煲 7650 鸨 8017 褓 8157 趵 8532 龅 8621 bei 杯 1713 碑 1714 悲 1715 卑 1716 北 1717 辈 1718 背 1719 贝 1720 钡 1721 倍 1722 狈 1723 备 1724 惫 1725 焙 1726 被 1727 孛 5635 陂 5873 邶 5893 蓓 6177 悖 6703 碚 7753 鹎 8039 褙 8156 鐾 8645 鞴 8725 ben 奔 1728 苯 1729 本 1730 笨 1731 畚 5946 坌 5948 贲 7458 锛 7928 beng 崩 1732 绷 1733 甭 1734 泵 1735 蹦 1736 迸 1737 嘣 6452 甏 7420 bi

字符集与编码

字符集与编码 一.字符集与编码之间的关系 1.为了在计算机中存储与处理,必须对字符进行数字化编码。 2.字符集规定了包含哪些字符,每个字符的值是什么 3.编码规定了对于这些值,如何存储 4.有些标准同时规定了字符集及其编码 如:目前使用最广泛的西文字符集及其编码是ASCII 字符集和ASCII码(ASCII是American Standard Code for Information Interchange的缩写),它同时也被国际标准化组织(International Organization for Standardization, ISO)批准为国际标准 5.有些标准同一个字符集可以有多种编码格式 二.字符集及编码 1.SBCS (single byte character set) 1.1 ASCII (1).7位编码,范围0x00-0x7F (2).码值32-127(0x20-0x7F) (3).0x00-0x1F 之间的为控制字符,每个字符有一个缩写的名字 (4).数字,大写字母,小写字母的编码都是连续的 目前使用最广泛的西文字符集及其编码是 ASCII 字符集和 ASCII 码( ASCII 是American Standard Code for Information Interchange 的缩写),它同时也被国际标准化组织( International Organization for Standardization, ISO )批准为国际标准。 基本的 ASCII 字符集共有 128 个字符,其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个控制字符。标准 ASCII 码使用 7 个二进位对字符进行编码,对应的 ISO 标准为 ISO646 标准。下表展示了基本 ASCII 字符集及其编码: 字母和数字的 ASCII 码的记忆是非常简单的。我们只要记住了一个字母或数字的ASCII 码(例如记住 A 为 65 , 0 的 ASCII 码为 48 ),知道相应的大小写字母之间差 32 ,就可以推算出其余字母、数字的 ASCII 码。 虽然标准 ASCII 码是 7 位编码,但由于计算机基本处理单位为字节( 1byte = 8bit ),所以一般仍以一个字节来存放一个 ASCII 字符。每一个字节中多余出来的一位(最高位)在计算机内部通常保持为 0 (在数据传输时可用作奇偶校验位)。 由于标准 ASCII 字符集字符数目有限,在实际应用中往往无法满足要求。为此,国际标准化组织又制定了 ISO2022 标准,它规定了在保持与 ISO646 兼容的前提下将ASCII 字符集扩充为 8 位代码的统一方法。 ISO 陆续制定了一批适用于不同地区的扩充 ASCII 字符集,每种扩充 ASCII 字符集分别可以扩充 128 个字符,这些扩充字符

计算机常见编码

计算机常见编码 一.有关编码的基础知识 1. 位bit 最小的单元 字节byte 机器语言的单位 1byte=8bits 1KB=1024byte 1MB=1024KB 1GB=1024MB 2. 二进制binary 八进制octal 十进制decimal 十六进制hex 3. 字符:是各种文字和符号的总称,包括各个国家的文字,标点符号,图形符 号,数字等。 字符集:字符集是多个符号的集合,每个字符集包含的字符个数不同。 字符编码:字符集只是规定了有哪些字符,而最终决定采用哪些字符,每一 个字符用多少字节表示等问题,则是由编码来决定的。计算机要 准确的处理各种字符集文字,需要进行字符编码,以便计算机能 够识别和存储各种文字。 二.常见字符集的编码介绍: 常见的字符集有:ASCII 字符集,GB2312 字符集,BIG5 字符集,GB18030 字符集,Unicode 字符集,下面一一介绍: 1. ASCII 字符集: 定义: 美国信息互换标准代码,是基于罗马字母表的一套电脑编码系统,主要显示 英语和一些西欧语言,是现今最通用的单字节编码系统。 包含内容: 控制字符(回车键,退格,换行键等) 可显示字符(英文大小写,阿拉伯数字,西文符号) 扩展字符集(表格符号,计算符号,希腊字母,拉丁符号) 编码方式: 第0-31 号及127 号是控制字符或通讯专用字符; 第32-126 号是字符,其中48-57 号为0-9 十个阿拉伯数字,65-90 号为26 个 大写英文字母,97-122 号为26 个英文小写字母,其余为一些标点符号,运 算符号等。 在计算机存储单元中,一个ASCII 码值占一个字节(8 个二进制位),最高位 是用作奇偶检验位。【奇偶校验是指:在代码传送的过程中,用来检验是否 出错的一种方法。】奇偶校验分为奇校验和偶校验。奇校验规定:正确的代 码一个字节中1 的个数必须是奇数,若非奇数,则在最高位添1;偶校验规 定:正确的代码一个字节中 1 的个数必须是奇数,若非奇数,则在最高位添 1。

汉字编码

汉字编码 上海市洋泾中学沈文艳 一、教学目标: 1.知识与技能: (1)理解汉字字形码、机内码及输入码的作用及特点 (2)了解计算机处理汉字的一般过程 2.过程与方法: (1)通过ViewChr软件观察汉字点阵图,探究汉字在屏幕上的显示方式,认识字形码。(2)通过WinHex软件观察汉字内码,探究汉字在计算机内部的存储方式,认识机内码。3.情感、态度与价值观: 通过简介我国科学家王选及汉字全息编码发明少年杜冰蟾的事例,弘扬爱国主义精神及民族自豪感,激发创新意识。认识取得成功必须要有坚韧不拔的毅力和科学严谨的治学态度。 二、教学重点难点 教学重点:汉字输入码、机内码及字形码的作用及特点 教学难点: (1)对汉字三种编码作用及相互关系的理解 (2)汉字字形码存储容量的计算方法。 三、教学过程:

《汉字编码》导学案 班级:姓名:学号: 【学习目标】 1.学习目标 (1)理解汉字字形码、机内码及输入码的作用及特点 (2)了解计算机处理汉字的一般过程 2.重点难点 (1)对汉字三种编码作用及相互关系的理解 (2)汉字字形码存储容量的计算方法。 【活动探究】 活动1:汉字在屏幕上是怎样显示的 步骤: (1)打开ViewChr软件,输入不同的汉字,观察汉字的显示方式, 通过观察,可以很容易地看出,每个汉字是通过一些点的组合来显示的。汉字中有笔画的部分,点是_____(有/无)颜色的,没笔画的部分,点是_____(有/无)颜色的。也就是说屏幕上的每个点既可以有颜色,也可以无颜色,所以,每个点在颜色的显示上最多有_____种状态。 (2)在ViewChr软件中输入汉字“上”,你能否根据软件的显示结果,在下面的16×16的方格图内用二进制数码来描述这个汉字 因为每一个点有两种颜色状态,又因为一个二进制位 可以表示_____种信息,所以,要表示图中的每一个点需要

中文摩斯编码表

中文摩斯编码表 我把全部中文电报码给你发在下面,你最好打印下来.以便随时可以查阅: 、9977 。9975 .9978 .9992 .9993 —9994 —9995 (9991) ‘9984 ’9985 “9986 ”9987 《9996 》9997 ×9973 ×9999 ÷9974 □9998 Ⅰ9941 Ⅱ9942 Ⅲ9943 Ⅳ9944 Ⅴ9945 Ⅵ9946 Ⅶ9947 Ⅷ9948 Ⅸ9949 Ⅹ9950 !9982 (9988 )9989 +9971 ,9976 -9972 /9970 09960 19961 29962 39963 49964 59965 69966 79967 89968 99969 :9980 ;9979 =9983 ?9981 A9874 B9875 C9876 D9877 E9878 F9879 G9880 H9881 I9882 J9883 K9884 L9885 M9886 N9887 O9888 O9800 P9889 Q9890 R9891 S9892 T9893 U9894 V9895 W9896 X9897 Y9898 Z9899 Ω9959 А9768 Б9769 В9770 Г9771 Д9772 Е9773 Ж9774 З9775 И9776 Й9799 К9777 Л9778 М9779 Н9780 О9781 П9782 Р9783 С9784 Т9785 У9786 Ф9787 Х9788 Ц9789 Ч9790 Ш9791 Щ9792 Ъ9796 Ы9797 Ь9798 Э9793 Ю9794 Я9795 ㄅ9720 ㄆ9721 ㄇ9722 ㄈ9723 ㄉ9724 ㄊ9725 ㄋ9726 ㄌ9727 ㄍ9728 ㄎ9729 ㄏ9730 ㄐ9731 ㄑ9732 ㄒ9733 ㄓ9734 ㄔ9735 ㄕ9736 ㄖ9737 ㄗ9738 ㄘ9739 ㄙ9740 ㄚ9744 ㄛ9745 ㄜ9746 ㄝ9747 ㄞ9748 ㄟ9749 ㄠ9750 ㄡ9751 ㄢ9752 ㄣ9753 ㄤ9754 ㄥ9755 ㄦ9756 ㄧ9741 ㄨ9742 ㄩ9743 ━9990 啊0759 阿7093 埃1002 挨2179 哎0740 唉0780 哀0755 皑4114 癌4074 蔼5676 矮4253 艾5337 碍4293 爱1947 隘7137 鞍7254 氨8637 安1344 俺0219 按2174 暗2542 岸1489 胺5143 案2714 肮7542 昂2491 盎4138 凹0425 敖2407 熬3581 翱5063 袄5984 傲0277 奥1159 懊2020 澳3421 芭5359 捌2193 扒2091 叭0665 吧0721 笆4576 八9908 八9808 八0360 八9708 疤4002 巴1572 拔2149 跋6405 靶7249 把2116 耙5090 坝8218 坝1056 霸7218 霸6011 罢5007 爸3640 白4101 柏2672 百4102 摆2369 佰0184 败2408 拜2157 稗4458 斑2432 班3803 搬2289 扳2104 般5301 颁7317 板2647 版3652 扮2101 拌2142 伴0133 瓣3904 半0584 办6586 绊4810 邦6721 帮1620 梆2735 榜2831 膀5218 绑4834 棒2761 磅4319 蚌5732 镑6967 傍0266 谤6196 苞5383 胞5165 包0545 褒5988 剥0475 薄5631 雹7192 保0202 堡1027 饱7394 宝1405 抱2128 报1032 暴2552 豹6283 鲍7637 爆3915 爆3615 杯2637 碑4301 悲1896 卑0585 北0554 辈6543 背5154 贝6296 倍0223 狈3709 备0271 惫1994 焙3538 被5926 奔1149 苯0058 本2609 笨4570 崩1514 绷4855 甭8005 泵3119 蹦6498 迸6618 逼6656 鼻7865 比3024 鄙6766 笔4581 彼1764 碧4310 蓖5557 蔽5599 毕3968 毙2426 毖3025 币1578

编码字符集标准及分类研究_谢谦

中 文 信 息 学 报 第20卷第5期 J OURNAL OF CH I NESE I NF OR MATI O N P ROCESSI NG V ol.20N o.5文章编号:1003-0077(2006)05-0083-08 编码字符集标准及分类研究 谢 谦1,2,芮建武1,吴 健1 (1.中国科学院软件研究所开放系统与中文信息处理中心,北京 100080;2.河南大学计算机与 信息工程学院,河南开封 475001) 摘要:编码字符集标准是计算机处理文字信息的基础,本文提出了编码字符集三元组抽象,对现有编码字符集标准进行了简单回顾和总结,深入剖析了影响巨大的ISO2022标准及其派生标准,对ISO2022编码机制应用于多语言环境的局限性进行了探讨,阐明了使用通用编码字符集UCS的必要性,并对其进行了分析。探讨了现有编码分类方法存在的问题,引入了一种对编码字符集以及实现方法进行分类的新方法,使用该方法对现有标准进行了归类;最后对汉字字符集相关的国家标准进行了分析评介。 关键词:计算机应用;中文信息处理;编码字符集 中图分类号:TP391 文献标识码:A Research on Coded Character Set Standards and C lassification X I E Q ian1,2,RU I Jian-wu1,W U Jian1 (1.Open Syste m and Ch i nes e Infor m ati on Processi ng Cen ter,Institute of Soft w are,C h i nes e A cade m y of S ci en ces,B eiji ng100080, Ch i na;2.S chool of Compu t er and In for m ation Engineeri ng,H enan Un i versity,Kaifeng,H enan475001,Ch ina) Ab strac t:Coded character se t standa rd are t he base s of t he co m puter t ex t infor m ati on processing.In t his pape r,a3-turples m ode l is proposed t o descibe the coded character se.t The ex isting code standards are reviewed and su mma-rized.A nd t he ISO2022and it's deriv i ng standards are ana l y zed in de tail;incl uding the li m ita tion o f u tilizi ng IS O 2022in m ultili ngua l env iron m en.t N ecessit y o f foundi ng UCS(U niversa lCha racter Se t)is present ed,a long w it h an outline ana l y sis o f UCS.A ft e r eva l uating current c l assifica tion m e t hods o f coded character set standa rds,a new m eth-od is produced w ith applica tion i n ca talogu i ng existing standa rds.W e c l o se ou r paper w ith a brief ana l ysis of i m po r-tan t Chinese na tiona l st andards on Han character se.t K ey word s:compu t e r applicati on;Ch i nese inf o r m ati on processing;coded character se t 计算机应用从单纯的科学计算转向信息处理,是引发二十世纪信息革命的里程碑事件,而支撑这一转变的重要基础就是字符编码;通过制定字符编码标准,在人能理解的文字信息与计算机内部表达之间建立了一个基本的沟通桥梁,直到今天,基于文字的交互途径仍然是最主要的人机界面。正如Unicode标准中所言[1],“对计算机软件系统而言,字符编码就像螺钉和螺母———虽然微小,却以各种方式被普遍使用。” 收稿日期:2005-07-08 定稿日期:2006-05-22 基金项目:国家863计划资助项目(2003AA1Z2110);中国科学院知识创新工程资助项目(KGCX2-S W-504) 作者简介:谢谦(1968—),男,博士生,主要研究领域为系统软件国际化,X W i ndow系统,L inux标准化.

计算机中最常用的字符信息编码是(

练习题 第1章 1-1选择: 1.计算机中最常用的字符信息编码是() A ASCII B BCD码 C 余3码 D 循环码 2.要MCS-51系统中,若晶振频率8MHz,一个机器周期等于( ) μs A 1.5 B 3 C 1 D 0.5 3.MCS-51的时钟最高频率是( ). A 12MHz B 6 MHz C 8 MHz D 10 MHz 4.以下不是构成的控制器部件(): A 程序计数器、B指令寄存器、C指令译码器、D存储器 5.以下不是构成单片机的部件() A 微处理器(CPU)、B存储器C接口适配器(I\O接口电路) D 打印机6.下列不是单片机总线是() A 地址总线 B 控制总线 C 数据总线 D 输出总线 7.-49D的二进制补码为.( ) A 11101111 B 11101101 C 0001000 D 11101100 8.十进制29的二进制表示为原码() A 11100010 B 10101111 C 00011101 D 00001111 9. 十进制0.625转换成二进制数是() A 0.101 B 0.111 C 0.110 D 0.100 10 选出不是计算机中常作的码制是() A 原码 B 反码C补码 D ASCII 1-2填空 1.计算机中常用的码制有。 2.十进制29的二进制表示为。 3.十进制数-29的8位补码表示为. 。 4.单片微型机、、三部分组成. 5.若不使用MCS-51片内存器引脚必须接地. 6. 是计算机与外部世界交换信息的载体. 7.十进制数-47用8位二进制补码表示为. 。 8.-49D的二进制补码为. 。 9.计算机中最常用的字符信息编码是。 10.计算机中的数称为机器数,它的实际值叫。 1-3判断 1.我们所说的计算机实质上是计算机的硬件系统与软件系统的总称。() 2.MCS-51上电复位时,SBUF=00H。()。SBUF不定。 3.使用可编程接口必须处始化。()。 4.8155的复位引脚可与89C51的复位引脚直接相连。()

Unicode汉字编码表

Unicode汉字编码表 1 Unicode编码表 Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个字符, 比如汉字"经"的编码是0x7ECF,注意字符编码一般用十六进制来 表示,为了与十进制区分,十六进制以0x开头,0x7ECF转换成十进制 就是32463,UCS-2用两个字节来编码字符,两个字节就是16位二进制, 2的16次方等于65536,所以UCS-2最多能编码65536个字符。 编码从0到127的字符与ASCII编码的字符一样,比如字母"a"的Unicode 编码是0x0061,十进制是97,而"a"的ASCII编码是0x61,十进制也是97, 对于汉字的编码,事实上Unicode对汉字支持不怎么好,这也是没办法的, 简体和繁体总共有六七万个汉字,而UCS-2最多能表示65536个,才六万 多个,所以Unicode只能排除一些几乎不用的汉字,好在常用的简体汉字 也不过七千多个,为了能表示所有汉字,Unicode也有UCS-4规范,就是用 4个字节来编码字符,不过现在普遍采用的还是UCS-2,只用两个字节来 编码,看一下Unicode对汉字的编码:

------------------------------------------------------------------------ 2 汉字编码表 U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F ----------------------------------------------------- 4e00 一丁丂七丄丅丆万丈三上下丌不与丏 4e10 丐丑丒专且丕世丗丘丙业丛东丝丞丟 4e20 丠両丢丣两严並丧丨丩个丫丬中丮丯 4e30 丰丱串丳临丵丶丷丸丹为主丼丽举丿 4e40 乀乁乂乃乄久乆乇么义乊之乌乍乎乏 4e50 乐乑乒乓乔乕乖乗乘乙乚乛乜九乞也 4e60 习乡乢乣乤乥书乧乨乩乪乫乬乭乮乯 4e70 买乱乲乳乴乵乶乷乸乹乺乻乼乽乾乿 4e80 亀亁亂亃亄亅了亇予争亊事二亍于亏 4e90 亐云互亓五井亖亗亘亙亚些亜亝亞亟 4ea0 亠亡亢亣交亥亦产亨亩亪享京亭亮亯 4eb0 亰亱亲亳亴亵亶亷亸亹人亻亼亽亾亿 4ec0 什仁仂仃仄仅仆仇仈仉今介仌仍从仏 4ed0 仐仑仒仓仔仕他仗付仙仚仛仜仝仞仟 4ee0 仠仡仢代令以仦仧仨仩仪仫们仭仮仯 4ef0 仰仱仲仳仴仵件价仸仹仺任仼份仾仿 4f00 伀企伂伃伄伅伆伇伈伉伊伋伌伍伎伏 4f10 伐休伒伓伔伕伖众优伙会伛伜伝伞伟 4f20 传伡伢伣伤伥伦伧伨伩伪伫伬伭伮伯

关于字符集和乱码的思考

关于字符集和乱码的思考 关于字符集和乱码的思考2011-12-12 16:05:58 分类:Delphi 重要提示:本文并非学术文章,本人也并非语言和文字学领域人士,只是出于好奇心,根据自己的理解写下这篇文章。本文的参考文档都来源于互联网,而且并未一一考证其准确性和权威性,因此本文仅供参考。 字符集和字符编码的问题一直困扰着我,之间曾经多次尝试把这个问题理解清楚,但始终由于有些细节问题无法自圆其说因而放弃。网上的资料多数描述过于简单,又或者作者本人对问题也了解不深入,容易产生误导。最近我终于下定决心将之前对“乱码”问题的思考更进一步,否则将始终是一丝遗憾。这里也不得不感叹,老外的“科普”做的好啊,网上有很多质量相当高的文章,表述严密,引用充分,例证丰富,我相信在国内各领域的专家也不少,计算机和语言学方

面都有很多有建树的大牛,也许是太忙吧。对我个人而言,最重要的一片文章是“Character set encoding basics”,在本文最后有链接的地址,本人的翻译版本在这里: https://www.sodocs.net/doc/1418403512.html,/space.php?uid=11187&do=b log&id=3034493 1.字符集的基本概念 什么是字符集?什么是字符编码? 按照“Character set encoding basics”文中的定义,字符集的编码模型分为以下4个层次 1)抽象字符清单Abstract character repertoire (ACR),无序,无编码; 2)已编码字符集Coded character set (CCS),有序,有编码; 3)字符编码规则Character encoding form (CEF),有序,有编码; 4)字符编码方案Character encoding scheme (CES),有序,有编码,有传输和储存规则(字节序); 这种分层方式,比较偏于学术化,不太容易理解。按我个人的理解,GB2312/GBK/GB18030/ASCII这些字符集编码规则,由于都基于8-bit字节,是属于前三层的,可以认为是三

UTF8与GBK字符编码之间的相互转换

UTF8与GBK字符编码之间的相互转换 C++ UTF8编码转换CChineseCode 一预备知识 1,字符:字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代表一个符号,没有任何实际值的意义。 2,字符集:字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。这也说明了字符和字符集之间的关系,字符组成字符集(iso8859-1,GB2312/GBK,unicode)。 3,代码点:字符集中的每个字符都被分配到一个“代码点”。每个代码点都有一个特定的唯一数值,称为标值。该标量值通常用十六进制表示。 4,代码单元:在每种编码形式中,代码点被映射到一个或多个代码单元。“代码单元”是各个编码方式中的单个单元。代码单元的大小等效于特定编码方式的位数:UTF-8 :UTF-8 中的代码单元由8 位组成;在UTF-8 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个、三个或四个代码单元;UTF-16 :UTF-16 中的代码单元由16 位组成;UTF-16 的代码单元大小是8 位代码单元的两倍。所以,标量值小于 U+10000 的代码点被编码到单个代码单元中;UTF-32:UTF-32 中的代码单元由32 位组成;UTF-32 中使用的32 位代码单元足够大,每个代码点都可编码为单个代码单元;GB18030:GB18030 中的代码单元由8 位组成;在GB18030 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个或四个代码单元。 5,举例:“中国北京香蕉是个大笨蛋”这是我定义的aka字符集; 各字符对应代码点为: 北00000001 京00000010 香10000001 蕉10000010 是10000100 个10001000 大10010000 笨10100000 蛋11000000 中00000100 国00001000 下面是我定义的zixia 编码方案(8位),可以看到它的编码中表示了aka字符集的所有字符对应的代码单元; 北10000001 京10000010 香00000001 蕉00000010 是00000100 个00001000 大00010000 笨00100000 蛋01000000 中10000100 国10001000 所谓文本文件就是我们按一定编码方式将二进制数据表示为对应的文本如00000001000000100000010000001000000100000010000001000000这样的文件。我用一个支持zixia编码和aka字符集的记事本打开,它就按照编码方案显示为“香蕉是个大笨蛋” 如果我把这些字符按照GBK另存一个文件,那么则肯定不是这个,而是1100111111100011

常用字符集编码详解:ASCII、GB2312、GBK、GB18030、...

ASCII ASCII 码是7位编码,编码范围是0x00-0x7F ASCII 字符集包括英文字母、 阿拉伯数字和标点符号等字符。其中 0x00-0x20和0x7F 共33个控制字符。 只支持ASCI 码的系统会忽略每个字节的最高位,只认为低 7位是有效位。 HZ 字符编码就是早期为了在只支持 7位ASCII 系统中传输中文而设计的编码。 早期很多邮件系统也只支持ASCII 编码,为了传输中文邮件必须使用 BASE64或 者其他编码方式。 GB2312 GB2312是基于区位码设计的,区位码把编码表分为 94个位,每个字符的区号和位号组合起来就是该汉字的区位 码。 10进制数来表示,如 1601就表示 16区1 位,对应的字符是 区号和位号上分别加上0xA0就得到了 GB2312编 码。 区位码中 01-09区是符号、数字区, 16-87区是汉字区, 未定义的空白区。它将收录的汉字分成两级: 第一级是常用汉字计 3755 个,置于 16-55 区,按汉语拼音字母 /笔形顺序排 列;第二级汉字是次常用汉字计 3008 个,置于 56-87 区,按部首 /笔画顺序排 列。一级汉字是按照拼音排序的,这个就可以得到某个拼音在一级汉字区位中 的范围,很多根据汉字可以得到拼音的程序就是根据这个原理编写的。 GB2312字符集中除常用简体汉字字符外还包括希腊字母、日文平假名及片 假名字母、俄语西里尔字母等字符,未收录繁体中文汉字和一些生僻字。可以 用繁体汉字测试某些系统是不是只支持 GB2312编码。 GB2312的编码范围是0xA1-0x7E 去掉未定义的区域之后可以理解为实际 编码范围是 0xA1-0xF7FE 。 EUC-CN 可以理解为GB2312的别名,和GB2312完全相同。 区位码更应该认为是字符集的定义,定义了所收录的字符和字符位置,而 94个区,每个区对应 区位码一般用 “啊”。在区位码的 10-15和 88-94是

相关主题