A.M. Programování Mosaic 14. 5. 2020 7:48

Dobrý den, mám takový problém: když se snažím načíst hodnotu proměnné typu STRING pomoci TecoApi, tak hodnota se mi sice načte, ale místo české diakritiky vidím otázníky (vypadá že neumí to kódování Windows-1250). Zkoušel jsem to na CP-2000 (FW 3.2). Má to nějaké řešení?

Odpovědi 6

M.B. 28. 4. 2020 11:45

TecoApi zveřejňuje proměnné typu STRING ve stejném formátu v jakém jsou zadané v programu PLC. Pokud protistrana vyžaduje jiné kódování (typicky UTF-8) je potřeba STRING v tomto kódování zapsat i v uživatelském programu.

Pro konverzi kódování je možné použít funkce CP1250_TO_UTF8, CP1251_TO_UTF8, …  z knihovny ConvertLib

Pokud by se jednalo o vícejazyčné texty je možné pro jejich zadávání a správu použít nástroj LangMan.

A.M. 28. 4. 2020 17:49

Dobrý den, pišete:

TecoApi zveřejňuje proměnné typu STRING ve stejném formátu v jakém jsou zadané v programu PLC

V tom případě, jak nastavím Mosaic tak, aby použival UTF-8 defoltně pro všechny stringy?

 

M.B. 29. 4. 2020 17:38
Bohužel prostředí Mosaic nepodporuje přímo sadu UniCode. V editorech kódu kódování stringů odpovídá kódové stránce nastavené ve Windows pro programy nepodporující sadu UniCode. UTF-8 stringy je možné tvořit pomocí nástroje LangMan, dále pomocí konverzních funkcí z knihovny ConvertLib nebo použitím externího editoru podporujícího UniCode (v tomto posledním případě budou však v editoru prostředí texty s diakritikou obtížně čitelné).
A.M. 30. 4. 2020 9:28

Rozumím. V tom případě nevíte jestli by to šlo vyřešit na stráně žadatele (v mém případě webová stránka) ? 

Zkoušel jsem přidat do hlavičky HTML souboru, kde chi zobrazit výsledek dotazu na TecoApi, řádek <meta charset="windows-1250"> nebo přidat hlavičku Content-type: application/json; charset=windows-1250 přímo do GET dotazu ale výsledek je stejný.  

M.B. 30. 4. 2020 11:33

Záleží jak webová stránka data získává. Pokud je použitá metoda fetch je možné použít následující konverzi:

result = await fetch(apiUrl)
      .then(res => res.arrayBuffer())
      .then(arrayBuffer => {const myDecoder = new TextDecoder('windows-1250'); return myDecoder.decode(arrayBuffer).toString()})
      .then(converted => JSON.parse(converted));

Pokud bude v apiUrl adresa TecoApi, pak v proměnné result bude pak struktura, která obsahuje správně kódované stringy.

A.M. 5. 5. 2020 8:06

Děkuji. Budu zkoušet.

Tento dotaz je vyřešený.