encoding_encoding python 类型 - CSDN
精华内容
参与话题
  • Python之encoding

    万次阅读 2018-05-10 18:11:30
    encoding Unicode utf-8 utf-16 utf-32 gbk ASCII 码 decoding 例子 encoding 根据Python官方文档中有关字符串的部分1: str.encode(encoding=”utf-8”, errors=”strict”) Return an encoded ...

    encoding

    根据Python官方文档中有关字符串的部分1

    str.encode(encoding=”utf-8”, errors=”strict”)
    Return an encoded version of the string as a bytes object. Default encoding is ‘utf-8’. errors may be given to set a different error handling scheme. The default for errors is ‘strict’, meaning that encoding errors raise a UnicodeError. Other possible values are ‘ignore’, ‘replace’, ‘xmlcharrefreplace’, ‘backslashreplace’ and any other name registered via codecs.register_error(), see section Error Handlers. For a list of possible encodings, see section Standard Encodings.

    encoding是编码的意思,在python中,Unicode类型是作为编码的基础类型。

    Unicode

    Unicode是一种标准,包括了字符集、编码方案等。因为ASCII码只能编码英文字符,具有很大的局限性,而Unicode 为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求2。在https://unicode-table.com/en/可以查到所有的Unicode字符。

    utf-8

    UTF-8以字节为单位对Unicode进行编码。

    utf-16

    UTF-16编码以16位无符号整数为单位。

    utf-32

    UTF-32编码以32位无符号整数为单位。

    gbk

    GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification)3。GBK是采用单双字节变长编码,英文使用单字节编码,完全兼容ASCII字符编码,中文部分采用双字节编码。

    ASCII 码

    ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符4

    decoding

    根据Python官方文档中有关字符串的部分1

    bytes.decode(encoding=”utf-8”, errors=”strict”)
    bytearray.decode(encoding=”utf-8”, errors=”strict”)
    Return a string decoded from the given bytes. Default encoding is ‘utf-8’. errors may be given to set a different error handling scheme. The default for errors is ‘strict’, meaning that encoding errors raise a UnicodeError. Other possible values are ‘ignore’, ‘replace’ and any other name registered via codecs.register_error(), see section Error Handlers. For a list of possible encodings, see section Standard Encodings.
    Note Passing the encoding argument to str allows decoding any bytes-like object directly, without needing to make a temporary bytes or bytearray object.

    decode()就是将“字节流”按照某种规则转换成“文本”,可以理解为是encode()的逆过程。

    例子

    现在用一个小小的例子来体验一下编码和解码。
    首先可以去https://learnpythonthehardway.org/python3/languages.txt上将上面的字符保存在一个txt文件中,并以utf-8的形式保存,命名为languages。写下代码:

    #####encoding&decoding#####
    def main(file,encoding,errors):
        line = file.readline()
        if line:
            print_file(line,encoding,errors)
            return main(file,encoding,errors)
    
    def print_file(line,encoding,errors):
        next_lang = line.strip() ###strip() 方法用于移除字符串头尾指定的字符(默认为空格)
        raw_bytes = next_lang.encode(encoding, errors=errors) ###encode()函数中errors默认为strict,还可以设置为ignore,replace等
        cooked_string = raw_bytes.decode(encoding, errors=errors) ###decode()函数为解码
    
        print(raw_bytes, "<===>", cooked_string)
    
    
    languages = open("languages.txt", encoding="utf-8")
    main(languages,"utf-16","strict")
    

    可以得到结果(如下只显示结果片段):
    这里写图片描述
    左边为utf-8编码结果,右边为原字符,两者一一对应且可以进行互逆运算。
    将代码中的“utf-8”改成“utf-16”,可以得到以下结果:
    这里写图片描述

    展开全文
  • Encoding编码

    千次阅读 2018-02-09 18:33:21
    编码编码或者连续化处理是把分类变量转...二进制编码(Binary Encoding)通过用0或者1来表示每个类别不存在或者存在是分类变量量化的一个方法。如果分类变量有k个分类,那么我们需要创建k个二进制变量(理论上来说,...

    编码

    • 编码或者连续化处理是把分类变量转火车数值副本的过程。譬如,处理性别时,男的定为1,女的定为0.分类变量在许多模型方法中(譬如,线性回归,SVM,神经网络)必须进行编码。两种主要的编码类型是二进制编码和基于目标的编码。

    二进制编码(Binary Encoding)

    • 通过用0或者1来表示每个类别不存在或者存在是分类变量量化的一个方法。如果分类变量有k个分类,那么我们需要创建k个二进制变量(理论上来说,k-1个就已经足够了)。在下面的例子中,带3个值得分类变量“Trend”转换成3个分离的二进制数值变量。这中方法最大的缺点是当分类变量有很多个值得时候,数据的维度会大大增加。

    基于目标的编码(Target-based Encoding)

    • 基于目标的编码是通过目标来对分类变量量化。在这个方法中,我们把一个分类变量替换成一个数值变量,然后再计算该分类变量出现的目标概率(如果是分类的)或者平均值(如果是数值的)。这个方法的最大缺点是它比较依赖目标的分布,而且和二进制方法相比,它的预测能力比较低。
    • 例1
    • 用基于目标的编码处理分类目标。

    • 例2

    • 用基于目标的编码处理数值目标。

    展开全文
  • 随着对于python的编码的深入了解,后来才算搞懂,关于python的,用encoding去声明的文件编码,和,python文件实际的编码,之间的关系。 Python中用encoding声明的文件编码和文件的实际编码之间的关系 1.解释声明...

    【背景】

    python中的字符串编码,搞晕很多人,包括之前的我。

    随着对于python的编码的深入了解,后来才算搞懂,关于python的,用encoding去声明的文件编码,和,python文件实际的编码,之间的关系。

     

    Python中用encoding声明的文件编码和文件的实际编码之间的关系

    1.解释声明的编码和真实的编码之前,需要了解,正常的情况下,python文件的话,如何声明文件的编码:

    【整理】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型

     

    背景知识

    1.不了解各种编码,尤其是常见的UTF-8,GBK等编码的,去看:

    字符编码详解

    2.不会对文件进行编码转换的,可以去用Notepad++的编码转换功能:

    用Notepad++实现不同字符编码之间的转换

    3.对于windows的cmd的默认是GBK编码不熟悉的,去看:

    Windows的命令行工具: cmd

     

    然后再来说,关于声明的编码,和文件本身的编码事情。

    声明的编码和实际的编码匹配的时候:声明为UTF-8编码,文件实际编码也的确是UTF-8

    (1)示例代码:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    """
    -------------------------------------------------------------------------------
    [Function]
    【整理】Python中用encoding声明的文件编码和文件的实际编码之间的关系
    http://www.crifan.com/python_string_encoding_declare_encoding_vs_file_real_encoding
    
    [Date]
    2013-07-19 
    
    [Author]
    Crifan Li
    
    [Contact]
    http://www.crifan.com/about/me/
    -------------------------------------------------------------------------------
    """
     
    #---------------------------------import---------------------------------------
    
    #------------------------------------------------------------------------------
    def declare_encoding_vs_real_encoding_declareUtf8RealUtf8():
        """
            Demo Python declare encoding vs. real file encoding
        """
        helpInfo = """在当前Python文件的第一行,用
        # -*- coding: utf-8 -*-
        去声明当前文件编码是utf-8
        所以,当前文件,也必须的确是UTF编码的。
        如此:
        1. Python解析器解析当前文件,才会去按照UTF-8解析
        2. 后面的,当前文件内的,直接写出的中文字符,自然也的确就是UTF-8
        3. 然后在用decode("utf-8")去解码,才能正确,详见后面代码的演示
        """;
    
        realUtf8Char = "我是UTF-8的中文字符串";
        decodedUnicodeStr = realUtf8Char.decode("utf-8");
        print "decodedUnicodeStr=",decodedUnicodeStr; #在windows的cmd中,此处Unicode字符串,才能正常输出:decodedUnicodeStr= 我是UTF-8的中文字符串
        
    
    ###############################################################################
    if __name__=="__main__":
        declare_encoding_vs_real_encoding_declareUtf8RealUtf8();

    (2)在Notepad++中,可以看出,当前文件我的确已经设置成了UTF-8:

    declare encoding utf8 real is utf8

     

    (3)代码下载(右键另存为):

    declare_encoding_vs_real_encoding_declareUtf8RealUtf8.py

     

    (4)运行效果如下:

    both is utf8 match so output cn char ok

     

    声明的编码和实际的编码不匹配的时候:声明为UTF-8,文件实际编码是(ANSI的)GBK

     

    (1)示例代码:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    """
    -------------------------------------------------------------------------------
    [Function]
    【整理】Python中用encoding声明的文件编码和文件的实际编码之间的关系
    http://www.crifan.com/python_string_encoding_declare_encoding_vs_file_real_encoding
    
    [Date]
    2013-07-19 
    
    [Author]
    Crifan Li
    
    [Contact]
    http://www.crifan.com/about/me/
    -------------------------------------------------------------------------------
    """
     
    #---------------------------------import---------------------------------------
    
    #------------------------------------------------------------------------------
    def declare_encoding_vs_real_encoding_declareUtf8RealGBK():
        """
            Demo Python declare encoding vs. real file encoding
        """
        helpInfo = """在当前Python文件的第一行,用
        # -*- coding: utf-8 -*-
        去声明当前文件编码是utf-8
        而此处,故意,把当前文件的本身编码,转换为了GBK,即:声明的编码是UTF-8, 真正文件的编码是GBK -> 声明的编码,和真正文件编码,之间不一致 ->
        实际经过测试,由于本身文件编码是GBK的,虽然声明了UTF-8编码,但是Python解析器,实际上也会自动识别,并按照真正的GBK编码去解析,
        所以结果就是,当前文件,Python是按照,文件真实编码GBK去解码的。所以:
        后面的,当前Python文件出现的字符串,都是GBK的 ->
        对于GBK编码的字符串,去用GBK去decode,当时是正常的,可以得到Unicode的字符串的;
        对于GBK编码的字符串,用UTF-8去解码,当然会出错
        """;
        realEncodingGbkChar = "此处我实际上是GBK的中文字符串";
        useGbkDecodedUnicodeChar = realEncodingGbkChar.decode("gbk"); #此处可以正常获得Unicode字符串
        print "useGbkDecodedUnicodeChar=",useGbkDecodedUnicodeChar; #在Windows的cmd中输出Unicode字符串,可以正常输出:useGbkDecodedUnicodeChar= 此处我实际上是GBK的中文字符串
        useUtf8DecodedUnicodeChar = realEncodingGbkChar.decode("utf-8"); #此处就会报错:UnicodeDecodeError: 'utf8' codec can't decode byte 0xb4 in position 0: invalid start byte
        
    
    ###############################################################################
    if __name__=="__main__":
        declare_encoding_vs_real_encoding_declareUtf8RealGBK();

    (2)在Notepad++中,可以看出,当前文件我是故意,已经转换为GBK了:

    declare utf8 real encoding is ansi gbk

    (3)代码下载(右键另存为):

    declare_encoding_vs_real_encoding_declareUtf8RealUtf8.py

     

    (4)运行效果如下:

    for real gbk str decode use utf8 will error

     

    总结

    可以看出:

    虽然文件编码声明,即使和实际文件本身编码错误,Python解析器,也是识别真正的文件的编码的。

    但是更明显,还是要尽量保持,python文件声明和实际上的文件本身的编码,一致,这样才不容易出问题。

     

    原文链接:http://www.crifan.com/python_string_encoding_declare_encoding_vs_file_real_encoding/

     

    想学人工智能(Python、数据分析、机器学习、深度学习、推荐系统、强化学习),来公众号AI派看看吧!!

     

    展开全文
  • file.encoding详解

    千次阅读 2019-03-31 16:45:23
    为什么每天都有解决不完的问题,一个问题延伸出来十个问题。...一步一步慢慢来吧~首先来做几个简单的测试:测试一javac -encoding : -encoding <编码> —- 指定源文件使用的字符编码对于如下代码:public class Demo {

    为什么每天都有解决不完的问题,一个问题延伸出来十个问题。虽然大都可以解决,但是也只是停留在解决的层面,终究不是学习之道。
    技术不停变更,我相信最本质的原理也就那么几个,一定要挖祖坟 似的学习!
    一步一步慢慢来吧~


    首先来做几个简单的测试:

    测试一

    javac -encoding : -encoding <编码> ---- 指定源文件使用的字符编码

    对于如下代码:

    public class Demo {
    	public static void main(String[] args) {
    	System.out.println(System.getProperty("file.encoding"));
    		System.out.println("hello,中国");
    	}
    }
    

    格式以UTF-8无BOM类型保存
    这里写图片描述

    我们分别使用cmd(默认GBK编码)和MinTTY(UTF-8编码)来读取该文件

    这里写图片描述

    -encoding encoding Set the source file encoding name, such as EUC-JP and UTF-8. If -encoding is not specified, the platform default converter is used.

    也就是说,如果不指定encoding,则使用平台默认的编码转换器。
    在简体中文的Windows上,平台默认编码会是GBK,那么javac就会默认假定输入的Java源码文件是以GBK编码的。
    我们先来证明这句话:

    javac Demo.java

    对应的字节码文件:
    这里写图片描述

    我们模拟下以上16进制的获得:

    String str = new String("中国".getBytes("UTF-8"), "GBK");
    System.out.println(str);//涓浗
    System.out.println(DatatypeConverter.printHexBinary(str.getBytes("UTF-8")));//E6B693EE859EE6B597
    

    javac -encoding GBK Demo.java

    对应的字节码文件:
    这里写图片描述

    如果实际输入的确实是 GBK 编码(GBK兼容ASCII编码)的文件,那么一切都会正常。
    但如果实际输入的是别的编码的文件,例如UTF-8编码的文件,那 javac 读进来的内容就会出问题,就“乱码”了。乱码的原因:使用 GBK 解码 UTF-8 编码的文件。
    这里写图片描述


    测试二

    java -Dfile.encoding 是用来干什么的?

    javac -encoding GBK Demo.java

    在 windows 平台生成 class 文件,拖到 Ubuntu 操作系统中。
    这里写图片描述

    Cygwin下的测试结果:
    这里写图片描述

    cmd下的测试结果:
    这里写图片描述


    这里写图片描述

    针对以上这个图做一些解释:

    ①、A.java就是一个文本文件(以某种编码格式来存储:UTF-8、GBK、ISO-8859-1等),java编译器要解析这个文本文件并编译生成.class文件。而要想解析它,就必须知道它的编码方式。(javac - encoding charset)

    ②:以不同编码方式编码的A.java经过Java编译器编译生成了同一个相同的A.class。(字符串以UTF-8格式存储)
    字节码解读见:http://blog.csdn.net/x_iya/article/details/77073112

    ③:java虚拟机以二进制字节流的形式加载A.class,读取该字符串并构建String。

    ④:输出结果。

    可以知道只有①和③才会导致乱码的产生。
    ④产生的乱码与接收环境有关,故不做讨论。

    从上图可以理解不管采用哪种格式编码的源文件(.java),只要正确告诉编译器,编译器就会得到正确的结果(.class)。同时只要告诉JVM正确的输出流需要的编码格式,JVM总会返回正确编码格式的输出流。
    那么要想不产生乱码要注意两个环节:

    1. 告诉编译器(javac -encoding)你的源文件编码格式。
    2. 告诉 JVM 字符串编码方式。(java -Dfile.encoding)
      即两者保持一致。

    对于以UTF-8编码的源文件A.java,只要:

    javac -encoding UTF-8 A.java
    java -Dfile.encoding=UTF-8 A
    

    便可以解决乱码问题。
    也许你会说命令行下依旧是乱码,那是命令行的问题(chcp 936),调整为chcp 65001, 或者在Cygwin命令行下使用。
    另外String.getBytes() 等价于 String.getBytes(Charset.defaultCharset()) ,在实际编程中推荐使用带参数的。Charset.defaultCharset() 在Windows中文操作系统中是GBK。
    当然也不是一成不变的,可以使用java -Dfile.encoding 指定。

    @Test
        public void testAvailableCharsets() {
            //Java虚拟机编码方式
            System.out.println("defaultCharset:" + Charset.defaultCharset().name());
            //所有Java支持的字符集
            Charset.availableCharsets().forEach((s, charset) -> System.out.println(s + ":" + charset));
    
        }
    

    模拟下Java读取、编译、运行*.java 的过程:

    import javax.xml.bind.DatatypeConverter;
    import java.io.UnsupportedEncodingException;
    
    public class Test {
        /**
         * 模拟 javac -encoding
         * 实现 *.java --> *.class
         *
         * @param str      字符串
         * @param charset  实际字符串编码格式
         * @param encoding 输入编码参数
         * @return *.class 字节里的字节序列
         */
        private static byte[] compile(String str, String charset, String encoding) {
            try {
                //读取(对应于图中的①)
                str = new String(str.getBytes(charset), encoding);
                //编码到*.class中(对应于图中的②)
                return str.getBytes("UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        //模拟结果输出
        private static String run(byte[] buf, String charset, String encoding) {
            try {
                //对应于图中的③
                String str = new String(buf, "UTF-8");
                //对应于图中的④
    			return new String(str.getBytes(encoding), charset);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static void main(String[] args) throws UnsupportedEncodingException {
            String str = "中国";
            String charset = "UTF-8";
            String encoding = "GBK";
    
    
            //等价于 javac -encoding %encoding% *.java(以 charset 格式编码的源文件)
            // compileBytes 数组即为 str 在 *.class 的表示
            byte[] compileBytes = compile(str, charset, encoding);
            System.out.println(DatatypeConverter.printHexBinary(compileBytes));
    
            System.out.println(run(compileBytes, charset, encoding));
            
        }
    }
    

    参考:
    https://www.zhihu.com/question/30977092

    http://abingsky37.github.io/java_encode.html

    http://www.wuxinjian.com/2017/01/08/Java中的字符编码与乱码/

    http://blog.csdn.net/u010234516/article/details/52842170

    我们遇到的很多核心或者本质问题,也就那一小撮人能够解决。而我们要做的就是要成为那一小撮人。
    在此感谢下RednaxelaFX大神。

    展开全文
  • Encoding

    2018-08-09 17:05:29
    Encoding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 54147 Accepted Submission(s): 24065   Problem Description Given a string contain...
  • Encoding(一)

    2017-04-24 12:30:58
    前言  众所周知计算机只能识别二进制数字,如1010,1001。我们屏幕所看到的文字,字符都是和二进制转换后的结果。将我们的文字按照某种规则转换二进制存储在计算机上,这一个过程叫字符编码,反之就是解码。...
  • 根据多次在ie6、ie7上测试发现用Encoding.Default的基本可以解决95%的乱码输出的问题,虽然网上有帖子说“谨慎使用Encoding.Default”,原帖见备注一。 但是另外的5%的乱码需要Encoding.GetEncoding("utf...
  • [转]谨慎使用Encoding.Default

    万次阅读 2017-03-22 14:53:56
    在处理文本时,经常需要处理Encoding的概念。存在这个问题的原因在于,在.NET程序内文本只是string和char对象,而保存到硬盘时,或者准备用socket把它发送出去时,都得先转换成byte[]或者字节流。而转换的算法,就是...
  • 首先贴几个MSDN上的方法: //编码的一些方法 //1、获取Encoder的实例: Encoder code1 = Encoding.ASCII.GetEncoder();// ASCII的编码实例 Encoder code2 = Encoding.Unicode.GetEncoder();// Unicode ...
  • 数据处理——One-Hot Encoding

    万次阅读 多人点赞 2015-03-03 16:54:13
    一、One-Hot Encoding  One-Hot编码,又称为一位有效编码,主要是采用位状态寄存器来对个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。  在实际的机器学习的应用任务中,特征有...
  • transfer-encoding:chunked的含义

    万次阅读 多人点赞 2015-11-24 14:48:02
    Transfer-Encoding: chunked 表示输出的内容长度不能确定,普通的静态页面、图片之类的基本上都用不到这个。 但动态页面就有可能会用到,但我也注意到大部分asp,php,asp.net动态页面输出的时候大部分还是使用Content...
  • 程序代码由于其他原因必须在JVM启动参数上加上 -Dfile.encoding=UTF-8,强行设置系统文件编码格式为utf-8.但是这样又出现了一个问题,eclipse控制台 所有中文乱码,包括启动的时候.搞了好几天,在网上也搜索了很多解决...
  • Tcl字符串编码命令encoding

    千次阅读 2019-07-08 21:59:06
    encoding
  • 最近公司的项目中,在一个功能模块的查询中本地查询没有问题,但是部署到测试服务器上面访问的时候使用Chrome访问就会提示“net::ERR_INCOMPLETE_CHUNKED_ENCODING”,用Chrome自带的工具看了下原来这个在调用ajax...
  • 先说结论,sun.jnu.encoding是指操作系统的默认编码,file.encoding是指JAVA文件的编码(请记住,不是class文件,所有class文件的编码都是UTF-8),所以,在同一个操作系统上运行的JAVA应用程序,其sun.jnu.encoding...
  • 环境:python2.7代码示例:with open('1.txt','r',encoding='utf-8') as f:  lines = f.readlines()  for line in lines:  line =line.strip()使用with open() as f 语句提示错误:TypeError: '...
  • mb_convert_encoding($filename, "GB2312", "UTF-8");//将utf-8 格式的filename的转 gb2312 于是乎,有一天它报错了: 此函数未定义,"Call to undefined function:mb_convert_encoding()&...
  • ERR_INCOMPLETE_CHUNKED_ENCODING 200

    万次阅读 2019-06-19 10:53:03
    问题描述: 在开发本地机器上的服务,通过前端网页获取数据,测试都没有问题,可以正常获取到数据。...F12查看,浏览器报net::ERR_INCOMPLETE_CHUNKED_ENCODING 200的错误。 问题排查: 网上搜索,出现该错误码...
  • Python 乱码 no encoding declared

    万次阅读 2019-08-02 20:10:46
    SyntaxError: Non-UTF-8 code starting with '\xd5' in file D:\program\work\Py_test\cn\com\tengen\test\Test2.py on line 2, but no encoding declared; see http://python.org/dev/peps/pep-0263/ ...
  • 在含有中文编码的情况下,to_csv()方法的encoding参数默认为"gbk",而read_csv()方法的encoding参数默认为"utf-8",所以最好的防止由于编码出错导致读取错误的方法就是在to_csv()和read_csv()方法同时显式地设置相同...
1 2 3 4 5 ... 20
收藏数 1,415,669
精华内容 566,267
关键字:

encoding