添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

现在在做分词的时候会处理大量有关中文字符的处理,经常输出乱码,老大让我暂时不考虑字符编码,但是为了看着爽不得不研究一下。

分词系统:NLPIR

因为不同的编译环境默认的汉字编码可能不一样,我的环境是OSX10.11 + Pycharm + python2.7

文件第一行永远默认

# coding: utf-8

数据集我用的是“tc-corpus-train”这个是数据,百度一下就能搜到,里面有20种文档,每个文档都是关于这个方面的小新闻,挺好用的。

#--------------------------------------------我是分割线 -------------------------------------------- #

环境说完了下面从我遇到的问题逐渐说说是怎么解决的:

1.什么是utf-8/ gbk/ unicode编码

我就通俗易懂的讲解一下吧,讲的复杂了肯定是没人看的

utf-8是Unix下的一种通用编码,可以对汉字编码,应该是Unix环境下能打开看到汉字的唯一编码(gbk试过,乱码,不知有没有人反驳我)

gbk是win环境下的一种汉字编码,其中GB2312编码也算是gbk编码,这种编码在Unix环境中打开是乱码,大概是这个样子:

可以看到,英文正常显示,但是汉字呢就gg了,一般看到这种跟个蛋一样的字符就是gbk汉字(只在mac中试过,别的Unix不知道是不是个蛋)

unicode是一种二进制编码,所有的utf-8和gbk编码都得通过unicode编码进行转译,说的直白一点,utf-8和gbk编码之间不能之间转换,要在unicode之间过个场才能转换。下面我图解一下,方便理解:

而在mac环境下pycharm只能显示来自unicode的汉字,举个例子:

# coding:utf-8
s = '我是一串汉字'
print s

首先,s是一串utf-8编码的汉字,在print的时候,先把utf-8转化成unicode再输出成正产显示的汉字。

如果打开一个文档,怎么看里面是什么编码的字呢?乱码是不是蛋已经无法满足一个有逼格程序员的要求了,请看下面:

2.如何查看文档、字符串编码格式

不废话,下面几行代码搞定:

# coding:utf-8
import chardet
s = '哈哈哈我就是一段测试的汉字呀'
print chardet.detect(s)

输出:{'confidence': 0.99, 'encoding': 'utf-8'}

这个办法只能输出这段字符可能的编码格式,我们看到0.99的可能是utf-8,其实也就是utf-8编码了,只要字符串够长,后面的置信度都是0.99

3.各种编码之间如何转换

python中有两个很好用的函数 decode() 和 encode()

decode(‘utf-8’) 是从utf-8编码转换成unicode编码,当然括号里也可以写'gbk'

encode('gbk') 是将unicode编码编译成gbk编码,当然括号里也可以写'utf-8'

假如我知道一串编码是用utf-8编写的,怎么转成gbk呢

s.decode('utf-8').encode('gbk')
像上面这样就可以了

图解一下:

4.我为什么要把编码转来转去

在使用NLPIR分词的时候,对输入文档的编码格式是有严格要求的,在函数初始化的时候可以设置输入源文档的编码格式。

但是源文档的编码可能一会儿是utf-8一会儿是gbk,这就要求统一一下格式,不能格式一乱就报错了,

具体操作我后面会写一篇python调用NLPIR的说明

