UTF-8 в Clarion

49 views
Skip to first unread message

serge62

unread,
Jul 3, 2025, 4:35:03 AMJul 3
to ClaList
Добрый день! Как строку текста в UTF-8 преобразовать в приемлемый для Clarion вид, а то кракозябры!

Чаплыгин В. Г.

unread,
Jul 3, 2025, 4:37:55 AMJul 3
to serge62, clalist@googlegroups.com >> 'Vitaly B.' via ClaList

Есть класс Юрия Философова

Привет!

Я когда-то (много раз) выкладывал класс Cstr.
Например,  https://cloud.mail.ru/public/65e6144ec751/Cstr.7z

Там это выглядит примерно так
....
Include('cstr.inc')
....
Temp  Cstr      glo_Temp  Cstr         
....
Temp.Set(Utf8String)
Temp.toAscii()

После чего Temp.S (или Temp.Str() )  будет содержать нужный код

С уважением,
Юрий Философов


03.07.2025 11:35, serge62 пишет:
Добрый день! Как строку текста в UTF-8 преобразовать в приемлемый для Clarion вид, а то кракозябры! --
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1851ab58-2360-4c39-ae06-96ee7c987023n%40googlegroups.com.

-- 
С уважением Чаплыгин Вадим Геннадьевич
мой адрес chapli...@yandex.ru
мой сайт в интернете chapligin34.ru

Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted

Igor Smirnov

unread,
Jul 3, 2025, 2:00:54 PMJul 3
to serge62

Hello serge62,


Возможно, кому-то мое решение покажется старомодным, но я его успешно использую уже лет 15, если не больше...

 

Итак,

1)  в Глобальных Эмбедах в разделе "inside the Global Map" пишем:

 

MODULE('API')

   WideCharToMultiByte(ulong,ulong,Long,long,long,Long,long,long),long,pascal,raw

   MultiByteToWideChar(ulong,ulong,Long,long,long,Long),long,pascal,raw

END

 

2) Создаем процедуру (она же функция) типа Source, называем ее, к примеру, TOUNICODE

TOUNICODE            FUNCTION (StringToConvert,CP)

ReturnString    STRING(20000)

dwFlags                  LONG(0)

lpWideCharStr            BYTE,DIM(20000)

Ptr_lpWideCharStr        LONG

cchWideChar              LONG

lpMultiByteStr           BYTE,DIM(20000)

Ptr_lpMultiByteStr       LONG

cbMultiByte              LONG(-1)

RetValue                 LONG

L      LONG

  CODE

L=LEN(CLIP(StringToConvert))

Ptr_lpWideCharStr=ADDRESS(lpWideCharStr)

Ptr_lpMultiByteStr=ADDRESS(lpMultiByteStr)

LOOP i#=1 to L

  lpMultiByteStr[i#]=VAL(StringToConvert[i#])

END

cchWideChar=SIZE(lpWideCharStr)-1

RetValue=MultiByteToWideChar(CP,dwFlags,Ptr_lpMultiByteStr,cbMultiByte,Ptr_lpWideCharStr,cchWideChar)

LOOP i#=1 TO (L*2)

  ReturnString[i#]=CHR(lpWideCharStr[i#])

END

Return(ReturnString)

 

3) Создаем процедуру (она же функция) типа Source, называем ее, к примеру, TOANSI

TOANSI               FUNCTION (StringToConvert,CP)

ReturnString    STRING(20000)

dwFlags                  LONG(0)

lpWideCharStr            BYTE,DIM(20000)

Ptr_lpWideCharStr        LONG

cchWideChar              LONG(-1)

lpMultiByteStr           BYTE,DIM(20000)

Ptr_lpMultiByteStr       LONG

cbMultiByte              LONG

lpDefaultChar            LONG(0)

lpUsedDefaultChar        LONG(0)

RetValue                 LONG

InterimStr              BYTE,DIM(20000)

L   LONG

L=LEN(CLIP(StringToConvert))

Ptr_lpWideCharStr=ADDRESS(lpWideCharStr)

Ptr_lpMultiByteStr=ADDRESS(lpMultiByteStr)

LOOP i#=1 TO L

  lpWideCharStr[i#]=VAL(StringToConvert[i#])

END

cbMultiByte=SIZE(lpMultiByteStr)-1

RetValue=WideCharToMultiByte(CP,dwFlags,Ptr_lpWideCharStr,cchWideChar,Ptr_lpMultiByteStr,cbMultiByte,lpDefaultChar,lpUsedDefaultChar)

LOOP i#=1 TO L

  ReturnString[i#]=CHR(lpMultiByteStr[i#])

END

Return(ReturnString)

 

4)  Создаем процедуру (она же функция) типа Source, называем ее, к примеру, RECODE

RECODE               FUNCTION (InputString,FromCP,ToCP)

OutputString   STRING(2048)

  CODE                                                     ! Begin processed code

OutputString=CLIP(TOANSI(TOUNICODE(InputString,FromCP),ToCP))

RETURN(OutputString)

 

5) Теперь мы можем в любом удобном месте вызывать функцию перекодирования строк следующей директивой;

OutputString = RECODE(InputString,inputCP,outputCP)

 

...где 

OutputString - выходная строка в кодировке outputCP

InputString - входная строка в кодировке inputCP

 

Например, нужно перекодировать текст "Александр Сергеевич Пушкин" из UTF-8 в "Windows Cyrillic".

BadStr = 'Александр Сергеевич Пушкин'

GoodStr= RECODE(BadStr,65001,1251)

На выходе должно получиться "Александр Сергеевич Пушкин".

 

Пояснение: номер кодовой страницы есть даже у UTF-8. и он равен 65001. У Виндовской кириллицы 1251, у ДОС-кириллицы 866 и т.д.

Функция RECODE сначала с помощью функции TOUNICODE конвертирует строку (зная ее кодировку) в Юникод, а затем

с помощью функции TOANSI в строку с заданной кодировкой

 

 

 

     

Thursday, July 3, 2025, 11:35:03 AM, you wrote:


Добрый день! Как строку текста в UTF-8 преобразовать в приемлемый для Clarion вид, а то кракозябры!

--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1851ab58-2360-4c39-ae06-96ee7c987023n%40googlegroups.com.


-- 
Best regards,
Igor Smirnov
Reply all
Reply to author
Forward
0 new messages