2012-09-14 41 views
-3

我有一個UTF-8字符,我想將它轉換爲16位的unicode編碼。怎麼做?將字符轉換爲16位的unicode編碼

字符的Unicode可以通過閱讀它被寫入文件,並使用再版()等來獲得:

import codecs 
f = codecs.open("a.txt",mode='rb',encoding='utf-8') 
r = f.readlines() 
for i in r: 
    print i,repr(i) 

輸出:

پٹ u'\ufeff\u067e\u0679' 

現在,我怎麼能得到的16位unicode編碼爲u'\ufeff\u067e\u0679'

+5

「Unicode編碼」不是一個正確的術語。你在談論UCS-2,UTF-16或Unicode代碼點嗎? – Deestan

+0

值得注意的是0xfeff位在這裏只是作爲一個字節順序標記,它不是文本的一部分。 – LexyStardust

+0

從這裏看起來不像utf-8。 '\ u'通常表示一個unicode代碼點。從那裏你可以用不同的格式進行編碼,但不清楚你正在嘗試做什麼。請嘗試更詳細地解釋您的問題。 –

回答

0
>>> a=u'\ufeff\u067e\u0679' 
>>> a 
u'\ufeff\u067e\u0679' 
>>> a.encode("utf-16") 
'\xff\xfe\xff\xfe~\x06y\x06' 

最後一行是你想要的字符串。

+0

我該如何將這個unicode轉換成16位二進制格式。 – user1593134

3

爲了得到unicode的碼點,只需撥打ord

import io 
f = io.open("a.txt", mode='r', encoding='utf-8') 
for line in f: 
    print (line, repr(line), ' '.join(str(ord(c)) for c in line), 
        ' '.join('{0:b}'.format(ord(c)) for c in line)) 

沒有一個統一編碼。如果你正在尋找一個碼點的UTF-16表示(其中可長超過16位),只需撥打

u'\ufeff\u067e\u0679'.encode('utf-16') 
+0

我想爲我的unicode像unicode'U + 0623'的16位二進制表示我們有二進制表示'11011000 10100011' – user1593134

+0

爲什麼你需要二進制表示? – geoffspear

+0

@ user1593134添加二進制表示。由於Unicode跨越超過100000個> 2個字符,所以表示不一定是16位長。 – phihag

0

所以,如果你的字符串是s

s_enc = s.encode("utf-16") 
hex_string = "".join([format(i, "X").rjust(2,"0") for i in s_enc]) 
bin_string = "".join([format(i, "b").rjust(8,"0") for i in s_enc]) 

我認爲這是你之後? (測試py3k,但應該在2我認爲)。

編輯:需要Python的2倍稍微修改:

s_enc = s.encode("utf-16") 
hex_string = "".join([format(ord(i), "X").rjust(2,"0") for i in s_enc]) 
bin_string = "".join([format(ord(i), "b").rjust(8,"0") for i in s_enc]) 

但是,無論哪種方式,關鍵的是要調用編碼()首先將其轉換爲您所選擇的編碼(這是不明朗的問題,但在行之間讀取,是UTF-16)

+0

也許我錯過了py3k進化中的一些東西,但是不是'a'.rjust(2,「0」)'相當於'a'.zfill(2)'? – tzot

+0

是的,我想是的,我沒有意識到zfill可以使用任意字符串 - 雖然認爲它可能不喜歡十六進制字符 - 文檔會說「返回*數字*字符串,左邊填滿了零...「所以我認爲這些十六進制字符可能會使事情變得很糟糕 - 顯然不是,所以是的,如果你願意的話,你可以在我的例子中使用zfill(2)或者zfill(8)我認爲zfill的關鍵在於它處理一個負面的正確地簽署 - 不是我的代碼中的問題,我不認爲。 – LexyStardust