FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour upper UTF8
Posts: 357
Joined: Thu Nov 02, 2006 06:53 PM
upper UTF8
Posted: Sat Feb 14, 2026 05:46 PM

is there function upper UTF8

best regards kajot

best regards

kajot
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: upper UTF8
Posted: Sat Feb 14, 2026 07:02 PM

Dear Kajot,

https://deepwiki.com/search/is-there-function-upper-utf8_4f2196b4-d0cf-4512-aeca-74aa0e76b39e?mode=deep

The standard Upper() function in Harbour works with UTF-8 strings when using a UTF-8 codepage:

To use UPPER() with UTF-8 encoded strings in Harbour:

Request the UTF-8 codepage at the top of your program: REQUEST HB_CODEPAGE_UTF8EX or REQUEST HB_CODEPAGE_UTF8
Select the codepage using: hb_cdpSelect("UTF8EX") or hb_cdpSelect("UTF8")
Optionally set terminal codepage using: hb_SetTermCP("UTF8EX") or hb_SetTermCP(hb_cdpTerm())
Once set, the standard Upper() and Lower() functions will work correctly with UTF-8 multi-byte characters
The difference between UTF8 and UTF8EX is that UTF8EX is an extended version with additional character support. Most modern applications use UTF8EX.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 357
Joined: Thu Nov 02, 2006 06:53 PM
Re: upper UTF8
Posted: Sat Feb 14, 2026 07:06 PM

does it work in xharbour ?

best regards

kajot
Posts: 357
Joined: Thu Nov 02, 2006 06:53 PM
Re: upper UTF8
Posted: Sun Feb 15, 2026 05:49 PM

Antonio
in xHarbour I get
Type: C >>>xhb.exe -o"t.c" -m -n -p -q -gc0 -I"R:\include" -I"R:\include\w32" "t.prg"<<<

xHarbour 1.2.3 Intl. (SimpLex) (Build 20190614)
Copyright 1999-2018, http://www.xharbour.org http://www.harbour-project.org/
Generating object output to 't.obj'...

Type: C >>>xlink.exe -NOEXPOBJ -MAP -FORCE:MULTIPLE -NOIMPLIB -subsystem:console -LIBPATH:"R:\lib" -LIBPATH:"R:\c_lib" -LIBPATH:"R:\c_lib\win" "t.obj" "xhb.lib" "dbf.lib" "nsx.lib" "ntx.lib" "cdx.lib" "rmdbfcdx.lib" "ct3comm.lib" crt.lib kernel32.lib user32.lib winspool.lib ole32.lib oleaut32.lib odbc32.lib odbccp32.lib uuid.lib wsock32.lib ws2_32.lib wininet.lib advapi32.lib shlwapi.lib msimg32.lib mpr.lib OleDlg.lib version.lib -out:"t.exe"<<<

Creating object: t.EXP
Creating library: t.LIB
xLINK: error: Unresolved external symbol '_HB_FUN_HB_CODEPAGE_UTF8EX referenced from (t.obj)'.
xLINK: fatal error: 1 unresolved external(s).

best regards

kajot
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: upper UTF8
Posted: Sun Feb 15, 2026 08:05 PM

Dear Kajot,

Please try it with REQUEST HB_CODEPAGE_UTF8

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 357
Joined: Thu Nov 02, 2006 06:53 PM
Re: upper UTF8
Posted: Thu Feb 19, 2026 07:32 PM

#include 'fivewin.ch' #include 'hbxml.ch' #INCLUDE "DTPICKER.CH" #INCLUDE "DBCOMBO.CH"

#define CRLF chr(13)+chr(10) REQUEST DBFCDX

#xtranslate enc(<c>) => If(isutf8(<c>),"UTF8", "ANSI" )

REQUEST HB_CODEPAGE_UTF8 // REQUEST HB_CODEPAGE_UTF8EX //----------------------------------------------------------------------------// function KSEF_V2() ...

NAZWA_:= upper(hb_utf8tostr(tNAZWA,'PLWIN'))

I get error

Creating object: wRVAT.EXP

Creating library: wRVAT.LIB

xLINK: error: Unresolved external symbol '_HB_FUN_HB_CODEPAGE_UTF8 referenced from (konwert.obj)'.

xLINK: fatal error: 1 unresolved external(s).

Type: C >>>Couldn't build: wRVAT.EXE<<< Type: C >>>TMAKEPROJECT<<< Type: C >>>TMAKEPROJECT:REFRESH<<< Type: N >>> 1428<<<

best regards

kajot
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: upper UTF8
Posted: Thu Feb 19, 2026 08:24 PM

Mira se ayuda,

// C:\FWH\SAMPLES\BUSCACE2.PRG - MODIFICADO EM: 30/10/2025 By Kapiaba

#include "FiveWin.ch"

// Cambiar por ESWIN - Espanhol.
EXTERNAL HB_LANG_PT, HB_CODEPAGE_PTISO, HB_CODEPAGE_PT850

#ifNdef __XHARBOUR__     // Somente para HARBOUR, XHARBOUR nao tem isso ainda.
   REQUEST HB_CODEPAGE_UTF8
   REQUEST HB_CODEPAGE_UTF8EX

#else

   // HB_CDPSELECT( "UTF8EX" )  // abajo.

#endif

FUNCTION BuscaCep()

   LOCAL cRet, hCep
   LOCAL cCodCid
   LOCAL cCep := "01306-000"

   #ifdef __XHARBOUR__  // PERFEITO COM XHARBOUR( I Like )

  HB_LANGSELECT( 'PT' )
  HB_SETCODEPAGE( "PT850" )
  HB_CDPSELECT( "PTISO" )
  HB_SETCODEPAGE( "UTF8" )
  HB_CDPSELECT( "UTF8EX" )

   #Else // HARBOUR E ASSIM: ( No like ) kkkkkkkkkkk

  HB_LANGSELECT( 'PT' )
  HB_SETCODEPAGE( "UTF8" )
  HB_CDPSELECT( "UTF8EX" )
  HB_SETCODEPAGE( "PT850" )
  HB_CDPSELECT( "PTISO" )

   #Endif

   cCep := StrTran( cCep, "-", "" )
   cRet := WebGetCep( cCEP )
   hCep := u_JsonToHash( cRet )

   Try

  cCodCid := StrZero( Val( SubStr(hCep["ibge"],3 ) ), 6 )

   Catch

  hCep := NIL

   End

   IF hCep # nil

  MsgInfo( Upper( hb_UTF8ToStr( hCep["logradouro"] ) ) + Chr( 13 ) + Chr( 10 ) + ;
           Upper( hb_UTF8ToStr( hCep["bairro"] ) ) + Chr( 13 ) + Chr( 10 ) +     ;
           Upper( hb_UTF8ToStr( hCep["localidade"] ) ) + Chr( 13 ) + Chr( 10 ) + ;
           Upper( hb_UTF8ToStr( hCep["ibge"] ) ) + Chr( 13 ) + Chr( 10 ) +       ;
           Upper( hb_UTF8ToStr( hCep["uf"] ) ) )

   ELSE

  MsgStop( "CEP não encontrado ou serviço fora do ar" )

   ENDIF

RETURN hCep

STATIC FUNCTION Emt_GetHtml( cLink )

   LOCAL oOle
   LOCAL cHtml := ""

   Try

  oOle := CreateObject( "Microsoft.XMLHTTP" )
  oOle:Open( "GET", cLink, .F. )
  oOle:Send()
  cHtml := oOle:ResponseBody
  oOle := nil

   Catch

   End

RETURN cHtml

STATIC FUNCTION WebGetCep( cCEP )

   LOCAL cUrl, cJsonRet

   cUrl := 'http://viacep.com.br/ws/' + cCEP + '/json'

   cJsonRet := Emt_GetHtml( cUrl )

RETURN cJsonRet

STATIC FUNCTION u_JsonToHash( cStringJson )

   LOCAL hJson := { => }

   cStringJson := StrTran( cStringJson, ':[', '=>{' )
   cStringJson := StrTran( cStringJson, '":"', '" => "' )
   cStringJson := StrTran( cStringJson, '[', '{' )
   cStringJson := StrTran( cStringJson, ']', '}' )
   cStringJson := StrTran( cStringJson, '":null', '"=>nil' )
   cStringJson := StrTran( cStringJson, '":true' , '"=>.t.' )
   cStringJson := StrTran( cStringJson, '":false', '"=>.f.' )
   cStringJson := StrTran( cStringJson, '":', '"=>' )
   cStringJson := StrTran( cStringJson, "\/", "/" )
   cStringJson := StrTran( cStringJson, Chr( 13 ), "" )
   cStringJson := StrTran( cStringJson, Chr( 10 ), "" )

   Try
      hJSon := &( cStringJson )
   Catch
      hJSon := Hash()
   End

