Работаем в Harbour

(LINUX UBUNTU) (Выжимка из блога)

Итак, начинаем с того, что скачиваем дистрибутив. Для чистоты эксперимента будем компилировать все из исходников.
  1. получим исходники. для этого в домашней папке создадим папку для разных исходников. в Линукс она обычно называется src.
    1. cd ~/
    2. mkdir src
    3. cd src
    4. если у Вас нет svn, делаем вот что: sudo apt-get install subversion
    5. svn co https://harbour-project.svn.sourceforge.net/svnroot/harbour-project/trunk/harbour harbour
    6. после не очень долгого вытягивания исходников из Интернет, получим папку ~/src/harbour с последними исходниками
  2. Внимательно изучить файл INSTALL на предмет списка пакетов, необходимых для установки. и установить нужные пакеты. Например
          for gtcrs terminal lib:    $ sudo apt-get install libncurses-dev
          for gtsln terminal lib:    $ sudo apt-get install libslang2-dev OR
                                     $ sudo apt-get install libslang1-dev
          for gtxwc terminal lib:    $ sudo apt-get install libx11-dev
          for console mouse support: $ sudo apt-get install libgpm-dev OR
                                     $ sudo apt-get install libgpmg1-dev
          for contrib/gtalleg lib:   $ sudo apt-get install liballegro4.2-dev
          for contrib/hbcairo lib:   $ sudo apt-get install libcairo2-dev
          for contrib/hbcups lib:    $ sudo apt-get install libcups2-dev
          for contrib/hbcurl lib:    $ sudo apt-get install libcurl4-openssl-dev OR
                                     $ sudo apt-get install libcurl4-gnutls-dev
          for contrib/hbexpat lib:   $ sudo apt-get install libexpat1-dev
          for contrib/hbfbird lib:   $ sudo apt-get install firebird2.1-dev OR
                                     $ sudo apt-get install libfirebird2.0-dev
          for contrib/hbfimage lib:  $ sudo apt-get install libfreeimage-dev
          for contrib/hbgd lib:      $ sudo apt-get install libgd2-xpm-dev OR
                                     $ sudo apt-get install libgd-xpm-dev
          for contrib/hbmysql lib:   $ sudo apt-get install libmysqlclient15-dev
          for contrib/hbodbc lib:    $ sudo apt-get install unixodbc-dev
          for contrib/hbpgsql lib:   $ sudo apt-get install libpq-dev
          for contrib/hbqt lib:      $ sudo apt-get install libqt4-dev

          Optional, to override locally hosted sources:

          for bzip2 support:         $ sudo apt-get install libbz2-dev
          for zlib support:          $ sudo apt-get install zlib1g-dev
          for pcre (regex) support:  $ sudo apt-get install libpcre3-dev
          for contrib/hbsqlit3 lib:  $ sudo apt-get install libsqlite3-dev
  3. откомпилируем все это добро
    1. cd ~/src/harbour
    2. make                           -----на современном железа это длиться  не долго
    3. sudo make install       --------sudo нужно, чтобы писать в системные папки ( /usr/local например). тут придется ввести свой пароль.
  4. ну и проверим
    1. harbour    -------при успешной инсталяции появится помощь Харбора: список опций, описание
    2. $ cd tests
            $ hbmk2 hello.prg
            $ ./hello
Итак, наконец мы получили рабочий Харбор теперь бы неплохо почитать файлы README и INATSLL, а также заглянуть в папку docs. Бинарники по умолчанию в /usr/local/bin, библиотеки /usr/local/lib/harbour, инклюды /usr/local/include/harbour.

Но, как всегда в Линуксе - есть альтернативный путь - просто скачать исходники одним тарболом, распаковать и запустить скрипт сборки.
 
распаковать скачанный архив в /usr/src/harbour

cd /usr/src/harbour
make_gnu.sh all
make_gnu.sh install

вот, как-то так...

Не забываем, что нужны хидеры Иксов!!!

apt-get install xorg-dev

Мне еще пришлось создать пару папочек

sudo mkdir /usr/local/lib/harbour
sudo mkdir /usr/local/include/harbour

только после этого шаманства инсталляция закончилась

