gb2312和UTF-8的区别

GB2312编码大约包含6000多汉字(不包括特殊字符),编码范围为第一位b0-f7,第二位编码范围为a1-fe(第一位为cf时,第二位为a1-d3),计算一下汉字个数为6762个汉字。当然还有其他的字符。包括控制键和其他字符大约7573个字符编码
gbk编码是对gb2312编码的扩充,容纳的汉字更多,但仅仅是扩充,没有质的变化。保留了所有gb2312编码,在此基础上进行编码范围的扩充.容纳(包含特殊字符)共22014个字符编码.
gb18030编码是在gbk编码基础上的扩充,因为汉字更多,仅仅使用两位编码已经不能
容纳要求的汉字,所以采用了2/4位混和的办法,可以支持更多的汉字编码。并且保留了原有的gbk 2字节编码兼容gb2312和gbk编码的文件。大概容纳55657个编码(包含特殊字符)
unicode编码(也就是UTF编码):俗称万国码,致力于使用统一的编码准则表达各国的文字。
为表达更多的文字,utf-8采用2/3混编的方式。目前容纳的汉字范围小于gbk编码。并且以
3字节的方式处理中文,带来了兼容性的问题,原有的gbk,gb2312,gb18030编码文件都不能正常的处理,还有很长的路要走。

有关汉字字符标准的说明 
GB2312编码大约包含6000多汉字(不包括特殊字符),编码范围为第一位b0-f7,第二位编码范围为a1-fe(第一位为cf时,第二位为a1-d3),计算一下汉字个数为6762个汉字。当然还有其他的字符。包括控制键和其他字符大约7573个字符编码
gbk编码是对gb2312编码的扩充,容纳的汉字更多,但仅仅是扩充,没有质的变化。保留了所有gb2312编码,在此基础上进行编码范围的扩充.容纳(包含特殊字符)共22014个字符编码.
gb18030编码是在gbk编码基础上的扩充,因为汉字更多,仅仅使用两位编码已经不能
容纳要求的汉字,所以采用了24位混和的办法,可以支持更多的汉字编码。并且保留了原有的gbk 2字节编码兼容gb2312和gbk编码的文件。大概容纳55657个编码(包含特殊字符)
unicode编码(也就是UTF编码):俗称万国码,致力于使用统一的编码准则表达各国的文字。
为表达更多的文字,utf-8采用2/3混编的方式。目前容纳的汉字范围小于gbk编码。并且以
3字节的方式处理中文,带来了兼容性的问题,原有的gbk,gb2312,gb18030编码文件都不能正常的处理,还有很长的路要走。


到底是用UTF-8还是GB2312


倾向于 gb2312

我现在用的是英文 2000,可除了界面的"开始"变成"Start"这样的微小变化外其他东西用起来没有感到任何差别,刚装完 2000 的时候随便去一个国内网站他就会问你是否要装简体中文,点了是,安一下,连 IE 都不用重新打开就可以直接看中文了,英文系统看中文是如此简单,换成繁体系统看简体应该没有任何差别的,不可能会出现看不了或者乱码的情况。

UTF-8 的同屏显示多语种确实是个很有意思的新玩意,不过毕竟是后来的,只要用就得成天考虑兼容问题,况且很少需要 UTF-8 的特性:我用简体中文写东西,看的人一般系统里只有简体中文或者安个简体中文就可以看了,永远不会出现一个倭文或者韩文,那么 UTF-8 还有用的必要了吗?

XML 和 DVD 这些非常好的东西,推行了很多年也无法成为"缺省配置",恩,对,GB2312 之于 UTF-8,正如同 VCD 之于 DVD:DVD 好是好,可目前几乎所有的软件还都是用 650MB 的光盘发行,一台家用电脑可以读不了 DVD,但绝对不可以读不了普通的光盘,否则连装个系统启动起来都很困难。


UTF8还是GB2312? 
早些年上网的朋友都知道,NS或IE浏览器早期的版本并不支持多国语言的浏览,如果想浏览繁体中文、日文等外文网站还需要一个如"中文之星"或"四通立方"的外挂软件,后来浏览器逐步发展升级,到目前为止,几乎所有浏览器都支持多国语言字符,可以浏览任意国家、语言的网站。Blog的出现,特别是Trackback的出现,使网络国际化的行为由被动的浏览信息向主动式的交互信息过渡,然而新的语言障碍问题又出现了...

