'UTF-8'에 해당되는 글 2건

  1. 2007.12.23 MySQL과 UTF8 세팅 문제 1
  2. 2007.08.18 한글로 된 html 읽어올 때 u' 제거하기

며칠이나 골치 썩이던, 웹페이지에서 한글을 읽어다가 MySQL에 쓰는 문제를 완료.

출처: http://python.kr/viewtopic.php?p=57995&sid=64c9286c1a9876783aa4569c3047539a

※ python code에서의 세팅

           1. encoding: utf8
           2. DB를 연결한 후에 다음의 코드로 글자와 관련된 세팅을 확인

conn.query("set character_set_connection=utf8;")
conn.query("set character_set_server=utf8;")
conn.query("set character_set_client=utf8;")
conn.query("set character_set_results=utf8;")
conn.query("set character_set_database=utf8;")


※ MySQL의 character 세팅


           1. Config Wizard에서 utf8로 세팅

Example code

#-*- coding: utf8 -*-
#import urllib
#import BeautifulSoup
from BeautifulSoup import BeautifulSoup
import MySQLdb
import urllib2

#url = 'http://weather.local.naver.com/AreaCityWeather.nhn?m=subsi&fct=11H20301'
page=urllib2.urlopen("http://weather.local.naver.com/AreaCityWeather.nhn?m=subsi&fct=11H20301")
params = []

#soup = BeautifulSoup.BeautifulSoup( urllib.urlopen(url).read() )
soup = BeautifulSoup(page, fromEncoding="utf8")

inc1 = soup('table', {'width':'593', 'style':'border:1px solid #DCDDE0'})[0]
days = [inc2.contents[0] for inc2 in inc1('span', {'class':'gray01 b'})]
states = [inc2.contents[0] for inc2 in inc1('td', {'class':'gray01 ls'})]
params.extend( zip(days, states) )

for inc1 in soup('table', {'width':'117',}):
   day = inc1('span', {'class':'gray01 b'})[0].contents[0]
   state = inc1('td', {'height':'25', 'class':'gray01 ls'})[0].contents[0]
   params.append( (day, state) )

#print params
conn = MySQLdb.connect(host='localhost', db='weather', user='????', passwd='????')

#DB를 연결한 후에, 반드시 다음의 다섯줄을 추가해 주어야 한다
conn.query("set character_set_connection=utf8;")
conn.query("set character_set_server=utf8;")
conn.query("set character_set_client=utf8;")
conn.query("set character_set_results=utf8;")
conn.query("set character_set_database=utf8;")

#cursor = conn.cursor()
#db_info = {'host':'localhost', 'db':'weather', 'user':'root', 'passwd':'????', 'encoding': 'utf8',}
#conn = MySQLdb.connect(**db_info)
cursor = conn.cursor()
cursor.execute ("DROP TABLE IF EXISTS data")
cursor.execute ("""CREATE TABLE data(day VARCHAR(10),state VARCHAR(50))""")

for inc in params:
   query = ( "INSERT INTO data(day, state) VALUES('%s', '%s')" % inc )
#   query = ("INSER INTO data VALUES('%s','%s')"%inc)
   print query
#   cursor.execute(uery)
   cursor.execute( query.encode('utf8'))
   cursor.execute('COMMIT')

#   cursor.execute('''INSER INTO data VALUES('%s','%s')'''%inc)
   result=cursor.fetchall()
   print result
cursor.close()


만약 캐릭터셋이 euckr이나 Latin1이라면 DB 접속후에

conn.query("set character_set_connection=euckr;")
conn.query("set character_set_server=euckr;")
conn.query("set character_set_client=euckr;")
conn.query("set character_set_results=euckr;")
conn.query("set character_set_database=euckr;")

그리고, my.ini 파일에서

[mysqld]
character-set-client-handshake = FALSE
로 해버리면 한글이 잘 될 수도 있다.

Posted by trigger
,
http://home.paran.com/johnsonj/hangul/How%20to%20Use%20UTF-8%20with%20Python.html 에서 답을 찾을 수 있다.

바이트 순서 표식자(Byte Order Marker (BOM))

UTF-8 파일은 가끔 바이트 순서 표식(BOM)으로 시작하여 UTF-8로 인코딩 되어 있음을 알린다. 이는 보통 윈도우즈에서 사용된다. Mac OS X에서, (예, TextEdit 같은) 어플리케이션은 BOM을 무시하고 파일이 다시 저장될 때 그 표식을 제거한다. W3C HTML 평가기는 구형 어플리케이션에서 BOM을 처리하지 못할 수도 있다고 경고한다. 유니코드는 효과적으로 그 표식을 무시하므로, 파일을 읽을 때 문제가 되지 않을 것이다. 파일의 시작에 이 표식을 추가해 ASCII로 인코딩되었는지 UTF-8로 인코딩되었는지 결정하고 싶다면, codecs 모듈은 이렇게 하기 위한 상수를 제공한다:

out = file( "someFile", "w" )
out.write( codecs.BOM_UTF8 )
out.write( unicodeString.encode( "utf-8" ) )
out.close()

BOM과 UTF-8을 사용할 때 주의할 필요가 있다. 솔직히, 나는 이것이 파이썬의 버그라고 생각하지만, 나도 잘 모른다. 파이썬은 BOM 값을 무시하는 대신에 유니코드 문자로 바꾼다. 예를 들어 (파이썬 2.3에서 테스트함):

>>> codecs.BOM_UTF16.decode( "utf16" )
u''
>>> codecs.BOM_UTF8.decode( "utf8" )
u'\ufeff'

UTF-16에 대하여, 파이썬은 BOM을 빈 문자열로 디코드하지만, UTF-8에 대해서는, 문자 하나로 디코드한다. 왜 차이가 있는가? UTF-8 디코더는 UTF-16 디코더와 똑 같은 일을 해야 당연하고 BOM 표식을 제거해야 할 것이다. 그렇지만, 그렇게 하지 않기 때문에, 다음과 같이 손수 탐지하여 제거할 필요가 있을 것이다:

import codecs
if s.beginswith( codecs.BOM_UTF8 ):
	# 바이트 문자열이 BOM과 함께 시작한다: 무언가를 한다.
	# 예를 들어, 문자열을 UTF-8로 디코드한다
	
if u[0] == unicode( codecs.BOM_UTF8, "utf8" ):
	# 유니코드 문자열이 BOM으로 시작한다: 무언가를 한다.
	# 예를 들어, 그 문자를 제거한다.

# BOM이 존재한다면, 유니코드 문자열의 선두로부터 걷어낸다. 
u.lstrip( unicode( codecs.BOM_UTF8, "utf8" ) )
Posted by trigger
,