Автор Тема: Какая кодировка у BB документов?  (Прочитано 44819 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Какая кодировка у BB документов?
« Ответ #75 : Декабрь 22, 2012, 10:23:29 am »
в таком случае я иду дальше.. меня больше волнует вопрос - нахрена это делать(разбирать это произведение)?

Тык just for fun же  :D

У меня лично с детства непреодолимая тяга "разобрать", "заглянуть внутрь" и "понять".

DIzer

  • Гость
Re: Какая кодировка у BB документов?
« Ответ #76 : Декабрь 22, 2012, 10:46:03 am »
типа зуда упомянутого  Kemet\ом?

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Какая кодировка у BB документов?
« Ответ #77 : Декабрь 22, 2012, 02:04:49 pm »
Цитировать
    fw.WriteByte(SHORT(SHORT(ORD(ch) DIV 256 - 128)));
Операция DIV возвращает значение от 0 до 255 типа INTEGER.
Вот же блин...  :-[
По смыслу здесь должно стоять MOD, а не DIV, вот я MOD и вижу (не веря своим глазам).  :)
Прошу извинить. Значение от 0 до 255 возвращает конечно же операция x MOD 256.

Выражение ORD(ch) DIV 256   всегда гарантированно возвращает значение 0 при любом ch.
Это ошибка в коде?  ;)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Какая кодировка у BB документов?
« Ответ #78 : Декабрь 22, 2012, 02:12:11 pm »
Цитировать
    fw.WriteByte(SHORT(SHORT(ORD(ch) DIV 256 - 128)));
Операция DIV возвращает значение от 0 до 255 типа INTEGER.
Вот же блин...  :-[
По смыслу здесь должно стоять MOD, а не DIV, вот я MOD и вижу (не веря своим глазам).  :)
Прошу извинить. Значение от 0 до 255 возвращает конечно же операция x MOD 256.

Выражение ORD(ch) DIV 256   всегда гарантированно возвращает значение 0 при любом ch.
Это ошибка в коде?  ;)
У них же char 16-битный, так что может быть больше 256...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Какая кодировка у BB документов?
« Ответ #79 : Декабрь 22, 2012, 02:34:28 pm »
У них же char 16-битный, так что может быть больше 256...
Они изменили язык? Нового репорта я пока ещё не видел (но правда и не сильно искал).

На всякий случай, цитата из репорта 2001 года:
Цитировать
2. CHAR символы расширенного набора ASCII (0X .. 0FFX)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Какая кодировка у BB документов?
« Ответ #80 : Декабрь 22, 2012, 02:40:26 pm »
У меня в BB 1.6:
Цитировать
2.   SHORTCHAR   литеры набора Latin‘1 (0X .. 0FFX)
3.   CHAR   литеры набора Unicode (0X .. 0FFFFX)

