首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

单纯自娱自乐:纯数学(位运算),utf-8与utf-32互换

2013-03-01 
纯粹自娱自乐:纯数学(位运算),utf-8与utf-32互换自己写完了也不知道有神马用,正如注释里面表述,都给出了单

纯粹自娱自乐:纯数学(位运算),utf-8与utf-32互换
自己写完了也不知道有神马用,正如注释里面表述,都给出了单行非数学的方法了
动机:字节数据的list()就是一个整数数列,试图在不转换字符串再正则的情况下找到汉字
结果:失败,还是要先知道编码……单纯自娱自乐:纯数学(位运算),utf-8与utf-32互换
收益:总算搞清楚了utf-8的算法 有兴趣的人参看wiki utf-8条目


# 下面的运算相当于 list('a中b文信c息d'.encode('utf-8'))
sl = [97, 20013, 98, 25991, 20449, 99, 24687, 100]  # 此数列相当于 [ord(x) for x in list('a中b文信c息d')]
b = []
for s in sl:
    if s < 128:
        b.append([s])
    else:
        bl = 0
        for i in range(1, 6):  # 计算需要多少个字节
            bl += 6
            if s >> bl < 64:
                c = i
                break
        bb = []
        for i in range(c + 1):
            num = s - (s >> ((i + 1) << 2) + ((i + 1) << 1) << ((i + 1) << 2) + ((i + 1) << 1)) >> (i << 2) + (i << 1)  # 求每字节后6位
            if i < c:
                num += 128  # 除首字节外,每字节前两位为“10”
            else:
                num += sum(1 << j for j in range(c + 1)) << (7 - c)  # 计算首字节前几位
            bb.insert(0, num)  # 注意是前插入
        b.append(bb)
print(b)  # 上面append改为extend,然后按单字节输出就是UTF-8,append只是为了结果的数字直观

# 下面的运算相当于 [ord(x) for x in list('a中b文信c息d')]
s = [97, 228, 184, 173, 98, 230, 150, 135, 228, 191, 161, 99, 230, 129, 175, 100]  # 此数列相当于 list('a中b文信c息d'.encode('utf-8'))
b = []
while len(s) > 0:
    if s[0] < 128:
        b.append(s[0])
        del s[0]
    else:
        head = 2
        bl = 0
        for i in range(2, 7):  # 计算组成单个字符的连续utf-8字节数
            bl += 6
            head += 1 << i
            if s[0] >> 7 - i == head:


                c = i
                break
        num = s[0] - (head << 7 - c) << bl  # 首字节转为数字
        for i in range(1, c):
            bl -= 6
            num += s[i] - 128 << bl  # 将其后每字节后6位(舍弃首两位“10”)累加
        b.append(num)
        del s[0:c]
print(b)  # 每个整数按4字节输出就相当于UTF-32BE


最后,没有测试长字节数据,还不知道有没有算错 单纯自娱自乐:纯数学(位运算),utf-8与utf-32互换
[解决办法]
单纯自娱自乐:纯数学(位运算),utf-8与utf-32互换

热点排行