Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   SQLite>Insert -проблема кодировки (http://www.flasher.ru/forum/showthread.php?t=125213)

EXFlash 19.05.2009 09:51

SQLite>Insert -проблема кодировки
 
Ломаю голову уже несколько часов:
выполняю SQLite-запрос INSERT, добавляю текстовое поле:
1. Если текст латиницей (English), insert работает.
2. Если текст кириллицей - insert не срабатывает.
useCodePage - никак не влияет на ситуацию. Кто-нибудь с таким сталкивался?

P.S. В стандартном примере Zinc та же проблема.

Air_mAn 19.05.2009 17:42

Текст можно записать в ByteArray:
writeUTFBytes
writeMultiByte
Если вставлять ByteArray проблем быть не должно.

EXFlash 19.05.2009 18:41

Я пытался работать с ByteArray, но это не сработало, либо у меня руки кривые :(

Air_mAn 19.05.2009 20:49

Код:

var conn:SQLConnection = new SQLConnection();
conn.open("myDatabase.db");
var sql:String = "INSERT INTO mytable (data) VALUES (:data)";
var bytes:ByteArray = new ByteArray();
bytes.writeMultiByte("Привет!", "utf-8");
var statement:SQLStatement = new SQLStatement();
statement.parameters[":data"] = bytes;
statement.sqlConnection = conn;
statement.execute();

поле data должно быть соответственно BLOB

EXFlash 19.05.2009 23:36

Э... может я не упомянул... я работаю с SQLite и Zinc.

AVS_77 13.08.2009 13:02

В общем с подобной проблемой я тоже сталкнулся, кроме того в SELECT по русским символам типа SELECT с1 FROM t1 WHERE c1 = 'Пётр' тоже не работает , и решение обоих проблем как мне кажется возможно корявым методом транслитерации русских символов из приложения с внесением в БД уже латиницы.
В недавнем случае с которым пришлось заниматься самому, также столкнулся с проблемой отображения кирилических символов хранящихся в БД в UTF-8 или ANSI при использовании стандартных виндовых русских шрифтов типа Arial. Суть проблемы в интерпритации Цинком байтовых последовательностей полученных из БД методом
Код AS3:

str_db =  mdm.Database.SQLite.getField(0, 0);

при передаче в строковую переменную Flash. При хранении в БД в кодировке UTF-8 решил проблему так:
Код AS3:

 
t_task_text.text = f_decode_zinc_to_utf_8(str_db);
 
public function f_decode_zinc_to_utf_8(str_arg:String):String{
                        //Функция перекодирует полученную и неверно интерпретированную Цинком из БД строку
                        //в кодировку utf-8
 
                        var i:Number;
                        var n_str_len:Number;
                        var n_char_code:Number;
                        var ByteStr:ByteArray = new ByteArray();
                        var str_return:String;
                        //посчитать кол-во символов
                        n_str_len = str_arg.length;
                        if (n_str_len == 0){
                                return '';
                                }
                        //порезать на символы
                        //обрабатывать по символьно в байты
                        for (i = 0; i < n_str_len; i++){
                                n_char_code = str_arg.charCodeAt(i);
                                trace(n_char_code);
                                ByteStr.position = i;
                                ByteStr.writeByte(n_char_code);
                        }
 
                        ByteStr.position = 0;
                        str_return = ByteStr.readMultiByte(ByteStr.bytesAvailable,"utf-8");//"utf-8"  x-cp1251
                        return str_return;
                        }

из кода тоже видно что БД можо и и в ANSI хранить только в функции перекодировки использовать str_return = ByteStr.readMultiByte(ByteStr.bytesAvailable,"x-cp1251");

SDA_Grails 18.12.2009 11:32

ребята есть на много проще способ.
у меня все заработало моментально

1. Скачиваем и устанавливаем SQLLite Expert Personal
2. Создаем в нем новую БД в кодировке utf-8
3. Конектимся к базе и выполяем любые DML команды

У вас не будет больше проблем с кодировкой. если будут вопросы пишите помогу

EXFlash 18.12.2009 11:54

Сейчас посмотрел - база в UTF-8. А ты говоришь про AIR или Zinc?

Skyggedans 19.12.2009 16:00

Цинк использует внешнюю клиентскую ДЛЛ-ку sqlite.dll или код для работы со Скулайтом вкомпилен в сам движок, как в AIR?
Если отдельную длл-ку, то можно ее заменить скомпиленной с поддержкой ICU. У меня тоже куча траблов была с украинскими символами в базе - LIKE не работал, сортировка неправильная была. Скомпилил с ICU - все заработало, правда добавилось еще 3 длл-ки, одна из которых весит 15 метров.
Забыл добавить, что я тогда с Python-ом работал, но подход, по сути, универсальный.

EXFlash 19.12.2009 16:22

Zinc использует свою библиотеку mdm_Database.dll, в которую встроен SQLite.
При компиляции все встраивается в один exe-файл.
Но, на крайний случай цинк умеет работать с внешними dll-файлами.


Часовой пояс GMT +4, время: 19:16.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.