PDA

Просмотр полной версии : Кодировка cp855



NIMNUL
29.01.2024, 15:42
Доброго времени суток.
Есть китайский принтер и он понимает кириллицу только в кодировке cp855. Мне нужно брать данные из удалённого MS SQL сервера, переносить в массив в контроллер, формировать единую строковую переменную из данных массива и через сокет отправлять ее на принтер.
Каким образом можно конвертировать STRING переменную из cp1251 в cp855?
Насколько я понял, OwenStringUtils, конвертацию в cp855 не поддерживает. Есть ли альтернативны способ провести преобразование?

МихаилГл
29.01.2024, 16:30
Ну брать нех код каждого символа и переделывать в нех другой кодировки. Возможно прокатит.

Евгений Кислов
29.01.2024, 16:57
Доброго времени суток.
Есть китайский принтер и он понимает кириллицу только в кодировке cp855. Мне нужно брать данные из удалённого MS SQL сервера, переносить в массив в контроллер, формировать единую строковую переменную из данных массива и через сокет отправлять ее на принтер.
Каким образом можно конвертировать STRING переменную из cp1251 в cp855?
Насколько я понял, OwenStringUtils, конвертацию в cp855 не поддерживает. Есть ли альтернативны способ провести преобразование?

Добрый день.

В состав прошивки наших контроллеров входит утилита iconv - можете попробовать использовать ее для вашей задачи.
Вызов утилиты можно осуществить с помощью библиотеки CmpSysExec:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_CmpSysExec_v3.0.pdf

Также с помощью CmpSysExec можно вызывать скрипты на python - наверняка для него есть подходящий для вашей цели модуль.
Пример работы с python тут:
https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/11_Other/Example_PythonSharedMemory_3517v1.zip

NIMNUL
29.01.2024, 17:37
Спасибо, что дали направление, куда следует копать!!!
Судя по описанию утилиты iconv, она делает преобразование из файла в файл.
А может ли она кодировать из строки в строку?
Я, к сожалению, никогда не работал с файлами из CDS.
Если не может, подскажите, где можно почитать по работе с файлами?

Евгений Кислов
29.01.2024, 17:45
Спасибо, что дали направление, куда следует копать!!!
Судя по описанию утилиты iconv, она делает преобразование из файла в файл.
А может ли она кодировать из строки в строку?
Я, к сожалению, никогда не работал с файлами из CDS.
Если не может, подскажите, где можно почитать по работе с файлами?

https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Archives_v3.0.pdf (п. 4)


Практический пример работы с iconv есть в этом проекте:
https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/02_Visu/03_Additional/Example_RecipesVideo_3514v3.projectarchive

NIMNUL
30.01.2024, 01:02
Спасибо большое за помощь!
Буду делать через CAA File библиотеку.
На будущее, очень хотелось бы иметь готовый ФБ для кириллических кодировок cp855 и cp866 в составе StringUtils.
Текущее решение - это огромный "костыль".

Евгений Кислов
30.01.2024, 06:42
Спасибо большое за помощь!
Буду делать через CAA File библиотеку.
На будущее, очень хотелось бы иметь готовый ФБ для кириллических кодировок cp855 и cp866 в составе StringUtils.
Текущее решение - это огромный "костыль".

Добавлю ваше пожелание в наш список.
Подскажите, вам нужны эти кодировки только для работы с китайскими принтерами?
Как часто вы с ними сталкиваетесь?

Андрей_ТМЗ
30.01.2024, 09:23
Добавлю ваше пожелание в наш список.
Подскажите, вам нужны эти кодировки только для работы с китайскими принтерами?
Как часто вы с ними сталкиваетесь?

Добрый день. У нас на предприятии всё чаще начинает использоваться китайское оборудование. В связи с этим взаимодействие с китайскими принтерами становится всё актуальнее.

NIMNUL
30.01.2024, 09:51
Добрый день. У нас на предприятии всё чаще начинает использоваться китайское оборудование. В связи с этим взаимодействие с китайскими принтерами становится всё актуальнее.

