前两天在写一个小的web service工具,遇到了一个问题。
当时在用node.js,想要调用python的一个服务,python的service是用了grpc,看了一下文档,node.js是支持grpc的,但是样例只给了同语言的调用,不知道node.js能不能调python。
后来仔细一想,这东西如果不能调,写个protobuf的意义就不大了,所以果断写一发。结果写完了发现个很蛋疼的问题,用js穿了个字符串给python,但是python那边拿到的字符串乱码了,而且怎么看都不像是一个正常的编码。
研究了半天也搞不定,后来实在没办法,写了一个node.js的server,看看js互相调用是否有问题,结果发现还是乱码,但js的乱码和python不一样,后来发现,拿到的字符串用base64解码就可以用了。但这对于python那边的状况还是无法解释,经同事的提醒,发字符串的时候,用base64编码一下就可以了。
这让我很疑惑,为什么base64编码就行了?查了一下,base64主要是为了将不可见字符转换成可见字符,据说由于历史原因,传输信道只支持ASCII字符,如果有非ASCII字符,就容易出现各种奇怪的问题。base64的原理也很简单,就是把3个8位bit转化为4个6位bit保存,每个6位bit高位补零,这样增加了信息的体积,也减小了字符的范围。这东西还是挺有用的, 学习了,不过我发的串里并没有非ASCII字符啊!