簡體   English   中英

如何在Python中獲得UTF-16(十進制)?

[英]How to get UTF-16 (decimal) in Python?

我有一個表示為U + 1F498的表情符號的Unicode Code Point:

emoticon = u'\U0001f498'

我想得到這個字符的utf-16十進制組,根據這個網站5535756472

我試圖print emoticon.encode("utf16")但根本沒有幫助我,因為它提供了一些其他角色。

此外,嘗試從UTF-8解碼之前將其編碼為UTF-16,如下所示print str(int("0001F498", 16)).decode("utf-8").encode("utf16")也無濟於事。

如何正確獲取unicode字符的utf-16十進制組?

可以encode與字符utf-16編碼,然后每2個字節的編碼數據的轉換為整數與int.from_bytes (或struct.unpack在python 2)。

Python 3

def utf16_decimals(char, chunk_size=2):
    # encode the character as big-endian utf-16
    encoded_char = char.encode('utf-16-be')

    # convert every `chunk_size` bytes to an integer
    decimals = []
    for i in range(0, len(encoded_char), chunk_size):
        chunk = encoded_char[i:i+chunk_size]
        decimals.append(int.from_bytes(chunk, 'big'))

    return decimals

Python 2 + Python 3

import struct

def utf16_decimals(char):
    # encode the character as big-endian utf-16
    encoded_char = char.encode('utf-16-be')

    # convert every 2 bytes to an integer
    decimals = []
    for i in range(0, len(encoded_char), 2):
        chunk = encoded_char[i:i+2]
        decimals.append(struct.unpack('>H', chunk)[0])

    return decimals

結果:

>>> utf16_decimals(u'\U0001f498')
[55357, 56472]

在Python 2“窄”構建中,它很簡單:

>>> emoticon = u'\U0001f498'
>>> map(ord,emoticon)
[55357, 56472]

這適用於Python 2(窄版和寬版)和Python 3:

from __future__ import print_function
import struct

emoticon = u'\U0001f498'
print(struct.unpack('<2H',emoticon.encode('utf-16le')))

輸出:

(55357, 56472)

這是一個更通用的解決方案,可以為任意長度的字符串打印UTF-16代碼點:

from __future__ import print_function,division
import struct

def utf16words(s):
    encoded = s.encode('utf-16le')
    num_words = len(encoded) // 2
    return struct.unpack('<{}H'.format(num_words),encoded)

emoticon = u'ABC\U0001f498'
print(utf16words(emoticon))

輸出:

(65, 66, 67, 55357, 56472)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM