LINUX.ORG.RU

sqlite под linux


0

1

Есть достаточно крупный проект на С++&boost в качестве ядра системы и С++&Qt для интерфейсной части. Ядро работае с sqlite базой через amalgamation. Пытаюсь портировать его на Linux (Suse 10.3, linux: 2.6.34.7). Проблема в том, что wrapper sqlite предоставляет только utf8 и utf16 варианты своих функций, а при компиляции в linux символьные переменные составляют 4 байта и содержат UTF32 кодировку. Вопросы такие:

Есть ли альтернативы постоянной конвертации UTF32 - UTF16?

Какая все-таки кодировка обычно используется в linux & gcc? UTF32? UTF32be?

Есть ли шанс реализовав конвертацию UTF32 - UTF16 под сусе столкнуться с необходимостью исправлять декодыры при сборке приложения, скажем на gentoo?

И последний (риторический). Какого «„“ разработчики sqlite не позаботились об linux сообществе?


UTF-32!!!!!! UTF-512 - галактические масштабы )

Jetty ★★★★★
()

> Есть ли альтернативы постоянной конвертации UTF32 - UTF16?

конвертировать надо в кодировку самой БД, чтоб избежать дополнительной конвертации UTF16-UTF8

Какого «„“ разработчики sqlite не позаботились об linux сообществе?


тролль? UTF8 - это норма, а то что в винде wchar_t два байта - так это именно мс-цы козлы сделали не как у всех, на всех более-менее популярных ОС wchar_t это UTF32, а в винде решили сэкономить на байтах

aho
()
Ответ на: комментарий от Divius

>Честно говоря, встречался в случае С++&Qt только с UTF-8...

Вот и я думаю, может у ТС просто с локалью беда

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

<libastral=«on»>
у ТС-а на руках вендовая программа, написанная в терминах wchar. И задача портировать её на этот ваш линакс.
</libastral>

Manhunt ★★★★★
()
Ответ на: комментарий от yoghurt

> wchar_t разве не 2 байта?

wchar_t по стандарту должен вмещать все возможные символы, UTF32 этому соответствует и используется в линуксе, маке, солярисе и т.д., UTF16 этому не соответствует, но все-равно был выбран M$

aho
()
Ответ на: комментарий от aho

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

mashina ★★★★★
()
Ответ на: комментарий от mashina

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

Type wchar_t is a distinct type whose values can represent distinct codes for all members of the largest extended
character set specified among the supported locales

но да - если ОС не поддерживает всякие разные локали, то ей и одного байта хватит

aho
()
Ответ на: комментарий от mashina

> wchar_t по стандарту может быть от 1го байта и выше (на выбор компилятора)

В iso/iec 14882, раздел 3.9.1, абзац 5, сказано, что wchar_t обязан вмещать себя значения самого большого расширенного чарсета среди всех поддерживаемых локалей. Поэтому, если компилятор поддерживает китайский Unicode, wchar_t по стандарту не может быть ни 8-битным, ни 16-битным.

Manhunt ★★★★★
()
Ответ на: комментарий от aho

> конвертировать надо в кодировку самой БД, чтоб избежать дополнительной конвертации UTF16-UTF8

т.е. sqlite всегда хранит данные в UTF8?

Fess
() автор топика
Ответ на: комментарий от Fess

> Боюсь, при этом потребуется кастомная сборка еще каких-нибудь системных библиотек..

Теоретически - да. Та же glibc предоставляет груду функций для работы с wchar_t. Вопрос в том, действительно ли эти функции вызваются из вашей программы?

Manhunt ★★★★★
()

Проблема решена конвертацией UTF32 <-> UTF16. Как оказалось, QString так же хранит данные в UTF16 на всех платформах, что позволяет без дополнительных расходов сделалать так: wstring(UTF32) -> QString(UTF16) -> UTF16*, воспользовавшись встроенными декодерами QString.

Всем сочувствовавшим спасибо. Manhunt, отдельный респект :)

Тема закрыта.

Fess
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.