Просмотр полной версии : Кодировка cp855
Доброго времени суток.
Есть китайский принтер и он понимает кириллицу только в кодировке 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
Спасибо, что дали направление, куда следует копать!!!
Судя по описанию утилиты 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
Спасибо большое за помощь!
Буду делать через CAA File библиотеку.
На будущее, очень хотелось бы иметь готовый ФБ для кириллических кодировок cp855 и cp866 в составе StringUtils.
Текущее решение - это огромный "костыль".
Евгений Кислов
30.01.2024, 06:42
Спасибо большое за помощь!
Буду делать через CAA File библиотеку.
На будущее, очень хотелось бы иметь готовый ФБ для кириллических кодировок cp855 и cp866 в составе StringUtils.
Текущее решение - это огромный "костыль".
Добавлю ваше пожелание в наш список.
Подскажите, вам нужны эти кодировки только для работы с китайскими принтерами?
Как часто вы с ними сталкиваетесь?
Андрей_ТМЗ
30.01.2024, 09:23
Добавлю ваше пожелание в наш список.
Подскажите, вам нужны эти кодировки только для работы с китайскими принтерами?
Как часто вы с ними сталкиваетесь?
Добрый день. У нас на предприятии всё чаще начинает использоваться китайское оборудование. В связи с этим взаимодействие с китайскими принтерами становится всё актуальнее.
Добрый день. У нас на предприятии всё чаще начинает использоваться китайское оборудование. В связи с этим взаимодействие с китайскими принтерами становится всё актуальнее.
Поддерживаю Андрея полностью.
Добавлю ваше пожелание в наш список.
Подскажите, вам нужны эти кодировки только для работы с китайскими принтерами?
Как часто вы с ними сталкиваетесь?
Что касается моей задачи, у нас целая линейка этих принтеров одной китайской фирмы и для всех нужно делать программную прокладку между принтером и базой данных. Было уже несколько похожих проектов и для всех нужно это решение.
Кстати, раз уж вы добавили в список пожеланий эти две кодировки, то добавьте еще и KOI8-R, эта кодировка тоже используется в одной из линеек принтеров. Спасибо!
Уж не знаю, заводить ли новую тему или продолжить здесь?
Пообщался с производителем принтеров, оказалось, что можно его перенастроить на кодировку 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.
Можете связаться со мной через телеграм (в подписи) - поможем с конвертацией в любую кодировку.
Можете связаться со мной через телеграм (в подписи) - поможем с конвертацией в любую кодировку.
Спасибо большое за помощь через AnyDesk
Но функции конвертации в 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
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot