注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

WEB数据格式处理(BASE64、JSON)  

2012-09-10 18:10:56|  分类: Web技术-应用研究 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这里我们来简单说说Web数据格式处理:base64、JSON。

BASE64
    base64通常用于在邮件附件中嵌入二进制数据(或者说是为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的主体)或者将其作为HTTP协议的部分。
    base64编码将要编码的数据分为一个或多个24位组(即:3个字节 1字节(Byte)=8位(bit)),如果输入流中的字节数不是3(24位)的倍数那么将额外填充数据(保证24位)并且在编码的最后以'='字符表示出来。因此,一个有效的base64编码后端只能包含0个、1个(=)或者两个(==) 填充字符。
     另外需要注意的是,汉字占字节数与编码有关:
      UTF-8:           一个汉字=3个字节
      GBK:                一个汉字=2个字节
   在下面的例子中你将会看两者的不同。

   在python中我们可以这样来实现:

#coding:utf-8

import base64

#普通
print base64.b64encode('abc') #输出 YWJj

#以=填充

print base64.b64encode('a') #输出 YQ==


汉字(中文)问题:

#coding:utf-8

import base64
print base64.b64encode('中国') #输出 5Lit5Zu9

注意这里:如果是GBK编码,则会输出: 1tC5+g==
如果想去掉'1tC5+g=='字符中的'+'(或者'/'),则可以给b64encode()函数第二个参数,此参数是一个双字符字符串。
如:base64.b64encode('中国','99'),则会输出:1tC59g==

#coding:gbk

import base64
print base64.b64encode('中国') #输出 1tC5+g==

#去掉+(/)

print   base64.b64encode('中国','99') # 输出 1tC59g ==

解码:

#coding:utf-8
import base64
print base64.b64decode('5Lit5Zu9') #输出 中国



  在PHP中我们可以这样来实现:
  编码

<?php
$str = '中国';
var_dump(base64_encode($str)); #输出 string '5Lit5Zu9' (length=8)

解码

<?php
$str = '5Lit5Zu9';
var_dump(base64_decode($str)); #输出 string '中国' (length=6)

需要注意的是:以上要注意编辑器(程序)编码控制台(浏览器)编码要一致,否则解码时会出现乱码。

HASH加密
   在python、PHP中都提供了sha1和md5这两种常用的安全散列和消息摘要算法。
   在python中:

#coding:utf-8
import hashlib
d = hashlib.sha1('abc')
print d.hexdigest() #输出:a9993e364706816aba3e25717850c26c9cd0d89d
print hashlib.md5('abc').hexdigest() #输出:900150983cd24fb0d6963f7d28e17f7

 在PHP中:

<?php
$str = 'abc';
var_dump(sha1($str)); #string 'a9993e364706816aba3e25717850c26c9cd0d89d' (length=40)

var_dump(md5($str)); #string '900150983cd24fb0d6963f7d28e17f72' (length=32)


JSON格式
    json 简单说:它是一种数据的存储格式,是一种数据描述。它起到了 客户端Javascript和服务端python、PHP等相互间数据交互的桥梁。
   JSON 类型值与Python、PHP类型值之间的映射关系(需要注意的是:前端返回后端时JSON是一个字符串):

WEB数据格式处理(BASE64、JSON) - fc_lamp - @fc_lamp
简单的说明(解码成Python、PHP类型):
Python代码

#coding:utf-8

import json

d = json.JSONDecoder()

s = '[{"a":"aa"},[1,2,3],"string",2,2.0,2.34,true,false,null]';
print d.decode(s)

#输出:[{u'a': u'aa'}, [1, 2, 3], u'string', 2, 2.0, 2.3399999999999999, True, False, None]

注意浮点数。
PHP代码

<?php
$s = '[{"a":"aa"},[1,2,3],"string",2,2.0,2.34,true,false,null]';
var_dump ( json_decode ( $s ) );

#输出:

array

  0 => 
object(stdClass)[1]
public 'a' => string 'aa' (length=2)
1
=>
array
0
=> int 1
1
=> int 2
2
=> int 3
2
=> string 'string' (length=6)
3
=> int 2
4
=> float 2
5
=> float 2.34
6
=> boolean true
7
=> boolean false
8
=> null
在PHP中如果要将JSON对象转为数组,可给json_decode()第二个参数设置为True

<?php
$s = '[{"a":"aa"},[1,2,3],"string",2,2.0,2.34,true,false,null]';
var_dump ( json_decode ( $s,True) );

#输出:

array

  0 => 
array
'a'
=> string 'aa' (length=2)
1
=>
array
0
=> int 1
1
=> int 2
2
=> int 3
2
=> string 'string' (length=6)
3
=> int 2
4
=> float 2
5
=> float 2.34
6
=> boolean true
7
=> boolean false
8
=> null

以上要注意python、PHP对float类型的输出不同。(注意PHP内置的json处理函数在PHP5并且PHP 5 >= 5.2.0能使用。

简单的说明(编码成JSON格式):
python代码:

#coding:utf-8
#编码成JSON格式
import json
e = json.JSONEncoder()
l = [{'a':'aa','b':'bb'},[1,2,3],'a',2,2.0,2.34,True,False,None]
s = e.encode(l)
print s #输出 [{"a": "aa", "b": "bb"}, [1, 2, 3], "a", 2, 2.0, 2.3399999999999999, true, false, null]

注意浮点数,要准确的传回2.34可以将其格式为字符串即:'2.34'。

Python中的特殊性(开始之前建议你先看:《python中文处理》)
  在python中对于JSON的处理,还有几个问题需要注意:
     1)  在编码时遇到字节字符串时,默认使用utf-8解码为Unicode字符串。
     2)  在解码时JSON字符串总是以Unicode的形式返回(即字符前面有一个u标记)。
     3) JSONDecoder、JSONEncoder对象还有参数集合具体可参看手册。

以上问题在处理中文字符串时会出现:

#coding:utf-8
import json
e = json.JSONEncoder()
zh = '中国人'
l = [{'one':zh},{'one':'a'}]
#编码成JSON格式
s = e.encode(l)
print s #[{"one": "\u4e2d\u56fd\u4eba"}, {"one": "a"}]

这里如果说中文字符'中国人'没有解码成unicode,那么JSONEncoder()默认会以utf-8解码。
但是如代码编码与JSONEncoder()默认解码类型不一致得话就会报错:

#coding:gbk
import json
e = json.JSONEncoder()
zh = '中国人'
l = [{'one':zh},{'one':'a'}]
#编码成JSON格式
s = e.encode(l)
print s

以上代码会报:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
原因就是编码格式不一致造成的(注意这里不要将字符的编码、解码(编码格式)与 编码、解码成JSON格式搞混淆了。)。参看:http://fc-lamp.blog.163.com/blog/static/1745666872012121240969/

解决的方案有:
1 更改程序(代码)编码,即将coding改为utf-8

#coding:utf-8

2 预先解码字符:

#coding:gbk
import json
e = json.JSONEncoder()
zh = unicode('中国人','gbk')
l = [{'one':zh},{'one':'a'}]
#编码成JSON格式
s = e.encode(l)
print s #[{"one": "\u4e2d\u56fd\u4eba"}, {"one": "a"}]

这里字符解码成unicode的方法有很多,参看:http://fc-lamp.blog.163.com/blog/static/1745666872012121240969/

3  JSONEncoder()的编码方式

#coding:gbk
import json
e = json.JSONEncoder(encoding='gbk')
zh = '中国人'
l = [{'one':zh},{'one':'a'}]
#编码成JSON格式
s = e.encode(l)
print s #[{"one": "\u4e2d\u56fd\u4eba"}, {"one": "a"}]


相应的在解码时,也一样:

#coding:gbk
import json

#解码成python类型
d = json.JSONDecoder(encoding='gbk')
s = '[{"one": "中国"},{"one": "a"}]'
print d.decode(s) #[{u'one': u'\u4e2d\u56fd'}, {u'one': u'a'}]

不过,JSON格式中中文不会以这种形式存在。一般都是以unicode形式:s = '{"one":"\u4e2d","two":"\u56fd","three":"\u4eba"}'。

#coding:gbk
import json

#解码成python类型
d = json.JSONDecoder()
s = '{"one":"\u4e2d","two":"\u56fd","three":"\u4eba"}'
p = d.decode(s)
print p # 输出:{u'three': u'\u4eba', u'two': u'\u56fd', u'one': u'\u4e2d'}

print p['three'] #输出:人

延伸问题:《关于unicode对象以"字符串"形式存在问题》


而以上问题在PHP中处理较为方便:

<?php
#编码成JSON
$array = array ('a', 'b', 'c','中国人');
$json = json_encode ( $array );
var_dump ( $json ); #string '["a","b","c","\u4e2d\u56fd\u4eba"]' (length=34)


JSON的有序无序问题





 





  评论这张
 
阅读(2455)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017