Python 2.x使用过程中, 中文乱码 解决最耳熟能详的方法就是在代码前加上#-*- coding: utf-8 –*- 那么为什么需要这么做呢?什么又是字节和 字符 ?下面我们了解下。 我来讲一下 字符 问题我的理解吧,虽然我对 Python 编码 处理 的具体细节还不太清楚,不过临时稍微看了一下,和Perl的原理也差不多 最重要的是必须区分“ 字符 ”和“字节”的不同,“ 字符 ”是抽象的,而“字节”是具体的 比如一个“中”字,在不同 编码 中用如下字节表示: GBK Big5 UTF-8 UTF-16LE  \xD6\xD0  \xA4\xA4  \xE4\xB8\xAD  \ 在 PyCharm 中,可以通过以下步骤来设置全部文件的 编码 UTF-8 : 打开 PyCharm 的设置,在 Windows 系统中可以通过点击 File > Settings 或者使用快捷键 Ctrl + Alt + S 打开。在 macOS 系统中可以通过点击 PyCharm > Preferences 或者使用快捷键 Command + , 打开。 在设置界面中,找到 Ed... 由于 Python 源代码也是一个文本文件,所以当你的源代码包含 中文 的时候,在保存源代码的时候就务必指定保存为 UTF-8 编码 。但是有很的多的小伙伴还不知道如何进行设置,下面一起来看看详细的Pycharm中设置默认 字符 编码 utf-8 的方法吧,希望对大家的学习能带来帮助。在setting中的Editor中找到File and Code Templates,在 Python Script中添加代码。然而,有时候,当我们上面的步骤设置完成之后,有时候还会乱码,这时候要怎么解决呢。在文件中输入代码测试。 Python 文件默认的 编码 格式是ascii ,无法识别汉字,因为ascii码中没有 中文 。 所以py文件中要写 中文 字符 时,一般在开头加 # -*- coding: utf-8 -*- 或者 #coding= utf-8 。 这是指定一种 编码 格式,意味着用该 编码 存储 中文 字符 (也可以是 gbk 、gb2312等)。 关于测试的几点注意 ——————————————– 注1:代码中有 中文 ,就要在头部指定 编码 方式,如果用编辑器写代码,还要注意IDE的文件存储 编码 格式(一般在setting) 注2: python 3.x的源码文件默认使用 utf-8 编码 ,可以解析 中文 ,开头不指定也行,但为了规范和避免一些意想不到 主动维护的替代方案是SAP HANA Python 客户端: : 基于的的纯 Python 客户端。 pyhdb支持 Python 2.7、3.3、3.4、3.5、3.6以及Linux,OSX和Windows上的PyPy。 它实现了的很大一部分。 交易 处理 Python 软件包索引安装: $ pip install pyhdb 通过pip从GitHub安装: $ pip install git+https://github.com/SAP/pyhdb.git 您也可以直接从克隆的git存储库中安装最新版本。 $ git clone https://github.com/SAP/pyhdb.git $ cd pyhdb $ python setup.py in 综上所述, 中文乱码 问题在 Python 中是比较常见的。通过正确设置 编码 方式、输出 编码 、文件读写 编码 以及使用 Unicode 字符 串,可以有效地解决 中文乱码 问题。 中文乱码 指的是在输出或 处理 中文 字符 时,出现了显示错误或乱码的情况。下面我将介绍几种常见的解决方法,帮助你解决 Python 中的 中文乱码 问题。在这个示例中,我们指定了文件的 编码 方式为 UTF-8 ,以确保正确地读取包含 中文 字符 的文件。使用 Unicode 字符 串可以确保在不同的 编码 环境中正确地 处理 中文 字符 。这样可以确保 Python 正确地识别和 处理 文件中的 中文 字符 。 解决 Python 中文乱码 问题需要综合考虑多种因素,包括 编码 方式、区域设置、库和框架的选择等。通过使用合适的 编码 方式、多语言支持、文本编辑器和异常 处理 等技巧,可以更好地 处理 Python 中的 中文乱码 问题。同时,根据具体需求选择合适的第三方库进行 字符 处理 也是一个不错的选择。 1、设置PyCharm工具的 编码 格式:File--》setting--》Editor--》FileEncodings--》IDE encoding: utf-8 2、在PyCharm模块文件的第二行加入语句:#-*-coding: utf-8 -*-3、在File--》Setting--》File and CodeTemplates模块里加入下面的语句:#-*-coding: utf-8 -*-__autho... python 2不是以 unicode 作为基本代码 字符 类型,碰到乱码的几率是远远高于 python 3,但即便如此,相信很多人,也不想随意的迁移到 python 3,这里就总结几个我平常碰到的问题及解法。 1、文件中无法使用 中文 注释 处理 方法: 在代码中增加 # -*- coding= UTF-8 -*- ,一般加在文件头部第一行,如果第一行是脚本标志,则放在第二行(实际仍然是 python 正本的第一行)。 随后将文件另存为 UTF-8 格式。 此方法可以解决注释中有 中文 ,及 字符 串立即数中包含 中文 的问题。 2、 unicode 中文 变量打印出来是乱码 处理 方法: 文件开始引入扩展库的部分加入以下3行代码。 运行环境在 Python 3.6下, Python 2的解决方案网上有很多.,想学习 python 2实现的朋友们可以参考这篇文章://www.jb51.net/article/34884.htm,下面来一起看看详细的介绍吧。 第一种方法: Unicode 码 在 unicode 码中,汉字的范围是(0x4E00, 9FBF) import random def Unicode (): val = random.randint(0x4e00, 0x9fbf) return chr(val) 这个方法比较简单,但是有个小问题, unicode 码中收录了2万多个汉字,包含很多生僻的繁体字. 第二种方法: GBK 1.首先谈一下如何遇到这个问题的。本人想打印一个html页面,这个页面是charset 是 utf-8 的,按照正常方法html = response.content.decode(“ utf-8 ”),却总是报错 Unicode EncodeError ,如果页面是gb2312的,又不错。 2.解决方法,代码段中加入 type = sys.getfilesystemencoding()