RETURN hJson

FUNCTION SemAcento( cStr ) // TAMBEM NAO FUNCIONA.

   LOCAL cRet := ""
   LOCAL nI
   LOCAL cCar
   LOCAL nPos
   LOCAL aCar := {}

   cRet := cStr
   cRet := StrTran( cRet, "á", "a" )
   cRet := StrTran( cRet, "à", "a" )
   cRet := StrTran( cRet, "ã", "a" )
   cRet := StrTran( cRet, "â", "a" )
   cRet := StrTran( cRet, "é", "e" )
   cRet := StrTran( cRet, "è", "e" )
   cRet := StrTran( cRet, "ê", "e" )
   cRet := StrTran( cRet, "í", "i" )
   cRet := StrTran( cRet, "ì", "i" )
   cRet := StrTran( cRet, "î", "i" )
   cRet := StrTran( cRet, "ó", "o" )
   cRet := StrTran( cRet, "ò", "o" )
   cRet := StrTran( cRet, "õ", "o" )
   cRet := StrTran( cRet, "ô", "o" )
   cRet := StrTran( cRet, "ú", "u" )
   cRet := StrTran( cRet, "ù", "u" )
   cRet := StrTran( cRet, "û", "u" )
   cRet := StrTran( cRet, "ç", "c" )
   cRet := StrTran( cRet, "Á", "A" )
   cRet := StrTran( cRet, "À", "A" )
   cRet := StrTran( cRet, "Ã", "A" )
   cRet := StrTran( cRet, "Â", "A" )
   cRet := StrTran( cRet, "É", "E" )
   cRet := StrTran( cRet, "È", "E" )
   cRet := StrTran( cRet, "Ê", "E" )
   cRet := StrTran( cRet, "Í", "I" )
   cRet := StrTran( cRet, "Ì", "I" )
   cRet := StrTran( cRet, "Î", "I" )
   cRet := StrTran( cRet, "Ó", "O" )
   cRet := StrTran( cRet, "Ò", "O" )
   cRet := StrTran( cRet, "Õ", "O" )
   cRet := StrTran( cRet, "Ô", "O" )
   cRet := StrTran( cRet, "Ú", "U" )
   cRet := StrTran( cRet, "Ù", "U" )
   cRet := StrTran( cRet, "Û", "U" )
   cRet := StrTran( cRet, "Ç", "C" )

RETURN cRet

// FIN / END - kapiabafwh@gmail.com

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 357
Joined: Thu Nov 02, 2006 06:53 PM
Re: upper UTF8
Posted: Thu Feb 19, 2026 08:46 PM

Thanks but I am using xHarbour

best regards

kajot
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: upper UTF8
Posted: Thu Feb 19, 2026 09:37 PM

A good reason to move to Harbour :idea:

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 357
Joined: Thu Nov 02, 2006 06:53 PM
Re: upper UTF8
Posted: Fri Feb 20, 2026 06:14 AM

it's not that easy to rewrite the entire code

best regards

kajot
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: upper UTF8
Posted: Fri Feb 20, 2026 06:36 AM

Have you just tried to build it using Harbour ?

It may be much easier than you think :idea:

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 6983
Joined: Fri Oct 07, 2005 07:07 PM
Re: upper UTF8
Posted: Fri Feb 20, 2026 10:21 AM

Hello,
I have come to the conclusion that in the end you need a self-written function.
In our old applications — more than 30 years old, dating back to the DOS era — there are too many different code pages in the original data.

https://forums.fivetechsupport.com/viewtopic.php?p=283556#p283556

Best regards,
Otto

Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: upper UTF8
Posted: Fri Feb 20, 2026 02:20 PM

xHarbour is PERFECT! No like HARBOUR never! hahahaha.

