繁体   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