SQLite3 хранит нечитаемый текст - PullRequest
1 голос
/ 23 октября 2011

Я использовал SQLite3 для реализации небольшого приложения для чтения или записи в базу данных. Некоторые записи, которые необходимо добавить в базу данных, являются арабскими текстами, и когда они сохраняются в базе данных, они преобразуются в нечитаемые и непонятные тексты. Я использую эти API для записи и чтения:

  • sqlite3_open
  • sqlite3_prepare
  • sqlite3_bind_text
  • sqlite3_step

Что я могу сделать, чтобы решить проблему?

1 Ответ

1 голос
/ 23 октября 2011

Скорее всего, ваш текст не в кодировке ASCII. Например, в юникоде.

Это потому, что в таблице ASCII есть только символы, представленные целыми числами от 0 до 127. Таким образом, ничто не может быть использовано для представления арабских букв. Например, Unicode использует пять различных диапазонов для представления арабского языка:

  • Арабский (0600—06FF, 224 знака)
  • Дополнение на арабском языке (0750—077F, 48 знаков)
  • Формы представления арабского языка-A (FB50 — FDFF, 608 символов)
  • Формы представления арабского языка-B (FE70 — FEFF, 140 знаков)
  • Цифровые символы Руми (10E60—10E7F, 31 знак)

И так как может быть больше букв / символов, которые допустимо для 8-битного значения (тип char, длина которого составляет 1 байт), широкий символ используется для представления некоторых (или даже всех) этих букв .

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

В тех подпрограммах, которые имеют четвертый аргумент, его значением является число байтов в параметре. Чтобы было понятно: значение является числом байты в значении, а не количество символов. Если четвертый параметр отрицателен, длина строки - число байтов до первого нулевого терминатора.

Убедитесь, что вы поступили правильно.

Смотри также:

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...