пятница, 5 ноября 2010 г.

кодировки в программах на Harbour

 Вот пример, который выдран с 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:
  Воздушный
  Синий   
  Шарик
  Яркий
  воздушный
  синий   
  шарик
  яркий


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

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