ps DIV 256 - это замена SHR 8 в данном случае

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Какая кодировка у BB документов?
« Ответ #81 : Декабрь 22, 2012, 02:52:32 pm »
На всякий случай, цитата из репорта 2001 года:
Цитировать
2. CHAR символы расширенного набора ASCII (0X .. 0FFX)
Эх, не правильная цитата. По ошибке не тот документ открыл.  :-[
ilovb прав. И КП с 2001 года не менялся (по крайней мере в этой части).

Вообще, я сейчас использую в основном Оберон-2 (даже не 7 или 11). Какие-то тонкости КП уже начал подзабывать.  :-\

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Какая кодировка у BB документов?
« Ответ #82 : Декабрь 25, 2012, 07:56:40 am »
Однако тут какое-то хитрожопое кодирование целых чисел.

Опять же в компайлере юзаются:
    (* utf8 strings *)
   
    PROCEDURE PutUtf8* (VAR str: ARRAY OF SHORTCHAR; val: INTEGER; VAR idx: INTEGER);
    BEGIN
        ASSERT((val >= 0) & (val < 65536));
        IF val < 128 THEN
            str[idx] := SHORT(CHR(val)); INC(idx)
        ELSIF val < 2048 THEN
            str[idx] := SHORT(CHR(val DIV 64 + 192)); INC(idx);
            str[idx] := SHORT(CHR(val MOD 64 + 128)); INC(idx)
        ELSE
            str[idx] := SHORT(CHR(val DIV 4096 + 224)); INC(idx);
            str[idx] := SHORT(CHR(val DIV 64 MOD 64 + 128)); INC(idx);
            str[idx] := SHORT(CHR(val MOD 64 + 128)); INC(idx)
        END
    END PutUtf8;
   
    PROCEDURE GetUtf8* (VAR str: ARRAY OF SHORTCHAR; VAR val, idx: INTEGER);
        VAR ch: SHORTCHAR;
    BEGIN
        ch := str[idx]; INC(idx);
        IF ch < 80X THEN
            val := ORD(ch)
        ELSIF ch < 0E0X THEN
            val := ORD(ch) - 192;
            ch := str[idx]; INC(idx); val := val * 64 + ORD(ch) - 128
        ELSE
            val := ORD(ch) - 224;
            ch := str[idx]; INC(idx); val := val * 64 + ORD(ch) - 128;
            ch := str[idx]; INC(idx); val := val * 64 + ORD(ch) - 128
        END
    END GetUtf8;

Ничего не понимаю...
Может быть уже всё понятно, но вот эта ссылка очень наглядно поясняет код
http://ru.wikipedia.org/wiki/UTF-8  (смотреть цветные картинки там, где  Принцип кодирования)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Какая кодировка у BB документов?
« Ответ #83 : Декабрь 25, 2012, 08:01:48 am »
С пониманием этого кода проблем не было  :)

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Какая кодировка у BB документов?
« Ответ #84 : Декабрь 25, 2012, 08:08:43 am »
С пониманием этого кода проблем не было  :)
Значит я не въехал в фразу "ничего не понимаю" :)
Тогда , наверное,  опять не к месту, по поводу 128.
Как я понял двухбайтные чары маркируются 1 в самом старшем разряде вот и вычитание/прибавление 128.
Единственная засада в том, что тогда надо исключить использование уникодов из диапазона 8000-8FFF

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Какая кодировка у BB документов?
« Ответ #85 : Декабрь 25, 2012, 08:21:24 am »
В данной теме и в следующей:
http://oberspace.dyndns.org/index.php/topic,408.0.html
уже во всем разобрались.

-128 позволяет избавиться от переполнения.

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Какая кодировка у BB документов?
« Ответ #86 : Декабрь 25, 2012, 08:25:08 am »
В данной теме и в следующей:
http://oberspace.dyndns.org/index.php/topic,408.0.html
уже во всем разобрались.

-128 позволяет избавиться от переполнения.
Пока остаюсь при своём мнении без переполнения :)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Какая кодировка у BB документов?
« Ответ #87 : Декабрь 25, 2012, 08:42:26 am »
Переполнение возникает, при такой картине:
0000 0000 - 0000 0000 - 0000 0000 - 1000 0000
Если взять только один младший байт, то он равен -128
Но значение INTEGER = 128
Следовательно будет переполнение, т.к. SHORT делает индентичное преобразование. Т.е. INTEGER должен быть равен по значению BYTE.
Если контроль переполнения выключен, то проблемы нет, и INTEGER просто обрезается до BYTE (128 --> -128)
В противном случае вылетает исключение.

Переполнение возникает на диапазоне от:
0000 0000 - 0000 0000 - 0000 0000 - 1000 0000 = 128 (-128)
до:
0000 0000 - 0000 0000 - 0000 0000 - 1111 1111 = 255 (-1)

Не сложно догадаться, что достаточно вычесть 128 чтобы попасть в диапазон BYTE:
128 - 128 = 0
255 - 128 = 127

Значение смещается, но его можно восстановить прибавлением этих 128 при чтении.

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Какая кодировка у BB документов?
« Ответ #88 : Декабрь 25, 2012, 09:39:52 am »
Как я понял двухбайтные чары маркируются 1 в самом старшем разряде вот и вычитание/прибавление 128.
Единственная засада в том, что тогда надо исключить использование уникодов из диапазона 8000-8FFF
Как я не правильно понял  :(
Но начсчёт переполнения или "переполнения" надо ещё на досуге почитать ленгвидж репорт и подумать над кодом.
Но явно этот код помогает решить проблемы в другом месте (при чтении?) :
fw.WriteByte(SHORT(SHORT(ORD(ch))));
fw.WriteByte(SHORT(SHORT(ORD(ch) DIV 256 - 128)));

Нет же проблем "переполнения" в первой строке

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Какая кодировка у BB документов?
« Ответ #89 : Декабрь 25, 2012, 10:03:08 am »
Проверка переполнения отключена по дефолту.
Включить можно так:
^Q DevCompiler.CompileThis Test+

ps Про первую строку Игорь уже говорил что они лохонулись :)
« Последнее редактирование: Декабрь 25, 2012, 10:05:32 am от ilovb »