С недавних пор для компиляции проектов в Харборе есть утилита HBMK2. Это универсальный инструмент с поддержкой всевозможных режимов компиляции. Он может все (ну разве, что пирожки не печет). О нем написано достаточно. Скажу только, что откомпилировать тестовую програмку можно просто:
#hbmk2 test_prog
в простейшем случае система сама найдет все необходимое. Если нужно указать опции компилятора, список дополнительных библиотек, список инклюдов, список исходников - нужно создать файл-сценарий. 
====================================================

Теперь посмотрим как сделать программу с поддержкой русского языка.  Для этого имеется набор функций:
hb_cdpSelect() установка кодовой страници для программы (правила сортировки, преобразования UPPERCASE to LOWERCAWSE и обратно)
hb_setDispCP() установка преобразования кодовой страници для вывода
hb_setKeyCP() то же самое для ввода
hb_setTermCP() - то же самое для ввода-вывода

========================
начнем с простого
 Вот пример, который выдран с clipper.borda.ru. только там он для xHarbour, наверное, так как у меня не заработал в оригинале.
Итак: локаль UTF-8. Ubuntu. Консоль.

-------------------------------------------------------------------------
REQUEST HB_CODEPAGE_RU1251
REQUEST HB_CODEPAGE_RU866

Function Main ()
local cMsg866, cMsg1251

cMsg866 := '�ਢ�� 866...' //текст в кодировке 866
cMsg1251 := '������ 1251' //текст в кодировке 1251

HB_CDPSELECT("RU866")
? 'HB_CDPSELECT( "RU866" )'
? cMsg866
? cMsg1251
? '====================='
HB_CDPSELECT( "RU1251" )
? 'HB_CDPSELECT( "RUWIN" )'
? cMsg866
? cMsg1251

Return Nil
-------------------------------------------------------------------------
Получаем:

HB_CDPSELECT( "RU866" )                                                        
привет 866...         
яЁштхЄ 1251 
=====================
HB_CDPSELECT( "RUWIN" )
ЇаЁўҐв 866...         
привет 1251 


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

arr1251:={"Яркий", "синий", "Воздушный", "шарик", "яркий", "Синий", "воздушный", "Шарик"}
arr866:={"яркий", "Синий", "воздушный", "Шарик", "Яркий", "синий", "Воздушный", "шарик"}


естественно строки в НУЖНОЙ кодировке, а тут все видно для наглядности ;-)

--------------------------------

REQUEST HB_CODEPAGE_RU1251
REQUEST HB_CODEPAGE_RU866

Function Main()
local cMsg866, cMsg1251,arr866,arr1251,i


cMsg866 := '�ਢ�� 866...' //текст в кодировке 866
cMsg1251 := '������ 1251' //текст в кодировке 1251


arr1251:={"�����", "�����", "���������", "�����", "�����", "�����", "���������", "�����"}
arr866:={"�ન�", "�����", "���������", "��ਪ", "�ન�", "ᨭ��", "���������", "��ਪ"}


HB_CDPSELECT("RU866")
? 'HB_CDPSELECT( "RU866" )'
? cMsg866
? cMsg1251
? '====================='
HB_CDPSELECT( "RU1251" )
? 'HB_CDPSELECT( "RUWIN" )'
? cMsg866
? cMsg1251



HB_CDPSELECT( "RU1251" )
?
?"initial 1251:"
for each i in arr1251
  ? " ", i
end

?"sorted:"
asort (arr1251)
for each i in arr1251
  ? " ",i
end

HB_CDPSELECT( "RU866" )
?
?"initial 866:"
for each i in arr866
  ? " ",i
end

?"sorted:"
asort (arr866)
for each i in arr866
  ? " ",i
end

Return Nil
-----------------------------------------------------



в результате получаем:


  
HB_CDPSELECT( "RU866")             
привет 866...         
яЁштхЄ 1251 
=====================
HB_CDPSELECT( "RUWIN" )
ЇаЁўҐв 866...         
привет 1251 
          
initial 1251:
  Яркий     
  синий
  Воздушный
  шарик   
  яркий
  Синий
  воздушный
  Шарик   
sorted:
  Воздушный
  Синий   
  Шарик
  Яркий
  воздушный
  синий   
  шарик
  яркий
      
initial 866:
  яркий    
  Синий
  воздушный
  Шарик   
  Яркий
  синий
  Воздушный
  шарик   
sorted:
  Воздушный
  Синий   
  Шарик
  Яркий
  воздушный
  синий   
  шарик
  яркий

значит сортировка работает корректно!

Теперь более сложный пример. Даже с записью в БД.

