Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 5 из 5
  1. #1
    Аватар для Gressie
    Пользователь

    Статус
    Оффлайн
    Регистрация
    03.05.2013
    Сообщений
    258
    Репутация:
    6 ±

    Кодировка в SQLite

    Здравствуйте. Возможно ли в SQLite делать сохранение русского текста? Пробовал делать стандартную таблицу.
    PHP код:
    CREATE TABLE "my_table" (
        
    "id"    INTEGER PRIMARY KEY AUTOINCREMENT,
        
    "text"    TEXT

    Если английский текст сохраняется и выводится нормально, то русский текст записывается в поле text как BLOB. А выводит текст к примеру, должно быть: "Сообщение" а выводит "яяяСяяяояяяояяябяяящяяяеяяяняяяияяяе"
    Таблицу и базу данных пробовал создавать через DB Browser for sqlite
    Как исправить?
    Последний раз редактировалось Gressie; 16.04.2020 в 08:30.

  2. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Похоже на баг с возвратом строк в функциях SA-MP, некогда писал об этом: https://pro-pawn.ru/showthread.php?1...B8%D1%82%D1%8C
    Код для обхода проблемы приведён в той же теме.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. #3
    Аватар для tnc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Похоже на баг с возвратом строк в функциях SA-MP, некогда писал об этом: https://pro-pawn.ru/showthread.php?1...B8%D1%82%D1%8C
    Код для обхода проблемы приведён в той же теме.
    А разве проблема не в том, что SQLite из коробки не поддерживает windows-1251?

    Судя по документации, то можно установить только utf8/utf16:

    PHP код:
    PRAGMA encoding;
    PRAGMA encoding 'UTF-8';
    PRAGMA encoding 'UTF-16';
    PRAGMA encoding 'UTF-16le';
    PRAGMA encoding 'UTF-16be'

  4. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    А разве проблема не в том, что SQLite из коробки не поддерживает windows-1251?
    Нет, дело не в этом.
    Ок, попробую разжевать ещё раз:
    Цитата Сообщение от Maks5 Посмотреть сообщение
    должно быть: "Сообщение" а выводит "яяяСяяяояяяояяябяяящяяяеяяяняяяияяяе"
    Если присмотреться, это не какая-то каша из рандомных символов, а просто перед каждым символом вставляются 3 лишних буквы "я". Запомним это.
    Как я уже упоминал в статье по ссылке выше, во многих функциях SA-MP присутствует баг с записью строк в переданный массив: символы по ошибке конвертируются в int32_t (на самом деле в исходниках этот тип называется "cell", но он является производным от int32_t) не из unsigned char, а из обычного char, т.е. с расширением знакового бита, из-за чего у всех символов с кодом больше 127 (0x7F) старшие 3 байта устанавливаются в FF (т.е. 0x7F после преобразования становится 0x0000007F, но 0x80 => 0xFFFFFF80). Если получившуюся "неправильную" строку подать в SendClientMessage(), ShowPlayerDialog() или любую другую функцию SA-MP (кроме printf() или format()), сервер примет такую строку за упакованную (т.к. в обычной неупакованной строке старшие биты символов равны нулю) и интерпретирует старшие байты, по ошибке установленные в FF, как отдельные символы. Код "FF" имеет символ кириллицы "я" - именно так и появляются те самые 3 лишних "я" перед каждой буквой в строке.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. #5
    Аватар для tnc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    Я все же решил проверить. Проблема остается и после фикса:

    PHP код:
    before the fix
    i
    0    dec209      hex 000000D1
    i
    1    dec128      hex 00000080
    i
    2    dec209      hex 000000D1
    i
    3    dec131      hex 00000083
    i
    4    dec209      hex 000000D1
    i
    5    dec129      hex 00000081
    i
    6    dec32       hex 00000020
    i
    7    dec209      hex 000000D1
    i
    8    dec143      hex 0000008F
    i
    9    dec208      hex 000000D0
    i
    10   dec183      hex 000000B7
    i
    11   dec209      hex 000000D1
    i
    12   dec139      hex 0000008B
    i
    13   dec208      hex 000000D0
    i
    14   dec186      hex 000000BA
    i
    15   dec33       hex 00000021
    after the fix
    i
    0    dec209      hex 000000D1
    i
    1    dec128      hex 00000080
    i
    2    dec209      hex 000000D1
    i
    3    dec131      hex 00000083
    i
    4    dec209      hex 000000D1
    i
    5    dec129      hex 00000081
    i
    6    dec32       hex 00000020
    i
    7    dec209      hex 000000D1
    i
    8    dec143      hex 0000008F
    i
    9    dec208      hex 000000D0
    i
    10   dec183      hex 000000B7
    i
    11   dec209      hex 000000D1
    i
    12   dec139      hex 0000008B
    i
    13   dec208      hex 000000D0
    i
    14   dec186      hex 000000BA
    i
    15   dec33       hex 00000021
    reason
    С_С_С_ С_Р·С<Рє
    Код:
    1. printf("before the fix");
    2. for (new i = 0, len = strlen(reason); i < len; i++)
    3. {
    4. printf("i: %d \t| dec: %d \t| hex %08x", i, reason[i], reason[i]);
    5. }
    6. FixSVarString(reason);
    7. printf("after the fix");
    8. for (new i = 0, len = strlen(reason); i < len; i++)
    9. {
    10. printf("i: %d \t| dec: %d \t| hex %08x", i, reason[i], reason[i]);
    11. }


    Извиняюсь, что не переименовал функцию, но это было ради теста. reason - загружается из базы данных. Возможно топикастер указал рандомный набор, а не вывод от printf и подобных функции для IO?

    P.S: если чего, то я не пытаюсь спорить, а просто решил проверить.

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •