Вопрос решил написанием пары функций. Решил выложить сюда вдруг кому пригодиться :-)
Для начала написал конвертор из байта в символ
Дальше сама функция перевода строки WSTRING в STRING.Код:FUNCTION fncWord2String : STRING(1) // Из байта получаем символ. VAR_INPUT wdInPut: WORD:=0; END_VAR VAR pByte : POINTER TO BYTE; bByte : BYTE:=0; END_VAR // Через указатели сконвертим word в STRING(1) // Сначала получим из ворда байт bByte:=TO_BYTE(wdInPut); // Запомним адрес этого байта pByte := ADR(bByte); // Область памяти со значением байта переложим в STRING(1) // и отправим на верх. fncWord2String[0]:=pByte^;
Понимаю что тут нет двойных ковычек, неразрывных пробелов, переносов строк и т.д. Для меня это не критично, но если кто дополнит/упростит буду ОЧЕНЬ признателен.Код:FUNCTION UNICODE_TO_CP1251_1 : STRING // Строку WSTRING конвертим в STRING. VAR_INPUT wsIn : WSTRING(255); END_VAR VAR iCounter : WORD; wdlen : WORD; w_Char : WORD; wsBuff : STRING(254):=''; END_VAR // Таблица символов 1251. Символ и его соответствующий код. // https://ru.wikipedia.org/wiki/Windows-1251 // Введем ограничение на длину сообщения wdlen := MIN(255, INT_TO_WORD(Standard64.WLEN(wsIn))); FOR iCounter := 0 TO wdlen - 1 DO w_Char := TO_WORD(wsIn[iCounter]); (* ASCII диапазон 0x00–0x7F -> копируем как есть *) IF w_Char <= 16#7F THEN wsBuff:=Standard.CONCAT(wsBuff, fncWord2String(wdInPut:=w_Char)); (* Кириллица и спецсимволы CP1251: 0400–04FF и некоторые спецсимволы *) ELSIF (w_Char >= 16#0400) AND (w_Char <= 16#04FF) THEN (* Таблица маппинга UCS-2 -> CP1251 для кириллицы *) CASE w_Char OF 16#0410..16#042F: (* А–Я *) wsBuff:=Standard.CONCAT(wsBuff, fncWord2String(wdInPut:=w_Char - 848)); 16#0430..16#044F: (* а–я *) wsBuff:=Standard.CONCAT(wsBuff, fncWord2String(wdInPut:=w_Char - 848)); 16#0401: (* Ё *) wsBuff:=Standard.CONCAT(wsBuff, 'Ё'); 16#0451: (* ё *) wsBuff:=Standard.CONCAT(wsBuff, 'ё'); ELSE (* Нестандартные/редкие символы кириллицы -> пропускаем или заменяем *) wsBuff:=Standard.CONCAT(wsBuff, '?'); END_CASE; ELSE (* Символы вне CP1251 — пропускаем либо заменяем на '?' *) wsBuff:=Standard.CONCAT(wsBuff, '?'); END_IF; END_FOR; (* Передадим на верх полученную строку.*) UNICODE_TO_CP1251_1 := wsBuff;




Ответить с цитированием