python中文乱码解决
首先来看Python (command line)环境
先生成unicode字符
>>> ss=u"武器"
>>> ss>>>
然后是普通字符
>>> s="武器"
>>> s
'\xce\xe4\xc6\xf7'
>>>
出现了中文乱码
我们通过print语句可以将它们输出,但问题仍没有解决
>>> print s
武器
>>> print ss
武器
>>> print sss
武器
判断字符串的类型是否为unicode类型
>>> isinstance( s, str )
True
>>> isinstance( s, unicode)
False
>>>
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
我们先处理非unicode字符,解码为utf-16格式,也可以解码成gbk格式
>>> x=s.decode('gbk')
>>> x
u'\u6b66\u5668'
>>> s
'\xce\xe4\xc6\xf7'
>>> s.decode("utf-16")
u'\ue4ce\uf7c6'
>>>
>>> print x
武器
此外可以使用形如下面的unicode函数来转换
unicode(s, "gbk")
武器
在ubuntu上安装PostgreSQL
sudo apt-get install -y postgresql-9.1postgresql-client-9.1 postgresql-contrib-9.1postgresql-server-dev-9.1
PostgreSQL登录(使用psql客户端登录)
使用postgres 用户登录的意思
sudo -u postgres psql
PostgreSQL数据默认会创建一个postgres的数据库用户作为数据库的管理员,密码是随机的,所以这里设定为'postgres'
修改PostgreSQL登录密码:
postgres=# ALTER USERpostgres WITH PASSWORD 'postgres';
//postgres=#为PostgreSQL下的命令提示符
4.退出PostgreSQLpsql客户端
postgres=# \q
修改linux系统的postgres用户的密码(密码与数据库用户postgres的密码相同)
/etc/init.d/postgresql restart
(1 rows)
pg_hba.conf是设置访问认证的主要文件,格式为每条记录一行,每行指定一条访问认证。设定一条访问认证包含了7个部分:连接方式(type)、数据库(database)、用户名(user)、ip地址(ip-address)、子网掩码(ip-mask)、认证方法(authentication method)、认证配置(authentication-option),以下是这7个部分的详细说明:
连接方式(type)
连接方式共有三种:local、host、hostssl
local
这条记录匹配通过 Unix 域套接字进行的联接企图, 没有这种类型的记录,就不允许 Unix 域套接字的联接。
host
这条记录匹配通过 TCP/IP 网络进行的联接尝试,请注意,除非服务器是 带着 -i 选项或者打开了 postgresql.conf 里面的 tcpip_socket 配置参数集启动的,否则 TCP/IP 联接是被禁止掉的。
hostssl
这条记录匹配通过在 TCP/IP 上进行的 SSL 联接企图, host 记录可以匹配 SSL 和非 SSL 的联接企图, 但 hostssl 记录需要 SSL 联接。
数据库(database)
声明记录所匹配的数据库。值 all 表明该记录匹配所有数据库, 值 sameuser表示如果被请求的数据库和请求的用户同名,则匹配。 samegroup 表示请求的用户必须是一个与数据库同名的组中的成员。 在其他情况里,这就是一个特定的 PostgreSQL 的名字。 我们可以通过用逗号分隔的方法声明多个数据库。 一个包含数据库名的文件可以 通过对该文件前缀 @ 来声明.该文件必需和 pg_hba.conf 在同一个目录。
用户名(user)
为这条记录声明所匹配的 PostgreSQL 用户,值 all 表明它匹配 于所有用户。否则,它就是特定 PostgreSQL 用户的名字,多个用户名可以通过用逗号分隔的方法声明,组名字 可以通过用 + 做组名字前缀来声明。一个包含用户名的文件可以 通过在文件名前面前缀 @ 来声明,该文件必需和 pg_hba.conf 在同一个目录。
ip地址(ip-address)、子网掩码(ip-mask)
这两个字段包含标准的点分十进制表示的 IP地址/掩码值。 (IP地址只能用数字的方式声明,而不能用域名或者主机名)它们俩放在一起,声明了这条记录匹配的客户机的 IP 地址。 准确的逻辑是:(actual-IP-address xor IP-address-field) and IP-mask-field 对于要匹配的记录必需为零。如果连接方式是host或者hostssl的话,这两项必须指定,否则可以不填。
认证方法(authentication method)
trust
无条件地允许联接,这个方法允许任何可以与PostgreSQL 数据库联接的用户以他们期望的任意 PostgreSQL 数据库用户身份进行联接,而不需要口令。
reject
联接无条件拒绝,常用于从一个组中"过滤"某些主机。
md5
要求客户端提供一个 MD5 加密的口令进行认证,这个方法是允许加密口令存储在pg_shadow里的唯一的一个方法。
crypt
类似 md5 方法,只是用的是老式的 crypt 加密认证, 用于 7.2 以前的客户端,对于 7.2 以及以后的客户端,我们建议使用 md5。
password
和"md5"一样,但是口令是以明文形式在网络上传递的,我们不应该在不安全的网络上使用这个方式。
krb4
用 Kerberos V4 认证用户,只有在进行 TCP/IP 联接的时候才能用。(译注:Kerberos,"克尔波洛斯",故希腊神话冥王哈得斯的多头看门狗。Kerberos 是 MIT 开发出来的基与对称加密算法的认证协议和/或密钥 交换方法,其特点是需要两个不同用途的服务器,一个用于认证身份, 一个用于通道两端用户的密钥交换。同时 Kerberos 对网络时间同步 要求比较高,以防止回放攻击,因此通常伴随 NTP 服务。)
krb5
用 Kerberos V5 认证用户.只有在进行 TCP/IP 联接的时候才能用。(译注:Kerberos V5 是上面 V4 的改良,主要是不再依赖 DES 算法, 同时增加了一些新特性。)
ident
获取客户的操作系统名(对于 TCP/IP 联接,用户的身份是通过与运行在客户端上的 ident 服务器联接进行判断的,对于本地联接,它是从操作系统获取的。) 然后检查一下,看看用户是否允许以要求的数据库用户进行联接, 方法是参照在 ident 关键字后面声明的映射。
如果你使用了 sameuser 映射,那么假设用户名 是相等的。如果没有声明这个关键字,则在 $PGDATA/pg_ident.conf 文件中找出映射名。如果这个文件里包含一条记录标识着ident提供的用户名 和请求的 PostgreSQL 用户名的映射, 那么联接被接受。
对于本地联接,只有在系统支持Unix域套接字信任证的情况下 才能使用(目前是 Linux, FreeBSD, NetBSD, 和 BSD/OS)。
pam
使用操作系统提供的可插入的认证模块服务 (Pluggable Authentication Modules)(PAM)来认证。
认证配置(authentication-option)
host all all 192.168.1.0/24 md5 这行的意思是允许所有 192.168.1.***postgresql.conf,
因为pg默认是只监听本地的请求,所以要将listen_address='*','*'是监听所有的,‘localhost’是监听本地
python连接pgsql数据库,print中文乱码
#!/usr/bin/env python # -*- coding: utf-8 -*- import pygtk pygtk.require('2.0') import gtk import psycopg2 myi=[] conn= psycopg2.connect("user=stdmsg dbname=std_msg password=myhasplcsdn") cur = conn.cursor() cur.execute('SELECT * FROM students') rows = cur.fetchall() for i in rows: myi=i; cur.close() conn.commit() conn.close() class DeepFuture: def blogurlshow(self): #处理unicode字符,解决在WIN下的print乱码 for ii in myi: if isinstance(ii,str): print unicode(ii,'utf-8') else: print ii def mynameshow(self): print "http://blog.csdn.net/u010255642" def buttonpress(self,widget, data): if data=="blog": self.blogurlshow() else: self.mynameshow() def delwin_event(self,widget,event,data=None): #如果你在"delete_event"信号处理中,返回FALSE,GTK会继续发射这个信号,以供destroy,否则返回TRUE,表示这个信号已经被处理,不需要再处理了,也不需要再发射这个信号了,这意味着你不能destroy窗口。 print("delete event!") return False def destroy_win(self,widget,data=None): #窗口销毁处理 print("destroy event!") gtk.main_quit() def __init__(self): #创建一个新窗口 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.set_title("2个按钮的窗口") #放入一个不可见的box,然后在里面放2个按钮,并设置回调 self.buttonbox = gtk.HBox(False, 0) self.window.add(self.buttonbox) self.blogbutton = gtk.Button("记录") self.namebutton = gtk.Button("博客") self.blogbutton.connect("clicked", self.buttonpress, "blog") self.namebutton.connect("clicked", self.buttonpress, "name") #加入box self.buttonbox.pack_start(self.blogbutton, True, True, 0) self.buttonbox.pack_start(self.namebutton, True, True, 0) #显示 self.blogbutton.show() self.namebutton.show() self.buttonbox.show() #指定窗口信号与相关处理事件 self.window.connect("delete_event", self.delwin_event) self.window.connect("destroy", self.destroy_win) self.window.set_border_width(15) #显示窗口 self.window.show() def main(self): gtk.main() if __name__ == "__main__": deep=DeepFuture() deep.main()
下面是这个示例程序的输出
1
张三
22
1
1
1
http://blog.csdn.net/u010255642
delete event!