当前位置:C++技术网 > 资讯 > [C++] 做服务器开发应该选择什么编码格式

[C++] 做服务器开发应该选择什么编码格式

更新时间:2017-01-20 09:52:41浏览次数:1+次

    假设一个例子,在项目开发过程中,公司要发布一个商品,需把商品的价格,名称,功能,开发者名称等数据保存到服务器中,然后客户可以通过软件或网页登录查看该商品的数据。

    这个过程中,需要知道一件事情,那就是编码格式,因为商品的名称编码格式是 Ansi,而客户软件的编码格式是 Unicode,网页的编码格式是 UTF-8(网页开发并未深入,或许不太理解)。

    这时想到解决方法就只能是转码了,服务器发送 Ansi 数据过去,客户软件转码成 Unicode,这个中间的过程会消耗一点时间,但比较合理。

    那么是否还存在更好的解决方案呢?

    最后感谢 C++ 技术网的解答。



C++技术网会员解答:

    为了让你更好的理解编码问题,我先说下编码是个什么东西。

    为什么需要编码呢?在计算机中,数据全部是二进制的格式存储,也就是010101这样的形式。我们稍微做一些处理,就是将这种二进制数据转为十六进制的数字,让人类易于阅读。但是,这仅限于数字类。字符类的信息都是无法直接存储在计算机中的。字符的识别是一个解释的过程,同样要给数值根据不同的编码格式去解释,就可以得到不同的字符,就好比同一个人,根据所处的位置不同可以解释成乘客、儿子、爸爸等等。并不是本质的数据发生变化,而是观察者的角度或者说解释的依据变了。

    所以,对于字符的理解,就和编码表分不开了。没有编码表,你就无从识别字符。编码表中,一个数值代表一个字符,计算机存储的都是数字,通过编码表,我们才知道这个数字代表什么字符,才知道对方给我们传了什么消息。不同的编码表也就是不同的编码格式了。现存的编码表有很多,比如ASCII、Unicode等。编码表是数字和字符的对应表,而具体要在代码中实现,就是我们在代码中常见的编码和解码功能。编码和解码都是在按照编码表解释字符。不同的编码也就对应了不同的编码表而已。而在代码中,我们见到的ANSI对应的是ASCII编码表,UTF-8、UTF-16、UTF-32等都对应着Unicode编码表,只是实现的方式不同罢了。当然,实现方式不同,对于字符的解释方式是有差异的,不能混用。

    因此,对于字符的传递,编码和解码是必须进行的操作。所谓的转码只不过是换了一种方式解码而已,并不会真的额外消耗多少开销。因为你总会用一种方式解码。我们以为传送的是ANSI,接受成Unicode,似乎会造成额外的解码,其实不是的。就算我们不用Unicode解码,我们还是会用ANSI解码的。需要注意的是,如果编码方式和解码方式是不匹配的,就会出现乱码。所以,也不是说,你按一种编码传送数据过去,客户就可以随便用什么方式解码就行的。

    更好的解决方案以及让人最省心的做法就是,统一编码格式。发送端和接收端都用同样的一种编码来处理,这样在写代码时会很方便,不会转来转去。如果代码不熟练,可能就设置了不合适的参数,做了额外的无用功。而且,如果最终编码不对,还是乱码。

    我们现在没有统一编码格式,多种编码格式都在使用。为了不造成乱码,维护开发困难的情况,一般都会在文件的开头声明或者在协议开头声明或者约定一种编码格式,我们可以根据文件中注释好的编码格式说明,了解到当前文件所用的编码。

    基本是处理字符的功能库都支持现有的所有的编码格式,如果我们不清楚格式,只要尝试着改变编码格式,当所有读取到的数据都解码正常的时候,就是正确的编码格式了。一般在开发的时候,编码格式都会提前明确告诉你的。如果我们能够统一编码,那就都按照同样的编码写代码,如果不能,也不要紧。我们先按照对方的编码将数据读取出来,然后转码为我们自己需要的,然后继续处理。这个过程没有更好的,只有合适的。如果编码没有处理好,就会有乱码。除非有特别需要(比如代码都写好了),否则我们都尽可能按照对方的编码格式写代码,也不过就是约定一下自己的编码格式而已。在代码实现上,都不需要我们自己去具体实现编码和解码。

    如果想减少传递数据的数据量,而且避免字符串的传递,还有一种可行的方案,那就是制定协议。协议是网络通信非常常见的做法,不过实现难度会大。协议中,我们对于各种产品制定一个编码对应表,一个数值对应一种产品。比如我们在一个字段里传递数值0代表空运,1代表陆运,2代表海运。那么此时我们只传递一个数字,占用一个字节,而且没有编码问题。我们所要做的就是解释这个数值,地方在接收到这个数值时,要按照同样的方式解释。相对于直接传递"空运"这样的字符串,是很有优势的。问题就是实现稍微要复杂些,因为你需要去制定这样一个对应数值的含义对应表,就和编码表一样的。而这样的实现方法,一般用在socket实现上。在应用层上,用字符方式实现还是更方便些。

    网络传递数据,非常流行的做法就是json和xml两种格式。如果我们只是传递数据,就用这两种方式,如果是网页,那就是html。json和xml不限于web开发,属于通用的数据传递格式了。对于json的学习,网上很多资料。xml的学习,我们网站也有很多文章供参考。

    相信看完这些解答,你会对编码有进一步的了解,你自己心中会有一个满意的答案的。