如何将unicode重音字符转换为没有重音符号的纯ascii?

时间:2013-01-02 07:28:43

标签: python unicode wget unicode-normalization

我正在尝试从像http://dictionary.reference.com/browse/apple?s=t

这样的词典网站下载一些内容

我遇到的问题是原始段落中包含所有那些波浪线,反向字母等等,因此当我读取本地文件时,我最终会找到像\ x85,\ xa7,\等滑稽转义符号。 x8d等

我的问题是,有什么方法可以将所有转义字符转换为各自的UTF-8字符,例如,如果有'à'我如何将其转换为标准'a'?

Python调用代码:

import os
word = 'apple'
os.system(r'wget.lnk --directory-prefix=G:/projects/words/dictionary/urls/ --output-document=G:\projects\words\dictionary\urls/' + word + '-dict.html http://dictionary.reference.com/browse/' + word)

我在Windows 7系统上使用wget-1.11.4-1(不要杀了我的Linux用户,这是客户端的要求),并且用Python 2.6脚本文件启动了wget exe。

4 个答案:

答案 0 :(得分:41)

  

如何将所有转义字符转换为各自的字符,如果有unicode à,如何将其转换为标准 a

假设您已将unicode加载到名为my_unicode的变量中...将a标准化为a就这么简单......

import unicodedata
output = unicodedata.normalize('NFD', my_unicode).encode('ascii', 'ignore')

明确的例子......

>>> myfoo = u'àà'
>>> myfoo
u'\xe0\xe0'
>>> unicodedata.normalize('NFD', myfoo).encode('ascii', 'ignore')
'aa'
>>>

工作原理
unicodedata.normalize('NFD', "insert-unicode-text-here")执行Canonical Decomposition (NFD) unicode文本;然后我们使用str.encode('ascii', 'ignore')将NFD映射的字符转换为ascii(忽略错误)。

答案 1 :(得分:1)

我需要这样的东西,但只删除重音字符,忽略特殊字符,我做了这个小功能:

# ~*~ coding: utf-8 ~*~
import re

def remove_accents(string):
    if type(string) is not unicode:
        string = unicode(string, encoding='utf-8')

    string = re.sub(u"[àáâãäå]", 'a', string)
    string = re.sub(u"[èéêë]", 'e', string)
    string = re.sub(u"[ìíîï]", 'i', string)
    string = re.sub(u"[òóôõö]", 'o', string)
    string = re.sub(u"[ùúûü]", 'u', string)
    string = re.sub(u"[ýÿ]", 'y', string)

    return string

我喜欢这个功能,因为你可以自定义它,以防你需要忽略其他字符

答案 2 :(得分:0)

给定的URL返回UTF-8,因为HTTP响应清楚地表明:

wget -S http://dictionary.reference.com/browse/apple?s=t
--2013-01-02 08:43:40--  http://dictionary.reference.com/browse/apple?s=t
Resolving dictionary.reference.com (dictionary.reference.com)... 23.14.94.26, 23.14.94.11
Connecting to dictionary.reference.com (dictionary.reference.com)|23.14.94.26|:80... connected.
HTTP request sent, awaiting response... 
  HTTP/1.1 200 OK
  Server: Apache
  Cache-Control: private
  Content-Type: text/html;charset=UTF-8
  Date: Wed, 02 Jan 2013 07:43:40 GMT
  Transfer-Encoding:  chunked
  Connection: keep-alive
  Connection: Transfer-Encoding
  Set-Cookie: sid=UOPlLC7t-zl20-k7; Domain=reference.com; Expires=Wed, 02-Jan-2013 08:13:40 GMT; Path=/
  Set-Cookie: cu.wz=0; Domain=.reference.com; Expires=Thu, 02-Jan-2014 07:43:40 GMT; Path=/
  Set-Cookie: recsrch=apple; Domain=reference.com; Expires=Tue, 02-Apr-2013 07:43:40 GMT; Path=/
  Set-Cookie: dcc=*~*~*~*~*~*~*~*~; Domain=reference.com; Expires=Thu, 02-Jan-2014 07:43:40 GMT; Path=/
  Set-Cookie: iv_dic=1-0; Domain=reference.com; Expires=Thu, 03-Jan-2013 07:43:40 GMT; Path=/
  Set-Cookie: accepting=1; Domain=.reference.com; Expires=Thu, 02-Jan-2014 07:43:40 GMT; Path=/
  Set-Cookie: bid=UOPlLC7t-zlrHXne; Domain=reference.com; Expires=Fri, 02-Jan-2015 07:43:40 GMT; Path=/
Length: unspecified [text/html]

使用vim调查保存的文件还表明数据是正确的utf-8编码...使用Python获取URL也是如此。

答案 3 :(得分:0)

这个问题对我来说是不同的,但是这个堆栈页面可以解决它class GetUserName extends StatelessWidget { final String documentId; GetUserName(this.documentId); @override Widget build(BuildContext context) { CollectionReference users = FirebaseFirestore.instance.collection('users'); return FutureBuilder<DocumentSnapshot>( future: users.doc(documentId).get(), builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) { if (snapshot.hasError) { return Text("Something went wrong"); } if (snapshot.hasData && !snapshot.data!.exists) { return Text("User Deleted!"); } if (snapshot.connectionState == ConnectionState.done) { Map<String, dynamic> data = snapshot.data!.data() as Map<String, dynamic>; return Text(data['displayName']); } return Text("loading"); }, ); } } 输出 - unicodedata.normalize('NFKC', 'V').encode('ascii', 'ignore')