python2.x 기본 인코딩 문제 해결 방법
파이썬2.x에서 중국어를 처리하는 것은 골치 아픈 일입니다. 인터넷에서 이 분야에 쓰여진 글들은 고르지 못한 테스트를 거쳤고, 항상 실수가 있기 때문에 제가 직접 글을 요약할 계획입니다.
앞으로도 공부하면서 이 블로그도 계속 수정하겠습니다.
이 기사에서는 utf-8이 무엇인지, 유니코드가 무엇인지, 이들 사이의 관계가 무엇인지 등 인코딩과 관련된 기본 지식이 이미 있다고 가정합니다.
str 및 바이트코드
우선 유니코드에 대해서는 전혀 이야기하지 말자.
s = "人生苦短"
s는 바이트코드를 저장하는 문자열입니다. 그렇다면 이 바이트코드의 형식은 무엇입니까?
이 코드가 인터프리터에 입력되면 이 s의 형식은 인터프리터의 인코딩 형식입니다. Windows cmd의 경우 gbk입니다.
코드를 저장하고 실행하면, 예를 들어 utf-8로 저장되어 있으면 인터프리터가 이 프로그램을 로드하면 s가 utf-8 인코딩으로 초기화됩니다.
유니코드 및 str
우리는 유니코드가 코딩 표준이라는 것을 알고 있으며 구체적인 구현 표준은 utf-8, utf-16, gbk...
Python은 내부적으로 2바이트를 사용하여 유니코드를 저장합니다. str 대신 유니코드 객체를 사용하면 유니코드가 크로스 플랫폼에 편리하다는 장점이 있습니다.
유니코드는 다음 두 가지 방법으로 정의할 수 있습니다.
s1 = u"人生苦短" s2 = unicode("人生苦短", "utf-8")
인코딩 및 디코드
파이썬의 인코딩 및 디코딩은 다음과 같습니다.
다음과 같은 코드를 작성할 수 있습니다.
# -*- coding:utf-8 -*- su = "人生苦短" # : su是一个utf-8格式的字节串 u = s.decode("utf-8") # : s被解码为unicode对象,赋给u sg = u.encode("gbk") # : u被编码为gbk格式的字节串,赋给sg print sg # 打印sg
그러나 현실은 이보다 더 복잡합니다. 예를 들어 다음 코드를 살펴보세요.
왜 이것이 가능합니까? 위 그림에서 인코딩 과정의 화살표를 보면 원리를 생각해볼 수 있는데, str을 인코딩할 때 먼저 기본 인코딩을 사용하여 자신을 유니코드로 디코딩한 다음, 지정한 인코딩으로 유니코드를 인코딩합니다.
이것은 python2에서 중국어를 처리할 때 대부분의 오류가 발생하는 이유입니다. >
s = "人生苦短" s.encode('gbk')
오류 메시지
오류를 보고합니다: UnicodeDecodeError: 'ascii' codec can 바이트를 디코딩하지 않습니다...
기본 인코딩을 지정하지 않았기 때문에 실제로 다음과 같은 작업을 수행합니다.
# -*- coding: utf-8 -*- s = "人生苦短" s.encode('gbk')
기본 인코딩 설정
기본 인코딩을 설정하는 코드는 다음과 같습니다. # -*- coding: utf-8 -*-
s = "人生苦短"
s.decode('ascii').encode('gbk')
예를 들어 이전 섹션의 예에서 str이 다른 형식으로 인코딩되면 defaultencoding이 사용됩니다.
reload(sys) sys.setdefaultencoding('utf-8')
s.encode("utf-8") 等价于 s.decode(defaultencoding).encode("utf-8")
기본 인코딩인 ascii는 많은 오류의 원인이므로 초기에 기본 인코딩을 설정하는 것이 좋은 습관입니다.
파일 헤더는 인코딩의 역할을 선언합니다.
파이썬 파일의 헤더 부분을 설명해 주신 블로그에 감사드립니다. 상위:# -*- 코딩: utf-8 -*- 현재는 세 가지 기능이 있는 것으로 보입니다.
코드에 중국어
주석이 있는 경우 다음 명령문이 필요합니다.
고급편집기(예: 내 emacs)는 헤더를 기반으로 선언합니다. 이를 코드 파일의 형식으로 사용하십시오. 프로그램은 유니코드 객체와 같은 헤더 선언을 통해 "인생은 짧다"를 디코딩하고 초기화합니다. (따라서 헤더 선언과 코드의 저장 형식이 일치해야 합니다.)
소개 요청 라이브러리
requests는 크롤러를 작성하고 서버 응답 데이터를 테스트할 때 자주 사용되는 매우 실용적인 Python HTTP 클라이언트 라이브러리입니다. Request 객체는 서버에 액세스한 후 Response 객체를 반환합니다. 이 객체는 반환된 Http 응답 바이트코드를 content 속성에 저장합니다.
그런데 다른 속성 텍스트에 접근하면 유니코드 객체가 반환되고 여기서 잘못된 문자가 자주 발생합니다.
Response 객체는 다른 속성 인코딩을 통해 바이트코드를 유니코드로 인코딩하기 때문에 이 인코딩 속성은 실제로 응답 자체에서 추측됩니다.
官方文档:
text
Content of the response, in unicode.
If Response.encoding is None, encoding will be guessed using chardet.
The encoding of the response content is determined based solely on HTTP headers, following RFC 2616 to the letter. If you can take advantage of non-HTTP knowledge to make a better guess at the encoding, you should set r.encoding appropriately before accessing this property.
所以要么你直接使用content(字节码),要么记得把encoding设置正确,比如我获取了一段gbk编码的网页,就需要以下方法才能得到正确的unicode。
import requests url = "http://xxx.xxx.xxx" response = requests.get(url) response.encoding = 'gbk' print response.text
如果是早期的我写博客,那么我一定会写这样的例子:不仅仅要原理,更要使用方法!
如果现在的文件编码为gbk,然后文件头为:# -*- coding: utf-8 -*-,再将默认编码设置为xxx,那么如下程序的结果会是……
这就类似于,当年学c的时候,用各种优先级,结合性,指针来展示自己水平的代码。
实际上这些根本就不实用,谁会在真正的工作中写这样的代码呢?我在这里想谈谈实用的处理中文的python方法。
基本设置
主动设置defaultencoding。(默认的是ascii)
代码文件的保存格式要与文件头部的# coding:xxx一致
如果是中文,程序内部尽量使用unicode,而不用str
关于打印
你在打印str的时候,实际就是直接将字节流发送给shell。如果你的字节流编码格式与shell的编码格式不相同,就会乱码。
而你在打印unicode的时候,系统自动将其编码为shell的编码格式,是不会出现乱码的。
程序内外要统一
如果说程序内部要保证只用unicode,那么在从外部读如字节流的时候,一定要将这些字节流转化为unicode,在后面的代码中去处理unicode,而不是str。
with open("test") as f: for i in f: # 将读入的utf-8字节流进行解码 u = i.decode('utf-8') ....
如果把连接程序内外的这段数据流比喻成通道的的话,那么与其将通道开为字节流,读入后进行解码,不如直接将通道开为unicode的。
# 使用codecs直接开unicode通道 file = codecs.open("test", "r", "utf-8") for i in file: print type(i) # i的类型是unicode的
python 3和2很大区别就是python本身改为默认用unicode编码。
字符串不再区分"abc"和u"abc", 字符串"abc"默认就是unicode,不再代表本地编码、
由于有这种内部编码,像c#和java类似,再没有必要在语言环境内做类似设置编码,比如“sys.setdefaultencoding”;
也因此也python 3的代码和包管理上打破了和2.x的兼容。2.x的扩展包要适应这种情况改写。
另一个问题是语言环境内只有unicode怎么输出gbk之类的本地编码。
1.如果你在Python中进行编码和解码的时候,不指定编码方式,那么python就会使用defaultencoding。 而python2.x的的defaultencoding是ascii,
这也就是大多数python编码报错:“UnicodeDecodeError: 'ascii' codec can't decode byte ......”的原因。
2.关于头部的# coding:utf-8,有以下几个作用 2.1如果代码中有中文注释,就需要此声明 2.2比较高级的编辑器(比如我的emacs),会根据头部声明,将此作为代码文件的格式。 2.3程序会通过头部声明,解码初始化 u"人生苦短",这样的unicode对象,(所以头部声明和代码的存储格式要一致)
python2.7以后不用setdefaultencoding了,这两个是没有区别的
这两个作用不一样, 1. # coding:utf-8
作用是定义源代码的编码. 如果没有定义, 此源码中是不可以包含中文字符串的. PEP 0263 -- Defining Python Source Code Encodings https://www.python.org/dev/peps/pep-0263/ 2. sys.getdefaultencoding()
是设置默认的string的编码格式
答按惯例都在(序列化)输出时才转换成本地编码。
위 내용은 python2.x 기본 인코딩 문제 해결 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











MySQL에는 무료 커뮤니티 버전과 유료 엔터프라이즈 버전이 있습니다. 커뮤니티 버전은 무료로 사용 및 수정할 수 있지만 지원은 제한되어 있으며 안정성이 낮은 응용 프로그램에 적합하며 기술 기능이 강합니다. Enterprise Edition은 안정적이고 신뢰할 수있는 고성능 데이터베이스가 필요하고 지원 비용을 기꺼이 지불하는 응용 프로그램에 대한 포괄적 인 상업적 지원을 제공합니다. 버전을 선택할 때 고려 된 요소에는 응용 프로그램 중요도, 예산 책정 및 기술 기술이 포함됩니다. 완벽한 옵션은없고 가장 적합한 옵션 만 있으므로 특정 상황에 따라 신중하게 선택해야합니다.

이 기사는 MySQL 데이터베이스의 작동을 소개합니다. 먼저 MySQLworkBench 또는 명령 줄 클라이언트와 같은 MySQL 클라이언트를 설치해야합니다. 1. MySQL-Uroot-P 명령을 사용하여 서버에 연결하고 루트 계정 암호로 로그인하십시오. 2. CreateABase를 사용하여 데이터베이스를 작성하고 데이터베이스를 선택하십시오. 3. CreateTable을 사용하여 테이블을 만들고 필드 및 데이터 유형을 정의하십시오. 4. InsertInto를 사용하여 데이터를 삽입하고 데이터를 쿼리하고 업데이트를 통해 데이터를 업데이트하고 DELETE를 통해 데이터를 삭제하십시오. 이러한 단계를 마스터하고 일반적인 문제를 처리하는 법을 배우고 데이터베이스 성능을 최적화하면 MySQL을 효율적으로 사용할 수 있습니다.

