Есть класс Юрия Философова
Привет!
Я когда-то (много раз) выкладывал класс 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() ) будет содержать нужный код
С уважением,
Юрий Философов
Добрый день! Как строку текста в 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
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.