2009-01-19 1 views
1

게시 된 RSS 항목을 추출하고 rss를 sqlite3 db에 저장하려고하는 python sgi 스크립트가 있습니다. WSGIServer로 flup을 사용하고 있습니다.
가 등록한 컨텐츠 구 :.파이썬을 사용하여 utf-16으로 인코딩 된 rss 스트림을 sqlite3에 저장하는 방법

from pysqlite2 import dbapi2 as sqlite 
ldb = sqlite.connect("/var/vhost/mysite.com/db/rssharvested.db") 
lcursor = ldb.cursor() 
lcursor.execute("INSERT into rss(data) VALUES(?)", (postData,)) 
: 의 postData = 싸다 [ "wsgi.input를"]

는 DB에 저장하는 시도() "CONTENT_LENGTH"(싸다을 INT) 읽기

이 결과는 rss의 처음 몇 문자 만 레코드에 저장됩니다. ÿll < 저는 초기 문자가 rss의 BOM이라고 생각합니다.

나는 utf-8로 rss를 처음 엔코딩하는 것을 포함하여 생각할 수있는 모든 순열을 시도한 다음 저장하려고 시도했지만 결과는 동일했습니다. 일부 문자를 유니 코드로 표현할 수 없기 때문에 디코딩 할 수 없습니다. 이 문제에 어떤 통찰력을위한 파이썬 2.5.2 sqlite가에게 사전에 3.5.7

감사를 실행

.

'\ XEF \ xbb \

XBF 감사 : 이하의 파일로 기록되고 볼은에 repr 함수에 의해 수정 여기

는 postData를 포함 초기 데이터의 샘플 인 모든 답장을 위해! 매우 도움이됩니다.


내가 (미리보기이 작동 표시) 실체에보다 더 큰 변환, 다시 시도됩니다 유래 HTML 필터를 통해하지 않았다 제출 한 샘플입니다.

\ xef \ xbb \ xbf <? xml version = "1.0"encoding = "utf-16"? > < rss xmlns : xsi = "http://www.w3.org/2001/XMLSchema"xmlns : xsd = "http://www.w3.org/2001/XMLSchema"> < 채널 > < 항목 d3p1 : size = "0"xsi : type = "tFileItem"xmlns : d3p1 = "http://htinc.com/opensearch-ex/1.0/">

답변

0

SQL 삽입 전에 문자열을 유니 코드 호환 문자열로 변환해야합니다. UnicodeError 예외를 발생 시키면 string.encode ("utf-8")를 인코딩합니다.

인코딩을 자동 검색하여 인코딩 스키마에서 인코딩 할 수 있습니다. Auto detect encoding

1

삽입 인코딩과 관련하여, unicode 문자열과 unicode 문자열 만 삽입해야합니다.

읽고 해석하는 데 Mark Pilgrim의 Feed Parser을 사용하는 것이 좋습니다. BOM을 적절하게 처리하고 라이센스로 상업적 사용이 가능합니다. RSS 데이터를 실제로 파싱하지 않으면 너무 무거울 수 있습니다.

1

들어오는 데이터가 UTF-16 (그렇지 않으면 UCS-2)으로 인코딩되어 있습니까?

UTF-16으로 인코딩 된 유니 코드 문자열에는 대개 NUL 문자가 많이 포함되어 있으므로 UTF-16 데이터는 환경 변수에 거의 저장할 수 없습니다 (POSIX의 env 변수는 NUL로 끝남).

postData 가변 내용의 샘플을 제공하십시오. repr()을 사용하여 출력하십시오.

그때까지 확실한 조언은 : 모든 DB 상호 작용에서 파이썬 측의 문자열은 유니 코드 문자열이어야합니다. DB 인터페이스는 필요한 모든 번역/인코딩/디코딩을 처리해야합니다.

+0

주 : UCS-2는 몇 가지 점에서 UTF-16과 크게 다릅니다. ----- 특히 : a) UCS-2는 UTF-16처럼 가능한 모든 유니 코드 문자를 나타낼 수 없습니다. b) UCS-2의 문자는 모두 길이가 2 바이트이고 UTF-16 문자열의 문자는 더 길다 (서로 쌍을 이룬다). – Deestan