Поддерживаю Андрея полностью.

NIMNUL
30.01.2024, 22:08
Добавлю ваше пожелание в наш список.
Подскажите, вам нужны эти кодировки только для работы с китайскими принтерами?
Как часто вы с ними сталкиваетесь?

Что касается моей задачи, у нас целая линейка этих принтеров одной китайской фирмы и для всех нужно делать программную прокладку между принтером и базой данных. Было уже несколько похожих проектов и для всех нужно это решение.
Кстати, раз уж вы добавили в список пожеланий эти две кодировки, то добавьте еще и KOI8-R, эта кодировка тоже используется в одной из линеек принтеров. Спасибо!

NIMNUL
01.02.2024, 13:52
Уж не знаю, заводить ли новую тему или продолжить здесь?
Пообщался с производителем принтеров, оказалось, что можно его перенастроить на кодировку UTF-8.
Нашел документацию:
https://ftp.owen.ru/CoDeSys3/98_Books/CodesysStringLibrariesPackage_ru.pdf
Оказывается, что можно работать со строками в UTF-8.
Поддерживают ли текущие версии прошивки эти библиотеки?

Евгений Кислов
01.02.2024, 14:01
Уж не знаю, заводить ли новую тему или продолжить здесь?
Пообщался с производителем принтеров, оказалось, что можно его перенастроить на кодировку UTF-8.
Нашел документацию:
https://ftp.owen.ru/CoDeSys3/98_Books/CodesysStringLibrariesPackage_ru.pdf
Оказывается, что можно работать со строками в UTF-8.
Поддерживают ли текущие версии прошивки эти библиотеки?

Нет, не поддерживаются.
Но функции конвертации в UTF8 есть в библиотеке StringUtils.

Можете связаться со мной через телеграм (в подписи) - поможем с конвертацией в любую кодировку.

NIMNUL
05.02.2024, 10:30
Можете связаться со мной через телеграм (в подписи) - поможем с конвертацией в любую кодировку.

Спасибо большое за помощь через AnyDesk

NIMNUL
07.02.2024, 23:15
Но функции конвертации в UTF8 есть в библиотеке StringUtils.


Евгений, я допилил Вашу идею преобразования Unicod в UTF8. Посмотрите, правильно ли?
Сначала, думал "склеивать" hex-коды в цикле, но потом нашёл решение через указатели.

VAR

// Конвертация Unicode -> UTF8
MyString: WSTRING;
abyUtf8: ARRAY [1..99] OF BYTE;
xConvert: BOOL;
ptrString : POINTER TO STRING(99);
outString : STRING;
END_VAR

PLC_PRG
IF xConvert THEN

STU.ConvertUTF16toUTF8(ADR(MyString), ADR(abyUtf8), SIZEOF(abyUtf8), FALSE);
ptrString := ADR(abyUtf8);
outString := ptrString^;
xConvert := FALSE;

END_IF

Евгений Кислов
08.02.2024, 07:02
Евгений, я допилил Вашу идею преобразования Unicod в UTF8. Посмотрите, правильно ли?
Сначала, думал "склеивать" hex-коды в цикле, но потом нашёл решение через указатели.

VAR

// Конвертация Unicode -> UTF8
MyString: WSTRING;
abyUtf8: ARRAY [1..99] OF BYTE;
xConvert: BOOL;
ptrString : POINTER TO STRING(99);
outString : STRING;
END_VAR

PLC_PRG
IF xConvert THEN

STU.ConvertUTF16toUTF8(ADR(MyString), ADR(abyUtf8), SIZEOF(abyUtf8), FALSE);
ptrString := ADR(abyUtf8);
outString := ptrString^;
xConvert := FALSE;

END_IF

Чуть проще (и корректнее):



IF xConvert THEN

STU.ConvertUTF16toUTF8(ADR(MyString), ADR(outString), SIZEOF(outString), FALSE);

END_IF