// C:\FWH\SAMPLES\KAJOT.PRG - MODIFICADO EM: 20/02/2026 By Kapiaba

#include "FiveWin.ch"

// LANGUAGE
EXTERNAL HB_LANG_PT        // Replace it with the equivalent in your country or the United States.
EXTERNAL HB_CODEPAGE_PT850 // Replace it with the equivalent in your country or the United States.
EXTERNAL HB_CODEPAGE_PTISO // UNIVERSAL

FUNCTION Main()  // MENU PRINCIPAL

   LOCAL cRet, hCep
   LOCAL cCodCid
   LOCAL cCep := "01306-000"

   // LANGUAGE
   HB_LANGSELECT( 'PT' )     // Replace it with the equivalent in your country or the United States.
   HB_SETCODEPAGE( "PT850" ) // Replace it with the equivalent in your country or the United States.
   // UTF8
   HB_CDPSELECT( "PTISO" )
   HB_SETCODEPAGE( "UTF8" )
   HB_CDPSELECT( "UTF8EX" )

   cCep := StrTran( cCep, "-", "" )
   cRet := WebGetCep( cCEP )
   hCep := u_JsonToHash( cRet )

   Try

  cCodCid := StrZero( Val( SubStr(hCep["ibge"],3 ) ), 6 )

   Catch

  hCep := NIL

   End

   IF hCep # nil

  MsgInfo( Upper( hb_UTF8ToStr( hCep["logradouro"] ) ) + Chr( 13 ) + Chr( 10 ) + ;
           Upper( hb_UTF8ToStr( hCep["bairro"] ) ) + Chr( 13 ) + Chr( 10 ) +     ;
           Upper( hb_UTF8ToStr( hCep["localidade"] ) ) + Chr( 13 ) + Chr( 10 ) + ;
           Upper( hb_UTF8ToStr( hCep["ibge"] ) ) + Chr( 13 ) + Chr( 10 ) +       ;
           Upper( hb_UTF8ToStr( hCep["uf"] ) ) )

   ELSE

  MsgStop( "CEP não encontrado ou serviço fora do ar" )

   ENDIF

RETURN hCep

STATIC FUNCTION WebGetCep( cCEP )

   LOCAL cUrl, cJsonRet

   cUrl := 'http://viacep.com.br/ws/' + cCEP + '/json'

   cJsonRet := Emt_GetHtml( cUrl )

RETURN cJsonRet

STATIC FUNCTION Emt_GetHtml( cLink )

   LOCAL oOle
   LOCAL cHtml := ""

   Try

 oOle := CreateObject( "Microsoft.XMLHTTP" )
 oOle:Open( "GET", cLink, .F. )
 oOle:Send()
 cHtml := oOle:ResponseBody
 oOle := nil

   Catch

   End

RETURN cHtml

STATIC FUNCTION u_JsonToHash( cStringJson )

   LOCAL hJson := { => }

   cStringJson := StrTran( cStringJson, ':[', '=>{' )
   cStringJson := StrTran( cStringJson, '":"', '" => "' )
   cStringJson := StrTran( cStringJson, '[', '{' )
   cStringJson := StrTran( cStringJson, ']', '}' )
   cStringJson := StrTran( cStringJson, '":null', '"=>nil' )
   cStringJson := StrTran( cStringJson, '":true' , '"=>.t.' )
   cStringJson := StrTran( cStringJson, '":false', '"=>.f.' )
   cStringJson := StrTran( cStringJson, '":', '"=>' )
   cStringJson := StrTran( cStringJson, "\/", "/" )
   cStringJson := StrTran( cStringJson, Chr( 13 ), "" )
   cStringJson := StrTran( cStringJson, Chr( 10 ), "" )

   Try
      hJSon := &( cStringJson )
   Catch
      hJSon := Hash()
   End

RETURN hJson

// FIN / END - kapiabafwh@gmail.com

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 357
Joined: Thu Nov 02, 2006 06:53 PM
Re: upper UTF8
Posted: Fri Feb 20, 2026 08:12 PM

Antonio where can I download harbour ?

best regards

kajot
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: upper UTF8
Posted: Fri Feb 20, 2026 08:27 PM
regards, saludos

Antonio Linares
www.fivetechsoft.com