在 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中,您可以只索引一个字符串(或数组)。每个字符的长度无关紧要。但同样在这种情况下,我应该警告你一个字符不是 single/simple 实体:如果你需要单个实体,你应该将更多字符放在一起(组合字符,例如重音等)。
UTF16是可变宽度的,但是和UCS2一样,只是针对UCS2以外的字符。所以对于大多数事情来说,这并不重要,如果你有这样的角色,你只需使用有时低和高的代理(就像许多其他仅支持 UCS2 的计算机语言一样)。但这通常不是问题,因为您不应在随机位置拆分字符串,而应始终在实体的末尾拆分字符串。
UCS4 和 UTF-32 实际上是相同的编码:Unicode 代码指向 32 位数字。 (差异只是虚拟的,并且在某些定义上,不适用于 Unicode 字符 [UCS 基于允许更多(更高)code-points,从未分配的 ISO)
我需要固定宽度的字符串编码。据我了解,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中,您可以只索引一个字符串(或数组)。每个字符的长度无关紧要。但同样在这种情况下,我应该警告你一个字符不是 single/simple 实体:如果你需要单个实体,你应该将更多字符放在一起(组合字符,例如重音等)。
UTF16是可变宽度的,但是和UCS2一样,只是针对UCS2以外的字符。所以对于大多数事情来说,这并不重要,如果你有这样的角色,你只需使用有时低和高的代理(就像许多其他仅支持 UCS2 的计算机语言一样)。但这通常不是问题,因为您不应在随机位置拆分字符串,而应始终在实体的末尾拆分字符串。
UCS4 和 UTF-32 实际上是相同的编码:Unicode 代码指向 32 位数字。 (差异只是虚拟的,并且在某些定义上,不适用于 Unicode 字符 [UCS 基于允许更多(更高)code-points,从未分配的 ISO)