使用带有字节数的textwrap.wrap

时间:2016-03-27 07:12:58

标签: python python-3.x split word-wrap python-unicode

如何在行到达一定数量的字节之前使用$project->setId( 43 ); $projectMapper->load( $project ); $formCollection = $project->getForms(); $formCollectionMapper = new Mapper\FormCollection( $db ); $formCollectionMapper->load( $formCollection ); // now all your populated form instances can be accessed individually: // here I use a method `getAssoc()` but you can also create a custom iterator and // drop the method call foreach($formCollection->getAssoc() as $form) { $form; // instance of Entity\Form } 模块进行拆分(不分割多字节字符)?

我想要这样的事情:

textwrap

2 个答案:

答案 0 :(得分:1)

结果取决于所使用的编码,因为每个字节的数量 字符是编码的函数,并且在许多编码中 性格也是如此。我假设我们使用的是'☺'的UTF-8 编码为e298ba,长度为3个字节;给出的例子是 符合这一假设。

textwrap中的所有内容都适用于角色;它什么都不知道 关于编码。解决此问题的一种方法是将输入字符串转换为 另一种格式,每个字符变成一串字符 其长度与字节长度成正比。我会用三个 字符:两个用于十六进制的字节,另外一个用于控制换行符。 因此:

'a' -> '61x'         non-breaking
' ' -> '20 '         breaking
'☺' -> 'e2x98xbax'   non-breaking

为简单起见,我假设我们只打破空格,而不是标签或任何标签 其他角色。

import textwrap

def wrapbytes(s, bytewidth, encoding='utf-8', show_work=False):
    byts = s.encode(encoding)
    encoded = ''.join('{:02x}{}'.format(b, ' ' if b in b' ' else 'x')
                      for b in byts)
    if show_work:
        print('encoded = {}\n'.format(encoded))
    ewidth = bytewidth * 3 + 2
    elist = textwrap.wrap(encoded, width=ewidth)
    if show_work:
        print('elist = {}\n'.format(elist))
    # Remove trailing encoded spaces.
    elist = [s[:-2] if s[-2:] == '20' else s for s in elist]
    if show_work:
        print('elist = {}\n'.format(elist))
    # Decode. Method 1: inefficient and lengthy, but readable.
    bl1 = []
    for s in elist:
        bstr = "b'"
        for i in range(0, len(s), 3):
            hexchars = s[i:i+2]
            b = r'\x' + hexchars
            bstr += b
        bstr += "'"
        bl1.append(eval(bstr))
    # Method 2: equivalent, efficient, terse, hard to read.
    bl2 = [eval("b'{}'".format(''.join(r'\x{}'.format(s[i:i+2])
                                       for i in range(0, len(s), 3))))
             for s in elist]
    assert(bl1 == bl2)
    if show_work:
        print('bl1 = {}\n'.format(bl1))
    dlist = [b.decode(encoding) for b in bl1]
    if show_work:
        print('dlist = {}\n'.format(dlist))
    return(dlist)

result = wrapbytes('☺ ☺☺ ☺☺ ☺ ☺ ☺☺ ☺☺', bytewidth=10, show_work=True)
print('\n'.join(result))

答案 1 :(得分:1)

我最终重写了$("#ItemQuickOrder_a91a0ce2-7fb6-4c9c-97f5-e851cf4f10a6_MultiChoiceOption_0,\ #ItemRequired_1817888e-9d2e-4ad6-87a0-1713c7b7dd97_MultiChoiceOption_0,\ #ItemOneOffCost_ef64a5b1-07e1-40ce-8c80-2f2ace717b4f_\\$CurrencyField,\ #ItemMonthlyReoccurringCost_f60c47be-2361-47eb-92f5-9b4ec7a0c057_\\$CurrencyField,\ #ItemAnnualRecurringCost_db2c2537-e1b9-40bf-badc-a09637616aaa_\\$CurrencyField").change(function() { alert( "Handler for .change() called." ); }); 的一部分,以便在分割字符串后对单词进行编码。

与Tom的解决方案不同,Python代码不需要遍历每个字符。

textwrap