django-uuslug汉字转拼音出现的小问题,可能是BUG.

在用python/Django开发网站的过程中,很多人为了更友好的SEO, 会采用将汉字转换成拼音的方式放在url里面,这样对搜索引擎比较友好。我今天也尝试了这么一个第三方库 django-uuslug, 不过我一测试就出问题了。好像是老外不懂中文,做出来的一个bug.

一、安装 django-uuslug
程序代码 程序代码

pip install django-uuslug


二、测试程序
程序代码 程序代码

#coding:utf-8

from uuslug import slugify

if __name__ == "__main__":
    txt = "什么东西-甚至-是么"
    slug_word = slugify(txt)
    print(txt + "------" + slug_word)    
  
    txt = "中文识别老大难问题"
    slug_word = slugify(txt)
    print(txt + "------" + slug_word)
    
    txt = "kala is a dog"
    slug_word = slugify(txt)
    print(txt + "------" + slug_word)    


打印出来的结果如下:
程序代码 程序代码

什么东西-甚至-是么------shi-yao-dong-xi-shen-zhi-shi-yao
中文识别老大难问题------zhong-wen-shi-bie-lao-da-nan-wen-ti
kala is a dog------kala-is-a-dog


发现问题所在了吗,中文 “什么”的汉语拼音却变成了"shi yao", 真不知道这老外是什么骚操作。 但是后面的“甚至” 的汉语拼音又是对的。所以这应该是个bug, 不过对老外来说,能做到这样已经不容易了。

三、怎么解决呢
跟踪代码,你会发现,最终处理的过程在 text_unicode.py的这个方法中:
程序代码 程序代码

# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import os
import pkgutil

_replaces = pkgutil.get_data(__name__, 'data.bin').decode('utf8').split('\x00')

def unidecode(txt):
    chars = []
    for ch in txt:
        codepoint = ord(ch)

        if not codepoint:
            chars.append('\x00')
            continue

        try:
            chars.append(_replaces[codepoint-1])
        except IndexError:
            pass
    return "".join(chars)

然而这些字库拼音显然在data.bin这个文件里面,在对应的python安装package里面找到这个文件,打开是这样的,没办法编辑呀,不知道是哪一个,为什么不用纯文本呢,非得用bin格式. 我记得以前见过一个是文本格式的,自己可以编辑修改的,但这个不行。但是这个bin格式看起来应该是python将一个对象序列化成文件而形成的,应该可以通过反序列化方式还原成list, 然后找到对应的位置修改后,再序列化成文件保存为data.bin,应该就可以解决这个问题。

如果想简单,就只能在上面的方法里面,自己再增加一个列表或者字典。自己来匹配,来解决这种拼音不正确的问题。

如果想通过序列化,反序列化方式,就需要再上面的代码中找到_replaces中对应的位置,修改后,然后再保存.

具体的代码就不写了,思路应该没问题。
另外在github上提了一个bug, 不知道有没有用https://github.com/un33k/django-uuslug/issues/22

除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
[本日志由 yihaomen 于 2019-09-03 11:53 AM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: django-uuslug
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.