-----------------------------------------------------------

REQUEST HB_CODEPAGE_RU1251
REQUEST HB_CODEPAGE_RU866

Function Main ()
local cMsg866, cMsg1251,mtest1251:="1234567890",mtest866:="1234567890",i
clear

cMsg866 := '�ਢ�� 866...' //привет 866
cMsg1251 := '������ 1251' //привет 1251
 
// тут кодировках {"яркий", "синий", "воздушный", "шарик", "Яркий", "Синий", "Воздушный", "Шарик"}
 
arr866:={"�ન�", "�����", "���������", "��ਪ", "�ન�", "ᨭ��", "���������", "��ਪ"}
 
arr1251:={"�����", "�����", "���������", "�����", "�����", "�����", "���������", "�����"}

? '=====111================'

hb_setTermCP("RU866","RU866")

? 'HB_CDPSELECT( "RU866" )'
? cMsg866
? cMsg1251

hb_setTermCP("RU1251","RU1251")

? 'HB_CDPSELECT( "RUWIN" )'
? cMsg866
? cMsg1251


hb_setTermCP("","") // reset codepage to default value

? "=====222====================="

HB_CDPSELECT( "RU1251" )
?
?"CDPSELECT initial 1251:"
for each i in arr1251
  ? " ", i
end

?"CDPSELECT sorted:"
asort (arr1251)
for each i in arr1251
  ? " ",i
end

HB_CDPSELECT( "RU866" )
?
?"CDPSELECT initial 866:"
for each i in arr866
  ? " ",i
end

?"CDPSELECT sorted:"
asort (arr866)
for each i in arr866
  ? " ",i
end

? "=====333====================="

hb_setTermCP("RU1251","RU1251")
?
?"termcp initial 1251:"
for each i in arr1251
  ? " ", i
end

?"termcp sorted:"
asort (arr1251)
for each i in arr1251
  ? " ",i
end


hb_setTermCP("RU866","RU866")
?
?"termcp initial 866:"
for each i in arr866
  ? " ",i
end

?"termcp sorted:"
asort (arr866)
for each i in arr866
  ? " ",i
end

? "=====444====================="

dbCreate( "Nakl1.dbf", { {"f1251","C",10,0},{"f866","C",10,0} } )

hb_setTermCP("RU1251","RU1251")

@ 10,10 say "enter test" get mtest1251
read
? mtest1251

hb_setTermCP("RU866","RU866")

@ 10,10 say "enter test" get mtest866
read
? mtest866

use "Nakl1.dbf" new

Append blank
1->f1251:= mtest1251
1->f866:=mtest866
close all

Return Nil

-----------------------------------------------
Ну с кодом , наверное, все понятно. сначала демонстрация hb_setTermCP("ККК","ККК"), потом HB_CDPSELECT( "ккк" ), потом ввод с клавиатуры, запись в БД в разных кодировках.
ссылка на рабочий PRG файл, компилировавшийся под UBUNTU 

Вот цитата из Чейнжлога про функции установки кодовой страницы на терминале:

 2006-02-04 17:05 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
   [...]
         The new three .prg functions:
            HB_SETKEYCP(  [,] )
            HB_SETDISPCP(  [,] [,] )
            HB_SETTERMCP(  [,] [,] )
         have been added. They set automatic input (HB_SETKEYCP)
         and output (HB_SETDISPCP) (or both: HB_SETTERMCP) character
         translation. They are also important for some GTs which
         informing them about used internal code page for unicode
         translation (GTXWC, GTSLN) and/or chosing proper character
         set (standard/alternate) for letters and other (f.e. box
         drawing characters) (GTCRS, GTSLN),
             is encoding used on external (terminal) side
             is encoding used internally, if not given then
                      current code page set HB_SETCODEPAGE() is used.
                      some of GTs which uses unicode output may
                      ignore 
             is optional parameter which interacts with dispbox()
                       output disabling switching to alternate character
                       set in some GTs. It effectively causes that if internal
                       (host) code page contains some letters on the box char
                       positions then they will be shown also by box drawing
                       functions like dispbox() instead of CP437 characters.
                       In some cases it could be useful. By default lBoxChar
                       is not set and GTs which can switch between standard
                       and alternate character set (GTCRS, GTSLN) will try to
                       use alternate character set for box drawing functions.


Когда дойдут руки сделаю пример с индексами.
 


Комментариев нет: