2010-11-21 37 views
6

tôi có một 16bit về cuối lớn chuỗi unicode biểu diễn dưới dạng u '\ u4132',nhận byte từ chuỗi unicode trong python

làm thế nào tôi có thể chia nó cho số nguyên 41 và 32 trong python?

+1

Toàn bộ câu hỏi cần lời giải thích. Không có thứ gì như "chuỗi unicode n-bit lớn n-bit". Những gì bạn có là một đối tượng unicode chiều dài 1. Thứ hai, biểu diễn là HEXAdecimal. Bạn muốn làm gì với 'u '\ uabcd''? Thứ ba, TẠI SAO bạn muốn nó chia thành các byte? –

Trả lời

13

Dưới đây là một loạt các cách khác nhau bạn có thể muốn nó.

Python 2:

>>> chars = u'\u4132'.encode('utf-16be') 
>>> chars 
'A2' 
>>> ord(chars[0]) 
65 
>>> '%x' % ord(chars[0]) 
'41' 
>>> hex(ord(chars[0])) 
'0x41' 
>>> ['%x' % ord(c) for c in chars] 
['41', '32'] 
>>> [hex(ord(c)) for c in chars] 
['0x41', '0x32'] 

Python 3:

>>> chars = '\u4132'.encode('utf-16be') 
>>> chars 
b'A2' 
>>> chars = bytes('\u4132', 'utf-16be') 
>>> chars # Just the same. 
b'A2' 
>>> chars[0] 
65 
>>> '%x' % chars[0] 
'41' 
>>> hex(chars[0]) 
'0x41' 
>>> ['%x' % c for c in chars] 
['41', '32'] 
>>> [hex(c) for c in chars] 
['0x41', '0x32'] 
4
  • Java: "\u4132".getBytes("UTF-16BE")
  • Python 2: u'\u4132'.encode('utf-16be')
  • Python 3: '\u4132'.encode('utf-16be')

Những phương pháp này trả về một mảng byte, mà bạn có thể chuyển đổi sang một mảng int một cách dễ dàng. Nhưng lưu ý rằng các điểm mã trên U+FFFF sẽ được mã hóa bằng hai đơn vị mã (do đó, với UTF-16BE, điều này có nghĩa là 32 bit hoặc 4 byte).

+0

tại sao bạn sử dụng 'u' trước chuỗi trong python 3? – Ant

+0

Cảm ơn ghi chú, tôi đã sửa nó trong câu trả lời. –

2

"Những" đó không phải là số nguyên, đó là số thập lục phân đại diện cho code point.

Nếu bạn muốn lấy đại diện số nguyên của điểm mã bạn cần sử dụng ord(u'\u4132') nếu bây giờ bạn muốn chuyển đổi trở lại thành sử dụng ký tự unicode unicode() sẽ trả về chuỗi unicode.

+0

yep tôi biết họ không phải là số nguyên, nhưng ở phần cuối của hoạt động tôi cần phải nhận được 41 và 32 là số nguyên, đó là lý do tại sao tôi đã đề cập số nguyên. như một sửa chữa "làm thế nào tôi có thể chuyển đổi u" \ u4132 "thành chuỗi hoặc int 4132" có thể tốt hơn :) – hinoglu

+1

@hinoglu: nếu bạn thực sự muốn nhận được 41 và 32 dưới dạng số nguyên, ứng dụng của bạn có khả năng bị hỏng. Những hành vi hợp lý nên có nếu thay vì u '\ U4132' bạn có nói u '\ U412F'? Mà là hợp lệ như khác. Như nhiều có thể có lý do để muốn nhận được chuỗi '4132' từ trên (hoặc '412F') Tôi không thể tưởng tượng bất kỳ lý do hợp lý cho muốn để có được số nguyên 4132. Ngoại trừ có thể được chuyển đổi nó trở lại chuỗi '4132 '? Bạn vui lòng giải thích trường hợp sử dụng của bạn? – kriss

1

bẩn hack: repr(u'\u4132') sẽ trở lại "u'\\u4132'"

+0

nhưng hoạt động hack, cảm ơn :) – hinoglu

+0

Eek. * Xin vui lòng * nhìn vào các câu trả lời khác (những gì một sự trùng hợp - tôi đã viết một ;-)) - họ đạt được điều tương tự mà không có hack khủng khiếp! –

2
>>> c = u'\u4132' 
>>> '%x' % ord(c) 
'4132' 
Các vấn đề liên quan