【发布时间】:2020-09-03 11:40:10
【问题描述】:
我需要一个固定宽度的字符串编码。据我了解,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 的任何想法?
【问题讨论】:
-
为什么要与
bytes合作? -
因为我随后将字节加载到 PyTorch 张量中以在多处理数据加载器线程之间共享它:github.com/pytorch/pytorch/issues/13246 中的上下文