问题主要出在Blog的Trackback(引用)、Ping(通告)、Notification(通知书)等交互具有的功能上。以前我们在理解和应用网络上的交互主要局限在C-S范围之内,也就是客户(个人)与服务器(网站)之间的信息交互,例如:在网络上发布一篇文章或回复一个论坛帖子,一般来讲这样的交互很少会出现语言不兼容的问题。然而Blog中的Trackback等的交互方式不只是C-S的,它还是S-S(Blog网站之间)的,甚至是多重的,例如在发布一篇文章的时候,你可以同时选择让它同时发布在一个或多个不同的Blog上,或者给指定的人发出更新通知,也可以让更多的人预订、收录你的RSS内容更新信息。Blog的交互方式更多、更灵活,当然,这种交互并非没有限制,语言编码是一个很大障碍,如果你的Blog系统编码是中文简体的GB2312,那么所有Trackback、Ping的交互对象就只能限于国内采用GB2312编码的用户,你的Blog也就无法与台湾、日本等采用非GB2312编码的用户实现交互。

比较好的解决办法是采用UTF-8编码,虽然采用UTF-8编码回多占用一些空间(一个汉字需3个字节),但国际化问题总算解决了,UTF-8兼容GB2312、BIG5、EUC-JP等多种国家的语言编码,经测试,采用UTF-8编码的Blog之间的各种交互、通讯没有任何问题。事实上90%以上的台湾Blog都已经舍弃了BIG5,而采用UTF-8的编码方式,而大陆的Blog几乎还都是GB2312编码,看来台湾在国际化方面还是相当领先的。

前几日,我将自己的Blog从GB2312编码转为了UTF-8编码,Trackback和Ping了几个台湾朋友的Blog,没有发现问题。看来"国际化"的问题已经解决了,但随之而来有出现了新的问题,我的Blog与国内GB2312编码的Blog又无法交互了,当然这是必然的。我Ping到online-edu.org(网站采用GB2312编码)上的信息都成了乱码。

我想问题到此,已经不是技术层面的了。如果你的站点或Blog有国际化交流的需求,可通过采用UTF-8编码的方式来解决,如果没有这个需求,采用GB2312也无大碍。在用户看来都是一样的,编码只是后台的东西。不过我希望Blogger们最好都采用UTF-8编码,因为你的Blog有了Trackback和Ping,它们可是持有国际航班的机票,如果只在本国转悠,确实很浪费。

关于TrackBack
TrackBack最早是Movable Type上的一个小功能。可以说就是这个小功能在blog界却掀起了一场革命。 

TrackBack为将全世界无数个blog连接起来的功能。例如,当你读了某个网站的文章,想对此写下自己的感想。这个时候利用网站准备的讨论功能进行投稿是很最常见的做法。但这样只是把自己的评论意见写下来向别人的网站投稿,而你自己手里却什么也没留下。 

TrackBack则与之有很大的区别。可以把评论写到自己网站上。然后向刊载原始文章的服务器发送该网页的URL及标题、部分正文、网站名称等信息(注)。尽管这一过程只是称之为"发送TrackBack Ping",但通过这种办法,在原始文章的地方就留下了你的评论的URL、标题等部分信息。当然别人也可以向原始文章发送TrackBack Ping,所以在原始文章中就将包括你的TrackBack Ping在内的所有评论都记录了下来。 

此外,如果你在自己网站上也设置了TrackBack Ping功能的话,那么谁都可以通过TrackBack Ping来发表针对你的意见了。这样,多家网站就通过相关话题而联接起来。各种评论在因特网上就像网眼一样联接起来。这样就创造出了与日记网站完全不同的文化。 

