簡體   English   中英

在 Python 中將字符串編碼為固定寬度的 unicode UCS-2

[英]Encode a string to fixed-width unicode UCS-2 in Python

我需要一個固定寬度的字符串編碼。 據我了解,UCS-2 和 UCS-4(也稱為 ASCII)就是這種固定寬度的編碼。

據我了解,Python 僅通過s.encode('utf_16_le')支持可變寬度的 UTF-16。 這是真的嗎? 有沒有一種簡單的方法可以編碼成 unicode 固定寬度編碼?

上下文:我以原始字節存儲一個字符串數組,需要一種方法來索引它以恢復原始字符串。 當所有字符都是固定寬度時,索引計算更容易。

strings = ['asd', 'def']

# ascii
bytelens = list(map(len, strings))
bytes = ''.join(strings).encode('ascii')

# utf8
bytelens = []
bytes = bytearray()
for s in strings:
  e = s.encode('utf-8')
  bytelens.append(len(e))
  bytes.extend(e)

# i need bytelens to later recover original strings from the array bytes

如您所見,ASCII 變體非常簡單,而 UTF-8 更復雜且慢 20%(可能是因為許多分配和函數調用)。 真正的固定寬度 UCS-2 將是一個解決方案!

一個后續問題:我如何知道我的字符串是否包含來自 UCS-1 / UCS-2 / UCS-4 的字符? 對於 UCS-1,有 str.isascii。 關於 UCS-2 的任何想法?

您正在混合各種概念。

在 Python 中,您可以只索引一個字符串(或數組)。 每個字符的長度無關緊要。 但同樣在這種情況下,我應該警告您,一個字符不是單個/簡單的實體:如果您需要單個實體,您應該組合更多的字符(組合字符,例如重音符號等)。

UTF16 是可變寬度的,但與 UCS2 相同,只是針對 UCS2 之外的字符。 所以對於大多數事情來說,這並不重要,如果你有這樣的字符,你只需使用有時低和高的代理(就像在許多其他計算機語言上一樣,它只支持 UCS2)。 但這通常不是問題,因為您不應在隨機位置拆分字符串,而應始終在實體的末尾拆分。

UCS4 和 UTF-32 實際上是相同的編碼:Unicode 代碼指向 32 位數字。 (差異只是虛擬的,在某些定義上,不適用於 Unicode 字符 [UCS 基於允許更多(更高)代碼點的 ISO,從未分配過)

暫無
暫無

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

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