MySQL 데이터베이스 성능 최적화 안내서 리소스 집약적 응용 프로그램에서 MySQL 데이터베이스는 중요한 역할을 수행하며 대규모 트랜잭션 관리를 담당합니다. 그러나 응용 프로그램 규모가 확장됨에 따라 데이터베이스 성능 병목 현상은 종종 제약이됩니다. 이 기사는 일련의 효과적인 MySQL 성능 최적화 전략을 탐색하여 응용 프로그램이 고 부하에서 효율적이고 반응이 유지되도록합니다. 실제 사례를 결합하여 인덱싱, 쿼리 최적화, 데이터베이스 설계 및 캐싱과 같은 심층적 인 주요 기술을 설명합니다. 1. 데이터베이스 아키텍처 설계 및 최적화 된 데이터베이스 아키텍처는 MySQL 성능 최적화의 초석입니다. 몇 가지 핵심 원칙은 다음과 같습니다. 올바른 데이터 유형을 선택하고 요구 사항을 충족하는 가장 작은 데이터 유형을 선택하면 저장 공간을 절약 할 수있을뿐만 아니라 데이터 처리 속도를 향상시킬 수 있습니다.

HADIDB : 가볍고 높은 수준의 확장 가능한 Python 데이터베이스 HadIDB (HADIDB)는 파이썬으로 작성된 경량 데이터베이스이며 확장 수준이 높습니다. PIP 설치를 사용하여 HADIDB 설치 : PIPINSTALLHADIDB 사용자 관리 사용자 만들기 사용자 : createUser () 메소드를 작성하여 새 사용자를 만듭니다. Authentication () 메소드는 사용자의 신원을 인증합니다. Fromhadidb.operationimportuseruser_obj = user ( "admin", "admin") user_obj.

해시 값으로 저장되기 때문에 MongoDB 비밀번호를 Navicat을 통해 직접 보는 것은 불가능합니다. 분실 된 비밀번호 검색 방법 : 1. 비밀번호 재설정; 2. 구성 파일 확인 (해시 값이 포함될 수 있음); 3. 코드를 점검하십시오 (암호 하드 코드 메일).

MySQL은 기본 데이터 저장 및 관리를위한 네트워크 연결없이 실행할 수 있습니다. 그러나 다른 시스템과의 상호 작용, 원격 액세스 또는 복제 및 클러스터링과 같은 고급 기능을 사용하려면 네트워크 연결이 필요합니다. 또한 보안 측정 (예 : 방화벽), 성능 최적화 (올바른 네트워크 연결 선택) 및 데이터 백업은 인터넷에 연결하는 데 중요합니다.

MySQL Workbench는 구성이 올바른 경우 MariadB에 연결할 수 있습니다. 먼저 커넥터 유형으로 "mariadb"를 선택하십시오. 연결 구성에서 호스트, 포트, 사용자, 비밀번호 및 데이터베이스를 올바르게 설정하십시오. 연결을 테스트 할 때는 마리아드 브 서비스가 시작되었는지, 사용자 이름과 비밀번호가 올바른지, 포트 번호가 올바른지, 방화벽이 연결을 허용하는지 및 데이터베이스가 존재하는지 여부를 확인하십시오. 고급 사용에서 연결 풀링 기술을 사용하여 성능을 최적화하십시오. 일반적인 오류에는 불충분 한 권한, 네트워크 연결 문제 등이 포함됩니다. 오류를 디버깅 할 때 오류 정보를 신중하게 분석하고 디버깅 도구를 사용하십시오. 네트워크 구성을 최적화하면 성능이 향상 될 수 있습니다

생산 환경의 경우 성능, 신뢰성, 보안 및 확장 성을 포함한 이유로 서버는 일반적으로 MySQL을 실행해야합니다. 서버에는 일반적으로보다 강력한 하드웨어, 중복 구성 및 엄격한 보안 조치가 있습니다. 소규모 저하 애플리케이션의 경우 MySQL이 로컬 컴퓨터에서 실행할 수 있지만 자원 소비, 보안 위험 및 유지 보수 비용은 신중하게 고려되어야합니다. 신뢰성과 보안을 높이려면 MySQL을 클라우드 또는 기타 서버에 배포해야합니다. 적절한 서버 구성을 선택하려면 응용 프로그램 부하 및 데이터 볼륨을 기반으로 평가가 필요합니다.