注:发送地址采用原始文章指定的URL,这一URL就称为"TrackBack Ping URL"。最后的"128"为原始文章的专用数字,称为"TrackBack ID"。另外,TrackBack的技术标准刊登在"LowLife.jp"的blog网站上。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: GB2312UTF-8是两种不同的字符编码标准,它们在字符编码方式、字符集大小、字节数等方面都存在差异。因此,要将GB2312编码的字符串转换为UTF-8编码的字符串,需要进行编码转换。 在C语言中,可以使用iconv库来进行字符集转换。iconv库是一个系统库,可以实现不同编码之间的转换。在使用iconv库之前,需要先启用头文件#include <iconv.h>。 下面是一个示例程序,用于将GB2312编码的字符串转换为UTF-8编码的字符串: ``` #include <stdio.h> #include <iconv.h> #include <stdlib.h> #include <string.h> int main() { char *gb2312_str = "hello world!"; size_t gb2312_len = strlen(gb2312_str); size_t utf8_len = gb2312_len * 3; // UTF-8最多可能会占用3个字节 char *utf8_str = (char *)malloc(utf8_len); // 分配空间 // 初始化iconv_t iconv_t cd = iconv_open("UTF-8", "GB2312"); if (cd == (iconv_t)-1) { printf("初始化iconv_t失败!\n"); exit(1); } // 进行转换 char *inbuf = gb2312_str; char *outbuf = utf8_str; size_t inlen = gb2312_len; size_t outlen = utf8_len; size_t ret = iconv(cd, &inbuf, &inlen, &outbuf, &outlen); if (ret == (size_t)-1) { printf("转换失败!\n"); exit(1); } // 输出UTF-8编码的字符串 printf("UTF-8编码的字符串:%s\n", utf8_str); // 关闭iconv_t iconv_close(cd); free(utf8_str); // 释放空间 return 0; } ``` 在上面的示例程序中,我们使用iconv_t类型表示转换句柄,使用iconv_open()函数来初始化转换句柄。在进行转换时,使用iconv()函数将GB2312编码的字符串转换为UTF-8编码的字符串,并将结果保存在utf8_str中。 最后,使用iconv_close()函数关闭转换句柄,并使用free()函数释放分配的内存空间。 当然,对于实际应用场景,可能还需要进行一些优化和错误处理,例如对输入字符串进行判断、对输出字符串进行截断等等。 ### 回答2: 将GB2312编码转换为UTF-8编码是一种编码转换的过程,可以使用C语言对字符串进行转换实现。具体操作可以如下: 首先需要了解一些基本知识。GB2312编码是双字节编码,每个汉字用两个字节表示;而UTF-8编码是一种变长编码,每个字符根据不同范围的Unicode码用1~4个字节表示。 1. 将GB2312编码的字符串转换为Unicode码。可以使用WideCharToMultiByte()函数将GB2312编码转换为Unicode码,以便进一步处理。 2. 将Unicode码转换为UTF-8编码。可以使用WideCharToMultiByte()函数,设置输出编码格式为UTF-8,即可将Unicode码转换为UTF-8编码。 3. 将UTF-8编码的字符串打印输出。可以使用puts()或printf()函数将字符串输出到屏幕上,确认转换结果是否正确。 需要注意的是,转换过程中可能会出现一些细节问题,如代码页的不同,转换后的字符串长度的变化等。因此,最好在进行转换时,考虑到这些细节问题,避免出现转换错误。 ### 回答3: GB2312UTF-8都是Unicode编码的变体,但是它们之间是有区别的。GB2312是早期的中文编码,使用双字节表示每个字符,而UTF-8则是一种比较新的编码格式,也是使用变长的字节表示字符,可以表示全球范围内的字符。 在C语言中,我们可以使用iconv函数来进行编码转换。iconv函数的原型如下: ``` #include <iconv.h> size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); ``` 其中,参数cd是一个iconv_t类型的转换描述符,如果cd等于(iconv_t) -1,则表示转换失败;参数inbuf指向被转换的字符串;参数inbytesleft表示输入的长度,并被函数用于记录转换后余下的需要转换的字节数;参数outbuf指向输出缓冲区,参数outbytesleft表示输出缓冲区的大小并记录转换后余下的缓冲区大小。 我们可以通过下面的代码将GB2312字符串转换为UTF-8字符串。 ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iconv.h> #include <errno.h> int main() { char *src = "你好,世界!"; size_t srclen = strlen(src); size_t dstlen = srclen * 2; char *dst = (char *)malloc(dstlen); memset(dst,0,dstlen); iconv_t cd = iconv_open("UTF-8","GB2312"); if (cd == (iconv_t) -1){ perror("iconv_open"); exit(EXIT_FAILURE); } char *inbuf = src; char *outbuf = dst; if (iconv(cd, (char **)&inbuf, &srclen, &outbuf, &dstlen ) == -1) { perror("iconv"); exit(EXIT_FAILURE); } printf("GB2312: %s\n",src); printf("UTF-8: %s\n",dst); iconv_close(cd); free(dst); return 0; } ``` 在这个例子中,我们首先定义了一个需要转换的GB2312字符串,在使用iconv_open函数创建一个iconv_t类型的转换描述符时,我们指定了源编码是GB2312,目标编码是UTF-8。然后,我们再定义一个输出缓冲区,使用iconv函数将GB2312字符串转换为UTF-8字符串。 最后,我们通过printf函数按照不同的编码格式输出了转换后的字符串。需要注意的是,这个例子中的代码并没有对错误进行完整的处理,因此在实际应用时需要注意添加错误处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值