Что нового

[Данные, строки] SQLite версии AutoIt до 3.0.0.0

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Написал сюда, хотя не баг а скорее проблема.

Есть старый проект написанный еще на Autoit 3.0, он пишет данные в базу SQLite через соответствующий UDF.
Решил обновить проект под новый AutoIt, и вот проблема - старый UDF пишет и читает данные из базы в формате ANSI, а новый исключительно в UTF-8. То есть русский текст выдается пустыми квадратами :(
Проблема именно в хранение данных, а не в выдаче - открывал файл SQLite Expetro-м, он видит в разных строках разные кодировки.

Варианты решения:
1. Использовать старый UDF(прилагается), но новый работает во много раз быстрее(при выборке 200 строк ANSI тратит 15сек, а UTF 0.3сек !!!)
2. Написал скрипт он берет таблицу и каждую ячейку (если она не соответствует UTF-8), конвертирует в UTF-8, а потом целиком заносит обратно в базу. Опять же с большой базой работает медленно.
Код:
#include <SQLite_ANSI.au3>
Global $hBase = '1.db', $hTable = 'table'
_SQLite_Startup()
_SQLite_Open($hBase)
Dim $aResult, $iRows, $iColumns
_SQLite_GetTable2d(-1, "SELECT * FROM " & $hTable & ";", $aResult, $iRows, $iColumns)
For $j = 1 To UBound($aResult) - 1
	For $i = 0 To UBound($aResult, 2) - 1
		If Not _Encoding_IsUTF8Format($aResult[$j][$i]) Then $aResult[$j][$i] = BinaryToString(StringToBinary($aResult[$j][$i], 4))
	Next
Next
_SQLite_Exec(-1, 'BEGIN;')
_SQLite_Exec(-1, 'DELETE FROM ' & $hTable & ';')
For $j = 1 To UBound($aResult) - 1
	$sSQL = "INSERT INTO " & $hTable & " VALUES ("
	For $i = 0 To UBound($aResult, 2) - 1
		$sSQL &= "'" & $aResult[$j][$i] & "',"
	Next
	$sSQL = StringTrimRight($sSQL, 1) & ');'
	_SQLite_Exec(-1, $sSQL)
Next
_SQLite_Exec(-1, 'COMMIT;')
_SQLite_Exec(-1, 'VACUUM;')
_SQLite_Shutdown()
Func _Encoding_IsUTF8Format($sText)
	Local $iAsc, $iExt, $iLen = StringLen($sText)
	For $i = 1 To $iLen
		$iAsc = Asc(StringMid($sText, $i, 1))
		If Not BitAND($iAsc, 0x80) Then
			ContinueLoop
		ElseIf Not BitXOR(BitAND($iAsc, 0xE0), 0xC0) Then
			$iExt = 1
		ElseIf Not (BitXOR(BitAND($iAsc, 0xF0), 0xE0)) Then
			$iExt = 2
		ElseIf Not BitXOR(BitAND($iAsc, 0xF8), 0xF0) Then
			$iExt = 3
		Else
			Return False
		EndIf
		If $i + $iExt > $iLen Then Return False
		For $j = $i + 1 To $i + $iExt
			$iAsc = Asc(StringMid($sText, $j, 1))
			If BitXOR(BitAND($iAsc, 0xC0), 0x80) Then Return False
		Next
		$i += $iExt
	Next
	Return True
EndFunc   ;==>_Encoding_IsUTF8Format
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Почему же в этот раздел? Это же не баг.
Можно попробовать перекодировать прочитанные денные с помощью Encoding UDF.
 
Автор
Redline

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
`p r o x y
А куда нужно было? Может быть в полезняшки? Думаю это все же баг несовместимости версий, но спорить не буду :smile:
`p r o x y [?]
Можно попробовать перекодировать прочитанные денные с помощью Encoding UDF.

В том то и дело что выдаваемые данные не поддаются перекодировке. В новой версии SQLite(UTF) на выходе вместо русских букв знаки вопроса:
Код:
  id  name            
 1   ????? - giraffe 
 1   жираф - giraffe
Первая строка вставлена старым ANSI, вторая UTF.
Ну и для примера - выдача этих же данных старым ANSI:
Код:
 id  name                 
 1   жираф - giraffe      
 1   жираф - giraffe
Тут преобразовать можно без проблем - это и делается в варианте №2 с помощью двух функций Encoding UTF ;)
 

camboja

Новичок
Сообщения
1
Репутация
0
Здравствуйте!

Помогите, пожалуйста, разобраться!

В базе SQLite данные написаны на русском языке в кодировке ANSI. Это выяснилось после открытия базы в SQLite Expert Personal: в настройках пришлось выставить "Default ANSI code page", иначе вся информация на русском отображалась как ������.

Далее при попытке считать данные в AutoIt и вывести их отображаются вопросительные знаки.
Пробовал юзать функции из Encoding.au3, но результата нет.

Возможно, нужно открыть базу как ANSI, ведь по умолчанию она открывается в UTF8?

Как правильно получить русский текст из базы?
Буду признателен за помощь.

Заранее спасибо!
 
Верх