Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Длина UNICODE_FSS / 17 сообщений из 17, страница 1 из 1
17.05.2003, 20:24
    #32162368
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Длина UNICODE_FSS
Здравствуйте,

IBExpert, Firebird 1.0:

никак не пойму, как работает unicode в Interbase. Сделал домен:

Код: plaintext
CREATE DOMAIN  "val"  AS VARCHAR( 24 ) CHARACTER SET UNICODE_FSS;


В доступных мне pdfах прочитал, что это длина в символах, байтов же может поле занимать в три раза больше (в зависимости от символа, используется до трех байт на символ). Это я понял так, что используется UTF-8, где для английских букв 1 байт, для русских 2, для китайских 3.

Сделал таблицу, где одно из полей этого домена. Ввожу туда данные (пользуюсь IDExpertом и IBConcolем). И, о чудо, мне удается ввесли ровно 72 буквы, как русские, так и английские! Если я ввожу букву, например, "а" с ударением, то потом оно показывает ее как просто "а". :(

Как можно объяснить такое поведение? Эти клиенты вводят мои буквы в поле в кодировке Win1251, чтоли, поэтому их влазит в 3 раза больше? И если я посмотрю на содержимое поля как на Unicode UTF-8, у меня получится каша?

Спасибо за ответ без букв rtfm! :) К обоим клиентам справка, мягко говоря, бедная, по Firebirdу тоьлко набор pdf, не похожий на те мануалы, к которым я привык.

Ф.
...
Рейтинг: 0 / 0
21.05.2003, 13:46
    #32165054
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Длина UNICODE_FSS
Какой сложный вопрос я задал, никто не знает ответ!

Кто-нибудь пользуется unicodом-то? или это не модно? :-)))
...
Рейтинг: 0 / 0
28.05.2003, 11:20
    #32170418
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Длина UNICODE_FSS
Продолжаю дискуссию с самим собой - как "человек дождя" :)

Почитал здесь рассуждения г-на Вальдерамы (кстати, это не колумбийский футболист случайно?):

A Comparison of SQL Server and InterBase Datatypes and Some Other Issues

Насколько я понял, клиенты подключаются используя чарсет базы (у меня - win1251), может быть, поэтому ibexpert видит все текстовые поля как win1251, хоть и указано, что поля юникод_фсс.

Правда, это написано про ODBC и OLEDB, а ibexpert вроде как говорят, общается с сервером напрямую.

Ну неужели никто ничего не знает??

Ф.

Зы. Вот Вальдерама пишет: For unknown reasons to me, UNICODE in InterBase requires three bytes per character. А я-то знаю, почему! См. The Unicode HOWTO: Introduction , про UTF-8
...
Рейтинг: 0 / 0
31.05.2003, 23:54
    #32173482
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Длина UNICODE_FSS
Рассказываю, кому интересно.

Попробовал войти так называемым Database Pilotом, который с JBuilderом поставляется (программа на Javе). Драйвер JayBird. Урл с указанием кодировки:

Код: plaintext
1.
jdbc:firebirdsql:localhost/ 3050 :C:\Documents and Settings\fedd\Мои
документы\Work\firebird try\UNICODETRY.GDB?lc_ctype=UNICODE_FSS


В таблице одно поле charset unicode_fss. Так вот, если я ввожу в таблицу английские буквы, они в ibexpertе отображаются также, а если русские, то в ibexpertе они превращаются в мусор, который и скопировать сюда страшно.

Правда, второе поле, которое не юникод, а win1251, вобще не удалось заполнить.

Я так понимаю, никто из понтовых знатоков с юникодом не работает, раз никто не поддерживает топик. Единственный совет, который они дают ( здесь ) - это не писать русские буквы из "нормального" ibexpertа в хранимые процедуры: видите ли, interbase хранит их в никому непонятном и не нужном юникоде.

Такие дела.
...
Рейтинг: 0 / 0
02.06.2003, 00:50
    #32173627
noir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Длина UNICODE_FSS
IBExpert с юникодом не работает. Длина поля задаеться, AFAIK не в байтах, а в символах. Байты - это для прикидок размера базы...
...
Рейтинг: 0 / 0
03.06.2003, 18:27
    #32175589
Elias
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Длина UNICODE_FSS
to fedd: Спасибо за познавательную информацию.

to all: А как в кодировке UNICODE_FSS с COLLATE и UPPER? Все ли работает правильно хотя бы для русских букв.
...
Рейтинг: 0 / 0
03.06.2003, 19:39
    #32175655
Elias
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Длина UNICODE_FSS
Кстати нашел вот здесь:

http://community.borland.com/article/0,1410,27217,00.html

что UNICODE_FSS встроено в сам Interbase, правда RDB$COLLATION_ID для него = 0. Это нормально?

Думаю в Firebird так же с UNICODE как и в Interbase 6, для которого написана эта статья.
...
Рейтинг: 0 / 0
03.06.2003, 19:55
    #32175658
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Длина UNICODE_FSS
Я еще не пробовал UPPER, но там же дальше сказано в п. 10, что the default collations for these (ASCII, NONE, OCTETS, and UNICODE_FSS) character sets are also implemented within the engine. Наверно, если есть Collation, то и UPPER будет работать (система знает, что A=а и т.д).

Когда создаешь поле UNICODE_FSS, то можно указать к нему и Collation. Но выбор только из одного пункта - UNICODE_FSS. Для русского языка, надеюсь, это будет работать, если они не поленились настроить для нелатинских языков соответсвие большая/маленькая буква. Надо будет попробовать.

(А вот например в литовском языке, если я правильно ошибаюсь, где Y идет за I, поскольку Collation только один, сортировать будет как у всех остальных западноевропейцев)
...
Рейтинг: 0 / 0
04.06.2003, 12:59
    #32176142
