python 2.7 中文相关

2.7 版本对中文很不友好

具体的不友好

  • 遍历字符乱码
    这里写图片描述
  • 长度计算
    len('你好') # returns 6 是会有问题的, 一个中文字符按三个长度算.
  • 字符串输出
    这里写图片描述
  • list.__str__()
    ['你好','世界'].__str__() 会返回乱码, 但 ','.join(['你好','世界'])就不会.

我的主意

  • 处理中文前使用 builtins.str#decode()方法, 如'你好'.decode('utf-8')
  • 创建中文字符常量用于相比时主动加u前缀, 如name=u'小明'.
  • 在调用 str.join()方法时再使用builtins.str#encode()方法. 如 my_arr.add(word.encode('utf-8'))

方案

一个实际的例子, 判断字符串是否为广义的数字且长度是否合理.

# coding:utf-8
import sys


class StringUtils:
    """
    工具静态类
    """

    @staticmethod
    def is_generic_number(x):
        """
        广义的数字--- 整数,符号,小数点,百分号,分数,计量
        :param x:
        :return:
        """
        flag = False
        #中文前不加 u前缀, 是不能与 Unicode的字符比较的, 永远不会相等.
        generic_number_set = set(['+', '-', '*', '/', '.', '%', ':', u'十', u'百', u'千', u'万', u'亿'])
        for i in range(len(x)):
            the_char = x[i]
            if the_char.isdigit() or the_char in generic_number_set:
                flag = True
            else:
                flag = False
                break
        return flag

    @staticmethod
    def is_too_long_or_short_word(x):
        return len(x) > 30 or len(x) <= 1

    @staticmethod
    def should_drop(x):
        if not isinstance(x, str):
            return False
        if sys.version.__contains__('2.7'):
            try:
                x=x.decode('utf-8')
            except:
                sys.stderr.write("decode utf-8 error. the str is {}".format(x))
                return False
        return StringUtils.is_too_long_or_short_word(x) or StringUtils.is_generic_number(x)


x = '0.1万亿'
print(StringUtils.should_drop(x))#True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值