python 중국어 인 코딩 문제 상세 설명
Python 에는 str 와 유 니 코드 두 가지 기본 문자열 이 있 습 니 다.Python 에 서 는'유 니 코드 문자열'과'유 니 코드 대상'의 차 이 를 구분 하 는 데 주의해 야 합 니 다.뒤의 모든"유 니 코드 문자열"은 python 의"유 니 코드 대상"을 말 합 니 다.
사실 Python 에는'유 니 코드 문자열'같은 것 이 없고'유 니 코드'대상 만 있 습 니 다.전통 적 인 의미 의 유 니 코드 문자열 은 str 대상 으로 충분히 표시 할 수 있 습 니 다.다만 이 때 는 하나의 바이트 흐름 일 뿐 유 니 코드 대상 으로 디 코딩 되 지 않 는 한 실제 적 인 의미 가 없다.
우 리 는'하하'로 여러 플랫폼 에서 테스트 를 했 는데 그 중에서'하'에 대응 하 는 서로 다른 인 코딩 은 다음 과 같다.
1. UNICODE (UTF8-16), C854;
2. UTF-8, E59388;
3. GBK, B9FE。
1.1 윈도우 콘 솔
다음은 windows 콘 솔 에서 실 행 된 결과 입 니 다.
콘 솔 에서 중국어 문자 인 코딩 은 UTF-16 이 아 닌 GBK 임 을 알 수 있다.문자열 s(GBK 인 코딩)를 decode 로 디 코딩 하면 같은 유 니 코드 대상 을 얻 을 수 있 습 니 다.
메모:콘 솔 에서 ss 를 인쇄 할 수 있다 고 해서 직렬 화 될 수 있 는 것 은 아 닙 니 다.예 를 들 어:
파일 에 ss 를 직접 출력 하면 같은 이상 을 던 집 니 다.유 니 코드 중국어 문자열 을 처리 할 때 는 먼저 encode 함 수 를 호출 하여 다른 인 코딩 출력 으로 변환 해 야 합 니 다.이 점 은 각 환경 에 똑같다.
요약:Python 에서"str"대상 은 하나의 바이트 배열 입 니 다.그 안의 내용 이 합 법 적 인 문자열 인지,그리고 이 문자열 이 어떤 인 코딩(gbk,utf-8,유 니 코드)을 사용 하 는 지 는 중요 하지 않 습 니 다.이 내용 들 은 사용자 스스로 기록 하고 판단 해 야 한다.이러한 제한 도'유 니 코드'대상 에 도 적용 된다.'유 니 코드'대상 의 내용 이 반드시 합 법 적 인 유 니 코드 문자열 이 아니 라 는 것 을 기억 하 세 요.우 리 는 곧 이런 상황 을 볼 수 있 습 니 다.
요약:windows 콘 솔 에서 gbk 인 코딩 을 지원 하 는 str 대상 과 유 니 코드 인 코딩 을 지원 하 는 유 니 코드 대상 입 니 다.
1.2 Windows IDLE(Shell 에서 실행)
windows 의 IDLE 에서 실행 효 과 는 windows 콘 솔 과 완전히 일치 하지 않 습 니 다.
이 를 통 해 알 수 있 듯 이'u'를 표시 하지 않 는 문자열 에 대해 IDLE 는 그 중의 중국어 문 자 를 GBK 인 코딩 을 한다.하지만"u"를 사용 하 는 유 니 코드 문자열 에 대해 서 는 IDLE 가 똑 같이 GBK 인 코딩 을 사 용 했 습 니 다.다른 것 은 이 럴 때 모든 문자 가 유 니 코드(대상)문자 입 니 다!!이때 len(ss)=4.
이렇게 해서 신기 한 문제 가 생 겼 습 니 다.현재 ss 는 IDLE 에 정상적으로 표시 되 지 않 습 니 다.그리고 나 도 ss 를 정상 적 인 코드 로 바 꿀 수가 없어!예 를 들 어 아래 의 방법 을 사용한다.
이 는 IDLE 현지 화가 미흡 해 중국어 지원 에 문제 가 있 었 기 때 문 일 수 있다.IDLE 의 SHELL 에 서 는 u'중국어'라 는 방식 을 사용 하지 말 것 을 권장 합 니 다.원 하 는 것 이 아니 기 때 문 입 니 다.
이 는 IDLE 의 Shell 이 두 가지 형식의 중국어 문자열 을 지원 한 다 는 것 을 설명 한다.GBK 인 코딩 의'str'대상 과 UNICODE 인 코딩 의 유 니 코드 대상 이다.
1.3 IDLE 에서 코드 실행
IDLE 의 SHELL 에서 파일 을 실행 하면 또 다른 결 과 를 얻 을 수 있 습 니 다.파일 의 내용 은:
직접 실행 한 결 과 는:
흠 잡 을 데 없 이 상당히 만족스럽다.나 는 다른 인 코딩 된 파일 이 정상적으로 작 동 할 수 있 는 지 시험 해 본 적 이 없 지만,생각해 보 니 괜 찮 을 것 같다.
같은 코드 가 windows 콘 솔 에서 오디 션 을 봤 지만 문제 가 없 었 다.
1.4 Windows Eclipse
Eclipse 에서 중국 어 를 처리 하 는 것 은 더욱 어렵 습 니 다.Eclipse 에서 코드 를 작성 하고 실행 코드 는 서로 다른 창 에 속 하 며 기본 인 코딩 을 가 질 수 있 기 때 문 입 니 다.다음 코드 에 대해:
#!/usr/bin/python
# -*- coding: utf-8 -*-
s = " "
ss = u' '
print repr(s)
print repr(ss)
print s.decode('utf-8').encode('gbk')
print ss.encode('gbk')
print s.decode('utf-8')
print ss
앞의 네 개의 print 가 정상적으로 작 동 하고 마지막 두 개의 print 는 모두 이상 을 던 집 니 다.'/xe5/x93/x88/xe5/x93/x88'
u'/u54c8/u54c8'
하하.
하하.
Traceback (most recent call last):
File "E:/Workspace/Eclipse/TestPython/Test/test_encoding_2.py", line 13, in
print s.decode('utf-8')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
GBK 인 코딩 의 str 대상 은 정상적으로 인쇄 할 수 있 지만 유 니 코드 인 코딩 의 유 니 코드 대상 은 출력 할 수 없다 는 것 이다.원본 파일 에서"Run as","Run"을 클릭 하고 팝 업 대화 상자 에서"Common"을 선택 하 십시오.
Eclipse 콘 솔 의 부족 한 인 코딩 방식 이 GBK 임 을 알 수 있 습 니 다.그래서 유 니 코드 를 지지 하지 않 는 것 도 도리 에 맞다.파일 에 있 는 coding 을 GBK 로 수정 하면 GBK 인 코딩 의 str 대상 을 직접 인쇄 할 수 있 습 니 다.예 를 들 어 s.
원본 파일 의 인 코딩 을'UTF-8'로 설정 하고 콘 솔 의 인 코딩 도'UTF-8'로 설정 하면 인쇄 할 때 문제 가 없 을 것 이라는 이치 다.그러나 UTF-8 인 코딩 의 str 대상 을 인쇄 할 때 중국어 의 마지막 문자 가 어 지 럽 게 표 시 돼 제대로 읽 지 못 하 는 것 으로 나 타 났 다.하지만 나 는 이미 만족 했다.적어도 사람들 은 이상 하 게 던 지지 않 았 다.)
BTW:이 클립 스 버 전 은 3.2.1 입 니 다.
1.5 파일 에서 중국어 읽 기
window 아래 에서 메모 장 으로 파일 을 편집 할 때 유 니 코드 나 UTF-8 로 저장 하면 각각 파일 의 첫머리 에 두 개의 바이트'/xfF/xfE'와 세 개의 바이트'/xEF/xBB/xBF'를 붙인다.읽 을 때 문제 가 생 길 수 있 지만,서로 다른 환경 에서 문자 보다 많은 처리 도 다르다.
windows 의 콘 솔 을 예 로 들 면 세 가지 버 전의'하하'를 메모 장 으로 저장 합 니 다.
utf-8 형식의 파일 을 열 고 utf-8 문자열 을 읽 은 후 디 코딩 은 유 니 코드 대상 이 됩 니 다.그러나 추 가 된 세 문 자 를 똑 같이 변환 하여 유 니 코드 문자 로 바 꿉 니 다.문자 의 데이터 값 은'/xfF/xfE'입 니 다.이 문 자 는 인쇄 될 수 없습니다.인 코딩 할 때 이 문 자 를 건 너 뛰 어야 합 니 다.
유 니 코드 형식의 파일 을 열 면 문자열 이 올 바 릅 니 다.이 때 utf-16 디 코딩 을 적용 하여 정확 한 유 니 코 대상 을 얻 을 수 있 고 직접 사용 할 수 있 습 니 다.여분의 그 충전 문 자 는 변환 할 때 걸 러 집 니 다.
ansi 형식의 파일 을 열 면 문자 가 채 워 지지 않 아 직접 사용 할 수 있 습 니 다.
결론:python 을 사용 하여 생 성 된 파일 을 읽 고 쓰 는 것 은 문제 가 없 지만 notepad 에서 생 성 된 텍스트 파일 을 처리 할 때 이 파일 이 비 ansi 인 코딩 일 수 있다 면 채 우기 문 자 를 어떻게 처리 하 는 지 고려 해 야 합 니 다.
1.6 데이터베이스 에 중국어 사용
방금 Python 을 접 했 습 니 다.제 가 사용 하 는 데이터 베 이 스 는 my sql 입 니 다.삽입,찾기 등 작업 을 수행 할 때 실행 환경 에서 사용 하 는 문자 인 코딩 이 my sql 과 일치 하지 않 으 면 실행 시 오류 가 발생 할 수 있 습 니 다.물론 위 에서 본 상황 과 마찬가지 로 운영 환경 은 관건 적 인 요소 가 아니 라 문 구 를 조회 하 는 인 코딩 방식 이 관건 이다.검색 작업 을 수행 할 때마다 검색 문자열 을 인 코딩 으로 변환 하면 my sql 의 기본 문자 인 코딩 으로 바 뀌 어도 문제 가 되 지 않 습 니 다.근 데 코드 를 이렇게 쓰 는 것 도 너무 힘 들 잖 아.
다음 코드 로 데이터 베 이 스 를 연결 합 니 다:
self.conn = MySQLdb.connect(use_unicode = 1, charset='utf8', **server)
내 가 이해 할 수 없 는 것 은 데이터베이스 에 사용 되 는 기본 인 코딩 이 UTF-8 인 이상 내 가 연결 할 때 도 UTF-8 을 사용 하 는데 왜 조 회 된 텍스트 내용 이 UNICODE 인 코딩(유 니 코드 대상)입 니까?이것 은 MySQLdb 라 이브 러 리 의 설정 입 니까?1.7 XML 에서 중국어 사용
xml.dom.minidom 을 사용 하면 MySQLdb 와 유사 하 며,생 성 된 dom 대상 에 대해 toxml 방법 으로 유 니 코드 대상 을 호출 합 니 다.utf-8 텍스트 를 출력 하려 면 두 가지 방법 이 있 습 니 다.
1.시스템 함수 사용
xml 문 서 를 출력 할 때 인 코딩 을 하 는 것 이 가장 좋 은 방법 이 라 고 생각 합 니 다.
xmldoc.toxml(encoding='utf-8')
xmldoc.writexml(outfile, encoding = ‘utf-8')
2.자체 인 코딩 생 성toxml 를 사용 한 후에 encode 방법 으로 문 서 를 인 코딩 할 수 있 습 니 다.그러나 이 방법 은 적합 한 xml declaration(xml 문서 첫 줄 의 encoding 부분)을 얻 을 수 없습니다.
xmldoc.createrProcessingInstruction 을 통 해 processing intraction 을 만 들 려 고 하지 마 십시오:
<?xml version='1.0' encoding='utf-8'?>
xml declaration 은 그런 것 처럼 보이 지만 사실은 processing intraction 이 아 닙 니 다.다음 방법 으로 만 족 스 러 운 xml 파일 을 얻 을 수 있 습 니 다:
print >> outfile, “<?xml version='1.0' encoding='utf-8'?>”
print >> outfile, xmldoc.toxml().encode(‘utf-8')[22:]
그 중 두 번 째 줄 은 xmldoc.toxml 을 호출 할 때 생 성 된'”,그것 의 길 이 는 22 이다.관상 은 두 가지 방법의 용법 비교 이다.
또한,IDLE 의 셸 에 서 는 u'중국어'로 속성 을 할당 하지 마 십시오.위 에서 논 의 했 듯 이 이렇게 얻 은 유 니 코드 문자열 이 정확 하지 않 습 니 다.
python 중국어 인 코딩 문제 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 중국어 인 코딩 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.