Длина UNICODE_FSS
Привет!

Да, с UNICODE_FSS почти никто не работает.

Прежде всего, потому что клиентские библиотеки странно поддерживают его.
Единственный, кто полностью поддерживает UNICODE, это IBProvider от Коваленко Дмитрия.
Все Дельфевые библиотеки вроде бы работают, но не совсем так, что и было обнаружено уважемым fedd'ом.

Что касается проверок в IBExpert в ГРИДАХ и с помощью приложений на Дельфи, то они маст дай :), потому что дельфевые библиотеки не поддерживают нормально его, как уже было сказано, а IBExpert написан на основе какой-то версии FIBPlus.

Ситуация с ЮНИКОДОМ достаточно подробно описана в главе "Русификация InterBase" в моей книге.

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

Вот пример - берем таблицу в юникодовом чарсете с полем из 10 символов:

Код: plaintext
1.
2.
3.
4.
5.
SET NAMES UNICODE_FSS;


CREATE TABLE UNI (
    V  VARCHAR( 10 )
);


вставляем данные вот так (все видят, что там 13 символов? ):
Код: plaintext
1.
2.
insert into uni (v)
values
('1234567890123');


Выбираем записи и видим:
Код: plaintext
1.
V
 1234567890123 



Вот такие пироги :)

С уважением,
Алексей Ковязин.
...
Рейтинг: 0 / 0
04.06.2003, 13:53
    #32176247
noir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Длина UNICODE_FSS
Юникод в IB нормально поддерживаеться Java, лично с этим работал, глюков не видел. А про длину - интересно...
...
Рейтинг: 0 / 0
04.06.2003, 13:59
    #32176265
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Длина UNICODE_FSS
Алексей, здравствуйте,

вашу книгу купил, но до главы "Русификация" еще не дочитал. Но я понял из pdfов, которые к серверу прилагались, что в CHAR(10) поместятся 30 английских букв и других знаков из ASCII, и догадываюсь, что только 15 русских букв.

Юникод я просто люблю. Я веб-программист, и приходится делать многоязычные сайты. Если использовать юникод, смогу сделать сайт даже на коптском

И делаю все это на Джаве. Вот пока надеюсь, что Джавные драйвера будут умно работать с юникодом (пока мои надежды оправдываются моим маленьким опытом с Database Pilotом из поставки JBuilderа) - по крайней мере с теми буквами, которые передаются 2-мя байтами а не тремя.

Вот когда придется в мои UDF строки поиска на коптском передавать - вот тут мне придется постичь как оно работает до самого конца!
...
Рейтинг: 0 / 0
04.06.2003, 14:50
    #32176358
Elias
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Длина UNICODE_FSS
А кто-нибудь из API на С с UNICODE работал? Как там выставлять у XSQLDA поля sqltype и понимает ли он правильно wchar в поле sqldata или нужно конвертить как-то?

Если есть пример кода, поделитесь, пожалуйста.
...
Рейтинг: 0 / 0
04.06.2003, 19:00
    #32176758
Длина UNICODE_FSS
Привет!

2fedd
Да я и сам на java сейчас работаю. Но от привычек не отказываюсь - win1251. :)

2Elias
Ты имеешь в виду писать непосредственно на IB API? Это само по себе гемор, а как туда юникод прикрутить. возьми уж FreeIBProvider и вперед.

WBR,
Alexey
...
Рейтинг: 0 / 0
04.06.2003, 20:23
    #32176800
Elias
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Длина UNICODE_FSS
2Алексей Ковязин

Спасибо но, разные варианты были рассмотрены и было выбрано написание на С++ на IB API. Так что тут ничего не изменишь.

2All

Собственно, продолжает интересовать вопрос: как?
...
Рейтинг: 0 / 0
04.06.2003, 20:40
    #32176810
noir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Длина UNICODE_FSS
WIN1251 - это здорово, но не тогда, когда в базе лежат данные на нескольких языках сразу, причем в одних и тех же таблицах.
...
Рейтинг: 0 / 0
18.06.2003, 21:20
    #32185985
Elias
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Длина UNICODE_FSS
Собственно, насчет работы с UNICODE в IB API.

Все работает, нужно сделать немного телодвижений:

- при соединении с IB: isc_attach_database() нужно задавать DPB c указанным параметром isc_dpb_lc_ctype со значением UNICODE_FSS, что собственно задает client character set и влияет на transliteration. Если не задать, будет говорить, что не может сделать этот transliteration.
- задавать нужные поля с CHARACTER SET UNICODE_FSS - ну это очевидно
- конвертить из USC2 в UTF8 при передаче строк и обратно при получении. Это самое сложное. Если пишется код под Windows, то можно использовать функции WideCharToMultiByte и MultiByteToWideChar с параметром CodePage=CP_UTF8, если пишется переносимый вариант, то путей множество - каждая уважающая себя библиотека, особенно для работы с инетом, реализует такие функции; или можно взять код на сайте www.unicode.org
...
Рейтинг: 0 / 0
19.06.2003, 18:48
    #32186876
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Длина UNICODE_FSS
Спасибо, Elias,

видимо, тоже самое надо будет делать при написании UDF. Чтобы моя функция разбирала юникодную строку, мне надо будет конвертить ее, например, в двухбайтный char.

Джавный же клиент, если пользоваться JayBirdом, кажется работает корректно, как показал мой опыт (с тем же lc_ctype=UNICODE_FSS)

К сожалению, нет времени мне засесть, когда я дойду до этого, я продолжу топик, и поделимся опытом.

Ф.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Длина UNICODE_FSS / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]