Важная информация
Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 23

Тема: Ох уж эти кодировки...

  1. #1 Ох уж эти кодировки... 
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,950
    Сказал(а) спасибо
    1,847
    Поблагодарили 992 раз(а) в 850 сообщениях
    Записей в блоге
    1


    До сих пор героически борюсь с кодировками в FB... Ох наваяли, ух накосячили разрабы, это вызывает
    только дичайшую печаль. Рано или поздно, конечно, я напишу все эти функции преобразования туда,
    сюда, но сколько же гемора людям на ровном месте. Ну вот элементарно - строку пути к файлу надо
    вбивать на ANSI 1251, однако процедуры печати удобнее делать для CP 866, реально удобнее и
    получается гениальная дилема, если FBEdit с плагом, который распознаёт 866-ю кодировку, то он
    преобразует ВСЁ в CP866, причём таким макаром, что обратно это уже не преобразуется и соотв. пути
    к файлам не прописываются. Без плага естессно мы остаёмся без расширенного 866-го ASCII, хотя и
    побайтовая совместимость сохраняется. Чёрт возьми, если бы это зависело только от меня, да расплюнуть
    написать свой текстовый редактор, НО,,, НО,,, функции работы с файлами(да и не только) жрут только
    1251, в котором я мягко говоря - ласосич... За что ж мне такое наказание. И ведь только оседлал можно
    сказать OpenGL и тут такое. Когда же разработчики придут к одному стандарту, к одной единственной
    кодировке, задокументируют её, каждый байтик, чтобы было видно что и где, чтобы работа в среде
    была удобной, а не дёргаться в BRED по каждому чиху для смены кодировки + потом не видеть, что
    написано в итоге. Ведь со времён DOS'а ещё "крякозябры" эти лезут и никак не поборятся до сих пор.
    Грустно блин - столько костылей из-за этого, костыли блин толстые, мать их, много перфоманса жрут.

    Вообщем, по мере этой, воистину героической борьбы с кодировками буду выкладывать код для юза.
    Аминь!
    Последний раз редактировалось >Quiet Snow<; 12.10.2013 в 09:14.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  2. #2  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,950
    Сказал(а) спасибо
    1,847
    Поблагодарили 992 раз(а) в 850 сообщениях
    Записей в блоге
    1


    Кхм кхм, буду краток: половину косяка пролечили... костылём, но хоть так:

    Код freebasic:
      DECLARE SUB PrepareTextConvert ()
     DIM SHARED TexCnvr(255) AS UINTEGER, CrTexCnv(1) AS ZSTRING * 2
     PrepareTextConvert ()
     
    '  Заворачиваем это в цикл печати буковок текста и усё...
    '  Знаю что Mid небыстр, но структуру строкового буфера FB ещё не освоил.
     
      Bukv = TexCnvr(ASC(MID$(Nadpis, iFPr, 1)))
     
    '
    '  Готовим реал тайм конвертаж для функции печати
    '
     SUB PrepareTextConvert ()
     DIM i AS INTEGER
        FOR i = 0 TO 255
           CrTexCnv(0) = CHR$(i)
           CHARTOOEM (@CrTexCnv(0), @CrTexCnv(1))
           TexCnvr(i) = ASC(CrTexCnv(1))
        NEXT
     END SUB

    Смысл в том, что оставляем свои исходники в ANSI, видно будет в FBEdit что напечатали, в функциях
    смело пишем русским, а текст выводим через костылятину(одна подмена массивом не так сильно
    затормаживает). Плагин CP1251ToCP866.dll выключаем в настройки —> менеджер плагинов.
    Последний раз редактировалось >Quiet Snow<; 19.10.2013 в 16:40.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  3. #3  
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    787
    Сказал(а) спасибо
    327
    Поблагодарили 350 раз(а) в 277 сообщениях
    Записей в блоге
    6
    Леха! Да нет никаких проблем. Используй если нравится OEM для вывода печати простых строк, а для путей к файлам кодируй в ANSI 1251 (там скорость не критична). Для перевода из ANSI в OEM можно использовать свою процедуру (где-то я выкладывал на форуме) или что еще проще использовать WINAPI OemToChar (все кодирование одной строкой )
    Ответить с цитированием  
     

  4. Пользователь сказал cпасибо:

    >Quiet Snow< (12.10.2013)

  5. #4  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,950
    Сказал(а) спасибо
    1,847
    Поблагодарили 992 раз(а) в 850 сообщениях
    Записей в блоге
    1
    Стас, я пытаюсь понять и осознать всю глубину проблемы, меня интересует один единственный вопрос,
    почему разработчики не сделали работу с файлами и другими ф-циями FB в расш. формате ASCII?
    Т.е. я веду к тому, что этому были какие-то причины(все видели наверное имена файлов с китайскими
    иероглифами), ну не такие же они ласоси, что просто так не сделали. Тут где-то подвох. И кроется
    он боюсь глубже, вот знаю я, что буду писать нерекурсивный скан директории и тут же понимаю, что
    в Германии и других странах моя прога работать не будет, подсознательно чую. Поэтому как бы я не
    желал использовать твой вариант(а я желаю, т.к. FBEdit не всем меня удовлетворяет) это создаст мне
    лишь ещё большие проблемы. Можно конечно попробовать, но это будет путь в неизвестность, типа
    заработает ли, не заработает.

    Короче мысли очень печальные и скорее всего, пока останусь на варианте поста #2, а в будущем более
    основательно изучу CP1251 и накатаю редактор уже под него. Не знаю, не радует меня эта кодировка
    т.к. уже привык к наличию псевдографики, с ней удобнее оформлять код да и вообще CP866 более
    логичная(не во всём, но в целом).
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  6. #5  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,950
    Сказал(а) спасибо
    1,847
    Поблагодарили 992 раз(а) в 850 сообщениях
    Записей в блоге
    1
    Во чё нагородил квитик(умолчу как делал, смотрите на коня и поймёте):

    Бедное животное


    Код freebasic:
     '________________________________
     '
     '  Таблица преобразования
     '  английского ASCII в русский
     '________________________________
     '
     SUB InitRusInkey (KbdVariant)
     DIM LdKK AS UINTEGER
         FOR LdKK = 0 TO 255
            KeyConv(LdKK) = LdKK
         NEXT
       KeyConv(113) = 169  ' й
       KeyConv(119) = 230  ' ц
       KeyConv(101) = 227  ' у
       KeyConv(114) = 170  ' к
       KeyConv(116) = 165  ' е
       KeyConv(121) = 173  ' н
       KeyConv(117) = 163  ' г
       KeyConv(105) = 232  ' ш
       KeyConv(111) = 233  ' щ
       KeyConv(112) = 167  ' з
       KeyConv(91) = 229   ' х
       KeyConv(93) = 234   ' ъ
       KeyConv(81) = 137   ' Й
       KeyConv(87) = 150   ' Ц
       KeyConv(69) = 147   ' У
       KeyConv(82) = 138   ' К
       KeyConv(84) = 133   ' Е
       KeyConv(89) = 141   ' Н
       KeyConv(85) = 131   ' Г
       KeyConv(73) = 152   ' Ш
       KeyConv(79) = 153   ' Щ
       KeyConv(80) = 135   ' З
       KeyConv(123) = 149  ' Х
       KeyConv(125) = 154  ' Ъ
       KeyConv(97) = 228   ' ф
       KeyConv(115) = 235  ' ы
       KeyConv(100) = 162  ' в
       KeyConv(102) = 160  ' а
       KeyConv(103) = 175  ' п
       KeyConv(104) = 224  ' р
       KeyConv(106) = 174  ' о
       KeyConv(107) = 171  ' л
       KeyConv(108) = 164  ' д
       KeyConv(59) = 166   ' ж
       KeyConv(39) = 237   ' э
       KeyConv(65) = 148   ' Ф
       KeyConv(83) = 155   ' Ы
       KeyConv(68) = 130   ' В
       KeyConv(70) = 128   ' А
       KeyConv(71) = 143   ' П
       KeyConv(72) = 144   ' Р
       KeyConv(74) = 142   ' О
       KeyConv(75) = 139   ' Л
       KeyConv(76) = 132   ' Д
       KeyConv(58) = 134   ' Ж
       KeyConv(34) = 157   ' Э
       KeyConv(122) = 239  ' я
       KeyConv(120) = 231  ' ч
       KeyConv(99) = 225   ' с
       KeyConv(118) = 172  ' м
       KeyConv(98) = 168   ' и
       KeyConv(110) = 226  ' т
       KeyConv(109) = 236  ' ь
       KeyConv(44) = 161   ' б
       KeyConv(46) = 238   ' ю
       KeyConv(47) = 241   ' ё
       KeyConv(90) = 159   ' Я
       KeyConv(88) = 151   ' Ч
       KeyConv(67) = 145   ' С
       KeyConv(86) = 140   ' М
       KeyConv(66) = 136   ' И
       KeyConv(78) = 146   ' Т
       KeyConv(77) = 156   ' Ь
       KeyConv(60) = 129   ' Б
       KeyConv(62) = 158   ' Ю
       KeyConv(47) = 46    ' .
       KeyConv(63) = 44    ' ,
       KeyConv(126) = 240  ' Ё
       KeyConv(96) = 241   ' ё
       IF KbdVariant = 1 THEN     ' Старый вариант
         KeyConv(64) = 34    ' "
         KeyConv(35) = 58    ' :
         KeyConv(36) = 47    ' /
         KeyConv(94) = 44    ' ,
         KeyConv(38) = 46    ' .
       ELSEIF KbdVariant = 2 THEN ' Новый вариант
         KeyConv(64) = 34    ' "
         KeyConv(35) = 252   ' №
         KeyConv(36) = 59    ' ;
         KeyConv(94) = 58    ' :
         KeyConv(38) = 63    ' ?
       END IF
     END SUB

    Быдлокод решает
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  7. #6  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,950
    Сказал(а) спасибо
    1,847
    Поблагодарили 992 раз(а) в 850 сообщениях
    Записей в блоге
    1
    То же переключение раскладок... у них на англоязычной винде нормально и наплевать.
    В моей текущей библе которую понемногу подпиливаю пока сделал так

    Код freebasic:
      '___   Клавиатура   ___
        Kb$ = INKEY$
     
      '   Контроль перевода языка
        LShift = MULTIKEY(42): AltKey = MULTIKEY(56)
        IF LShift AND AltKey THEN LngChange = -1
        IF LngChange AND (NOT LShift OR NOT AltKey) THEN 
          LngChange = 0
          TekLang = (TekLang + 1) AND 1
        END IF
      '   Если не английская - возвращаем на английский
        IF GetKeyboardLayout(0) <> 67699721 THEN
          ActivateKeyboardLayout(CAST(HKL, HKL_NEXT), KLF_SETFORPROCESS)
        END IF
      '   Преобразуем в русский по таблице
        IF TekLang = 1 THEN IF LEN(Kb$) = 1 THEN Kb$ = CHR$(KeyConv(ASC(Kb$)))

    Это чтобы хоть как-то можно было работать.
    LngChange и TekLang глобалки, KeyConv(255) глоб. массив на 256 элементов, чем заполняется показано в
    предыдущем сообщении...
    Последний раз редактировалось >Quiet Snow<; 19.10.2013 в 19:07.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  8. #7  
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    787
    Сказал(а) спасибо
    327
    Поблагодарили 350 раз(а) в 277 сообщениях
    Записей в блоге
    6
    Леха, я ранее думал о такой реализации. Тебе Inkey нужен для получения ввода букв (в том числе русских)? На мой взгляд, ловить клавиши лучше с помощью ScreenEvent, там независимо от раскладки, они ловятся. Коротко:

    Код :
    If (ScreenEvent(@e)) Then
            Select Case e.type
            Case EVENT_KEY_PRESS
                If (e.ascii > 0) Then
                    Print "'" & e.ascii & "'"; ' это место заменит функцию Inkey, при том с отловом кода русских клавиш. Единственно добавишь CHR , при нужном шрифте возвратит русскую букву. Но в любом случае ASCII код возвращается верный. 
                Else
                    Print "unknown key";
                End If
                Print " was pressed (scancode " & e.scancode & ")" ' Здесь сканкод клавиши
            End Select     
    EndIf
    У человека вообще могут быть другие сочетания клавиш для переключения раскладки и тогда твой метод с отловом ALT-SHIFT не пролезет. Лучше наверно вставлять в программу что-то типа своего переключателя в какой нибудь месте графического окна (что-то типа кнопки). Кстати лет 8-10 назад я купил игру от акеллы, так там не мог ввести лицензионный код из-за того, что у меня по умолчанию стояла русская раскладка и переключить ее тоже не мог, приходилось залезать в настройки системы и ставить по умолчанию английскую раскладку...
    Возможно есть какие-то функции для определения глобальных сочетаний клавиш , но я не встречал. Может эта инфа есть в реестре...
    Ответить с цитированием  
     

  9. Пользователь сказал cпасибо:

    >Quiet Snow< (20.10.2013)

  10. #8  
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    787
    Сказал(а) спасибо
    327
    Поблагодарили 350 раз(а) в 277 сообщениях
    Записей в блоге
    6
    Точно! Вся инфа о переключении клавиш раскладок хранится в разделе реестра:

    HKEY_CURRENT_USER\Keyboard Layout\Toggle

    То есть если раздел пустой (по умолчанию), то используются SHIFT+ALT, в остальных случаях надо проверять каждое сочетание
    Ответить с цитированием  
     

  11. Пользователь сказал cпасибо:

    >Quiet Snow< (20.10.2013)

  12. #9  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,950
    Сказал(а) спасибо
    1,847
    Поблагодарили 992 раз(а) в 850 сообщениях
    Записей в блоге
    1
    Во кстати да, через эвент можно, я всё равно его юзаю, чтобы события от окна отслеживать.
    И ведь видел, что там в структуре есть ASCII и сканкод, но не удосужился проверить, сам видишь
    меня пока носом не ткнёшь изобретаю всякую фигню.
    Касательно переключения, люди обычно ставят либо ALT-SHIFT либо CTRL+SHIFT, поэтому решил
    не мудрить, кнопочку сделать - да можно, учту такой вариант. Кстати переключение раскладки
    хочу сделать весьма забавно, чтобы по центру высвечивалась пропадающая надпись с названием
    раскладки, или ещё лучше - рядом с курсором, где печатаешь.

    HKEY_CURRENT_USER\Keyboard Layout\Toggle
    Это у тебя на семёрке? У меня на XP есть такой раздел там 3 параметра внутри
    Hotkey = 1
    Language Hotkey = 1
    Layout Hotkey = 2

    Если так просто добираться можно пошерстить, что да как с реестром.
    Вся фишка в том, что на XP только 2 сочетания хоткеев можно выбрать, на семёрке не знаю.
    Судя по всему самое первое значение и определяет способ переключения.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  13. #10  
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    787
    Сказал(а) спасибо
    327
    Поблагодарили 350 раз(а) в 277 сообщениях
    Записей в блоге
    6
    Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
    Это у тебя на семёрке? У меня на XP есть такой раздел там 3 параметра внутри
    Hotkey = 1
    Language Hotkey = 1
    Layout Hotkey = 2
    Да на семерке тоже самое. Просто если пользователь ни разу не менял клавиши для раскладки, то этих параметров нет. Если менял , то да эти три параметра появляются. Ну а сочетания надо конечно проверять, какой параметр за что отвечает. На семерке дополнительно есть возможность менять раскладку по одной клавише "Ё", но думаю таким способом мало кто пользуется.
    Ответить с цитированием  
     

Страница 1 из 3 123 ПоследняяПоследняя
Информация о теме
Пользователи, просматривающие эту тему

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

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