(LINUX UBUNTU) (Выжимка из блога)
Итак, начинаем с того, что скачиваем дистрибутив. Для чистоты эксперимента будем компилировать все из исходников.
- получим исходники. для этого в домашней папке создадим папку для разных исходников. в Линукс она обычно называется src.
- cd ~/
- mkdir src
- cd src
- если у Вас нет svn, делаем вот что: sudo apt-get install subversion
- svn co https://harbour-project.svn.sourceforge.net/svnroot/harbour-project/trunk/harbour harbour
- после не очень долгого вытягивания исходников из Интернет, получим папку ~/src/harbour с последними исходниками
- Внимательно изучить файл 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
- откомпилируем все это добро
- cd ~/src/harbour
- make -----на современном железа это длиться не долго
- sudo make install --------sudo нужно, чтобы писать в системные папки ( /usr/local например). тут придется ввести свой пароль.
- ну и проверим
- harbour -------при успешной инсталяции появится помощь Харбора: список опций, описание
- $ 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
только после этого шаманства инсталляция закончилась
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() - то же самое для ввода-вывода
========================
начнем с простого
Теперь посмотрим как сделать программу с поддержкой русского языка. Для этого имеется набор функций:
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
-------------------------------------------------------------------------
Получаем:
то есть все строки можно хранить в старой доброй досовской кодировке, а на выводе система сделает преобразование в читабельную информацию.
вопрос с сортировкой проверяем. зададим массивы строк в 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:
Воздушный
Синий
Шарик
Яркий
воздушный
синий
шарик
яркий
значит сортировка работает корректно!
Теперь более сложный пример. Даже с записью в БД.
-----------------------------------------------------------
-----------------------------------------------
Ну с кодом , наверное, все понятно. сначала демонстрация hb_setTermCP("ККК","ККК"), потом HB_CDPSELECT( "ккк" ), потом ввод с клавиатуры, запись в БД в разных кодировках.
Итак: локаль 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
=====================
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
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
? '=====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.
Когда дойдут руки сделаю пример с индексами.
Комментариев нет:
Отправить комментарий