0

我需要修剪一个多字节字符串,以便剩余的字符在其原始编码中仍然可读(没有尾随字节标记)。

示例 - 以下字符串长度为 105 个字符。但是它有 194 个字节长。将此字符串导入字符限制为 150 的 redshift 数据库列时,出现溢出错误。

>>str="Негосударственное образовательное учреждение высшего профессионального образования Институт Уник-70264832"
>>> len(str)
105
>>> len(bytes(str, 'utf-8'))
194

如何安全地将字符串修剪为整个多字节字符,以便最终得到可能在 150 字节以下的最长的整个字符串?

我知道以下适用于 Python 2,但我需要适用于 Python 3 的解决方案。

def slice_multibyte(string, length):
    #Loop while string is still longer than required length
    while len(str(string.decode('utf-8'))) > length:
        #Trim off one full utf-8 character (may be multibyte)
        string = string.decode("utf-8")[:len(string.decode("utf-8"))-1].encode("utf-8")
    return string
4

2 回答 2

0

稍微调整一下您自己的解决方案:

import sys

def trim_multibyte(string, length):
    while sys.getsizeof(string) > length:
        string=string[:-1]
    return string

# on a Pandas DataFrame
df.big_column = \
np.where(df.big_column.apply(sys.getsizeof) > 65535,
         df.big_column.apply(trim_multibyte, args=(65535,)), # Redshift VARCHAR limit
         df.big_column)
于 2022-01-11T01:31:04.123 回答
0

在进一步考虑之后,我想出了这个解决方案:

def trim_multibyte(string, length):
    while len(bytes(string, 'utf-8')) > length:
        string=string[:-1]
    return string

我的方法是从字符串的末尾删除一个字符,只要字符串的字节版本的长度超过指定的限制。

于 2018-07-26T23:29:43.647 回答