本部落格所有内容是原創,未經書面許可,嚴禁任何形式的轉
http://blog.csdn.net/u010255642
python中文亂碼解決
首先來看Python (command line)環境
先生成unicode字元
>>> ss=u"武器"
>>> ss
u'\u6b66\u5668'
>>> sss=u'武器'
>>> sss
u'\u6b66\u5668'
>>>
然後是普通字元
>>> 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")
>>> x=unicode(s,'gbk')
>>> x
u'\u6b66\u5668'
>>> print x
武器
在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的密碼相同)
删除和修改PostgreSQL使用者密碼
sudo passwd -d postgres
PostgreSQL資料預設會建立一個linux使用者postgres,修改密碼
sudo -u postgres passwd
輸入新的 UNIX 密碼:
重新輸入新的 UNIX 密碼:
passwd:已成功更新密碼
在資料庫伺服器上用postgres帳号通過psql或者pgAdmin等等用戶端操作資料庫了。
/etc/init.d/postgresql restart
檔案系統級别備份(冷備份)
檔案系統級别的備份是冷備份,需要停止資料庫。
1 ,停止資料庫
pg_ctl –D /usr/local/pgsql/data stop
2 ,備份資料庫
tar –jcv –f /usr/local/pgsql/backup/filesystem.tar.bz2 /usr/local/pgsql/data/
3 ,删除 /usr/local/pgsql/data/ 目錄
rm –r /usr/local/pgsql/data/
4 ,解壓備份檔案到原目錄
tar –jxv –f /usr/local/pgsql/backup/filesystem.tar.bz2 –C /
5 ,啟動資料庫
pg_ctl –D /usr/local/pgsql/data start
6 ,檢視資料庫 pg1 是否恢複
psql pg1
pg=# select * from tb1;
a
---
1
(1 rows)
PostgreSQL pg_hba.conf 檔案
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!