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, а потом целиком заносит обратно в базу. Опять же с большой базой работает медленно.
Есть старый проект написанный еще на 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