在Python中将字符串编码为固定宽度的Unicode UCS-2

问题描述

我需要固定宽度的字符串编码。据我了解,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,该ISO允许更多(更高)代码点,但从未分配)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...