|
|
|
Проблема отображения русских букв в базе данных Sqlite3 Python | ☑ | ||
|---|---|---|---|---|
|
0
sidalexsandr
07.07.09
✎
12:25
|
Написал использовать кодировку utf-8
1) Скрипт создания базы данных в третьей колонке значение русскими буквами # -*- coding: utf-8 -*- import sqlite3 con = sqlite3.connect('books.db') cur = con.cursor() cur.execute('CREATE TABLE books (id INTEGER PRIMARY KEY, title VARCHAR(100), author VARCHAR(30))') cur.execute('INSERT INTO books (id, title, author) VALUES(1, "Mathematics", "Иванов")') cur.execute('INSERT INTO books (id, title, author) VALUES(2, "lirika", "Петров")') cur.execute('INSERT INTO books (id, title, author) VALUES(3, "Astronomija", "Сидоров")') con.commit() cur.close() 2) Скрипт добавления и просмотра: # -*- coding: utf-8 -*- import string,cgi,sqlite3 from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer page0=""" <b>menu</b><rb> <form action="" method="post" > <input type="submit" value="send post" > </form> <form action="sql" method="get" > <input type="submit" value="books base" > </form> """ page_start=""" <b>books</b><br> <table border=1 width=600> <tr><td><b>id</b></td><td><b>title</b></td><td><b>author</b></td></tr> """ page_end=""" </table> <form action="sql" method="get" > <input type="submit" value="show all" > </form> <form action="send_select" method="get" > id: <input name="id" type=text size=3> <input type="submit" value="select" > </form> <form action="send_delete" method="get" > id: <input name="id" type=text size=3> <input type="submit" value="delete" > </form> <form action="send_put" method="get" > id: <input name="id" type=text> title: <input name="title" type=text> author: <input name="author" type=text> <input type="submit" value="put" > </form> """ def show_base(self): page=page_start con = sqlite3.connect('books.db') cur = con.cursor() cur.execute('SELECT * FROM books') for row in cur: page+='<tr><td>'+str(row[0])+'</td><td>'+row[1]+'</td><td>'+row[2]+'</td><tr>' page+=page_end cur.close() self.wfile.write(page) class MyHandler(BaseHTTPRequestHandler): def do_GET(self): plist = self.path.split("?") self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() if plist[0]=='/' : self.wfile.write(page0) if plist[0]=='/send_put' : pl=plist[1].split("&") #split values l1=pl[0].split('=') #get id value l2=pl[1].split('=') #get title value l3=pl[2].split('=') #get author value data=(l1[1],l2[1],l3[1]) con = sqlite3.connect('books.db') cur = con.cursor() cur.execute('INSERT INTO books (id, title, author) VALUES(?, ?, ?)',data) con.commit() cur.close() show_base(self) if plist[0]=='/sql' : show_base(self) def main(): server = HTTPServer(('', 80), MyHandler) print 'started httpserver...' server.serve_forever() if __name__ == '__main__': main() Вопрос: 1) Почему при запуске второго скрипта он ругается на кодировку русских букв и не показывает базу данных? (Если в третьей колонке ввести англискими буквами то все отображается). 2) Как сделать чтобы в базу данных можно было добавлять и читать из неё значения колонок занесенные русскими буквами? |
|||
|
1
sidalexsandr
07.07.09
✎
12:27
|
Ещё интересует может кто знает живые форумы по Python, а то нашел только http://python.su/forum/index.php и он какой-то полумертвый.
|
|||
|
2
smaharbA
07.07.09
✎
12:29
|
а из под шела кажет ? (если просто запустить как скрипт)
|
|||
|
3
smaharbA
07.07.09
✎
12:31
|
это линукс ?
|
|||
|
4
sidalexsandr
07.07.09
✎
12:34
|
Написано в windows на python + sqlite3
|
|||
|
5
sidalexsandr
07.07.09
✎
12:34
|
Для запуска расширение .py
|
|||
|
6
smaharbA
07.07.09
✎
12:49
|
тогда не знаю
еслиб линукс, то
да и пайтон слабо знаю, скулайт вообще не знаю :( |
|||
|
7
smaharbA
07.07.09
✎
12:51
|
+(6) если под виндой, то скорее всего нужен какой то энкод/рекод в коде использовать
|
|||
|
8
sidalexsandr
07.07.09
✎
12:52
|
Сейчас попробую.
|
|||
|
9
sidalexsandr
07.07.09
✎
12:56
|
smaharbA к сожалению не работает.
|
|||
|
10
Мяв-Мяв
07.07.09
✎
12:56
|
# -*- coding: utf-8 -*- означает не "использовать кодировку utf-8", а "текст программы написан в кодировке utf-8"
в какой кодировке принимается текст от пользователя и в какой кодировке он пишется в базу не указано. |
|||
|
11
Мяв-Мяв
07.07.09
✎
12:58
|
(9) он свое уже отработал.
|
|||
|
12
sidalexsandr
07.07.09
✎
13:02
|
Мяв-Мяв - у меня написанно в какой кодировке добавляются записи, все приведено в пункте 1).
PS Пункт 2) программа только пока отображает. |
|||
|
13
smaharbA
07.07.09
✎
13:05
|
(9) это относилось только к линукс/фрибсд и т.п.
(10) это вроде означает, что использовать любые за пределами ASCII |
|||
|
14
sidalexsandr
07.07.09
✎
13:15
|
помогите
|
|||
|
15
Мяв-Мяв
07.07.09
✎
13:17
|
в пункте 1 у тебя написано "создать таблицу с первичным ключем и двумя текстовыми полями в кодировке по-умолчанию sqlite. потом записать в эту таблицу строку в юникоде наплевав на преобразования".
работа с различными кодировками - в главе 9 руководства sqlite описание атрибута charset для типа данных varchar там же. |
|||
|
16
Мяв-Мяв
07.07.09
✎
13:20
|
(13) нет, что все не совпадающее с ASCII писалось в UTF-8
при разработке в виндовс часто удобнее писать cp1251 (редакторы кривые) в python3 упразднена. |
|||
|
17
sidalexsandr
07.07.09
✎
13:26
|
Мяв-Мяв у тебя есть на русском руководство к sqlite3 ?
|
|||
|
18
Мяв-Мяв
07.07.09
✎
13:28
|
у меня его даже на английском нет. потому что сайт всегда доступен.
|
|||
|
19
sidalexsandr
07.07.09
✎
14:04
|
Мяв-Мяв Подскажи где написать и что в скрипте №1 , чтобы заносилось в utf-8 в русской кодирове и ещё в скрипте № 2 чтобы отображалось в русской кодировке
|
|||
|
20
Мяв-Мяв
07.07.09
✎
14:18
|
я не знаю что такое "русская кодировка"
совет создавать таблицу с хранением в utf уже дал |
|||
|
21
sidalexsandr
07.07.09
✎
14:21
|
Мяв-Мяв пожалуйста напиши как создать таблицу с хранением в utf.
|
|||
|
22
Мяв-Мяв
07.07.09
✎
14:38
|
CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
глава 9 http://dev.mysql.com/doc/refman/5.1/en/charset.html пока не познакомишься с документацией смысла писать нет. работать будет разве что случайно. |
|||
|
23
sidalexsandr
07.07.09
✎
14:54
|
Мяв-Мяв в MySql и Sqlite3 одинаково реализована работа с кодировками ?
|
|||
|
24
sidalexsandr
07.07.09
✎
15:03
|
Исправил cur.execute('CREATE TABLE books (id INTEGER PRIMARY KEY, title VARCHAR(100), author CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin)')
Пишет ошибку Operational error: no such table: books |
|||
|
25
kvk
07.07.09
✎
15:21
|
(1) Может здесь помогут: http://forum.script-coding.info/
|
|||
|
26
Мяв-Мяв
07.07.09
✎
15:27
|
тьфу на меня. перепутал.
в скульлайт3 utf8 по-умолчанию. в pysqlite3 незакрытая ошибка перекодировки. |
|||
|
27
Мяв-Мяв
07.07.09
✎
15:36
|
фрагмент работы с utf
import sqlite3 con = sqlite3.connect(":memory:") cur = con.cursor() # Create the table con.execute("create table person(lastname, firstname)") AUSTRIA = u"\xd6sterreich" # by default, rows are returned as Unicode cur.execute("select ?", (AUSTRIA,)) row = cur.fetchone() assert row[0] == AUSTRIA # but we can make sqlite3 always return bytestrings ... con.text_factory = str cur.execute("select ?", (AUSTRIA,)) row = cur.fetchone() assert type(row[0]) == str # the bytestrings will be encoded in UTF-8, unless you stored garbage in the # database ... assert row[0] == AUSTRIA.encode("utf-8") # we can also implement a custom text_factory ... # here we implement one that will ignore Unicode characters that cannot be # decoded from UTF-8 con.text_factory = lambda x: unicode(x, "utf-8", "ignore") cur.execute("select ?", ("this is latin1 and would normally create errors" + u"\xe4\xf6\xfc".encode("latin1"),)) row = cur.fetchone() assert type(row[0]) == unicode # sqlite3 offers a builtin optimized text_factory that will return bytestring # objects, if the data is in ASCII only, and otherwise return unicode objects con.text_factory = sqlite3.OptimizedUnicode cur.execute("select ?", (AUSTRIA,)) row = cur.fetchone() assert type(row[0]) == unicode cur.execute("select ?", ("Germany",)) row = cur.fetchone() assert type(row[0]) == str |
|||
|
28
smaharbA
07.07.09
✎
16:05
|
(27) о чем и речь была... тупо сознайся, что не писал для скулайта и на пайтоне )))
|
|||
|
29
Мяв-Мяв
07.07.09
✎
16:57
|
(28) если ты не знал - и для лайта и для мускуля питон использует один и тот же интерфейс - db api 2
а использование encode и явное указание кодировок - залог переносимости. а вот os.environ тут совершенно не при чем. |
|||
|
30
smaharbA
07.07.09
✎
17:38
|
(29) да хоть зачитайся лекций (енкод конечно когда перенос)
но ты не в курсе был до самого (27) ))) а вот енверон - ой как причем бывает и будет иначе будет либо си либо посикс и чо ты будешь делать с файловыми операциями на коих в этих ос все зиждется. любите вы пингвинофилы мути нагнать, не надо. |
|||
|
31
smaharbA
07.07.09
✎
17:39
|
+(30) файловые операции в контексте поста ничего общего с файлами не имеют
|
|||
|
32
Мяв-Мяв
07.07.09
✎
17:48
|
(31) и где ты в корне файловые операции узрел?
ты хоть что-то на питоне писал? любите вы пингвинофобы мути нагнать, не надо. |
|||
|
33
sidalexsandr
08.07.09
✎
00:48
|
Мяв-Мяв - спасибо за строку 27 сообщение, но меня интересует с русским текстом.
|
|||
|
34
trdm
08.07.09
✎
01:02
|
(33)
Вот фрагмент работы с SQLite на с++/Qt: bool uoMdRestructor::createNewMD() { bool rezVal = false; qStartUpSet* llog = qStartUpSet::instance(); QSqlDatabase m_db = QSqlDatabase::addDatabase("QSQLITE","MDRestr"); m_db.setDatabaseName(_fullPath); if (!m_db.open()) { llog->writeToLog(QString(QObject::tr("Can not create meta db: \"%1\"")).arg(_fullPath)); return false; } QStringList _tables = m_db.tables(); m_db.exec("PRAGMA encoding = \"UTF-8\""); обрати внимание на последнюю строчку. |
|||
|
35
sidalexsandr
08.07.09
✎
01:12
|
up
|
|||
|
36
Мяв-Мяв
08.07.09
✎
01:20
|
(33) с точки зрения utf русский и немецкий не отличается.
или ты хочешь чтобы я за тебя нужный тебе код написал? |
|||
|
37
quazare
08.07.09
✎
06:44
|
(0) почему именно sqlite 3? Пробовали использовать sqlite 2.8?
Была у меня проблема с кодировкой (любой, была UTF-8) при работе sqlite+flex - некорректно отображались руc.символы, и таже самая база нормально отображалась в связке sqlite+air. Вообще я так понимаю, проблема была именно встроенной реализации во флексе. Возможно, в питоне такая же проблема. |
|||
|
38
sidalexsandr
08.07.09
✎
23:00
|
Помогите. Думал преподаватель в отпуск ушел а сегодня он сказал что будет завтро и хочет чтобы мы ему сдали. Полное попадалово... Помогите с русскими буквами.
PS Я думал отдохнуть... |
|||
|
39
quazare
09.07.09
✎
06:28
|
версию 2.8 применяй...
|
|||
|
40
smaharbA
09.07.09
✎
06:40
|
если это виндуз то попытайся так
|
|||
|
41
smaharbA
09.07.09
✎
07:36
|
Коротко примерно так (пайтон 2.6, скулайт 3)
|
|||
|
42
smaharbA
09.07.09
✎
07:36
|
кои8 заменишь на свою локаль
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |