Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: JibberHorse от 18 Февраля 2019, 15:23:25

Название: Кодировка русского языка при считывании из скриптов.
Отправлено: JibberHorse от 18 Февраля 2019, 15:23:25
Приветствую!

Такое вот "неудобство":

Если Description (Описание) или Units (ед.изм.) переменной сделаны на русском, то через скрипт они считываются в странной кодировке (кракозябрами). С описаниями на английском такого не происходит.
Может кто сталкивался?... Может в ОС надо какие то "особые" настройки сделать, чтобы русский стал русским )))

Название: Re: Кодировка русского языка при считывании из скриптов.
Отправлено: Simple-Scada от 18 Февраля 2019, 17:56:13
Здравствуйте.

Цитировать
то через скрипт они считываются в странной кодировке (кракозябрами).
Это значит, что Вы берёте описание не учитывая кодировку, либо неправильно складываете описание переменной со строкой другого типа (напр. AnsiString + UTF8String). Пришлите пример скрипта в котором возникает проблема. Мы напишем что нужно исправить.
Название: Re: Кодировка русского языка при считывании из скриптов.
Отправлено: pan2000 от 19 Февраля 2019, 01:15:44
При приведении строки к типу UTF8String ошибки возникают после символьных констант.
В скрипте приведена часть возможных ошибок, причем наличие/отсутствие ошибки связано с размером константы (один или более символов)
и её местом (начало и внутри строки).
Средство от ошибок - явное приведение типа константы функцией UTF8Encode().

Переменная sTest: описание - "Описание переменной", единица измерения - "Единица измерения", начальное значение - "Это строка".
Код: (delphi)
begin
// в примере строка приводится к типу UTF8String           выводимый текст
// строка начинается с односимвольной константы
  Text1.Text := 'Ё' + sTest.Description;                 // ЁРћРїРёСЃР°РЅРёРµ переменной

// строка начинается с многосимвольной константы
  Text2.Text := 'ЁЁЁ' + sTest.Description;               // ЁЁЁОписание переменной

// ЯВНОЕ ПРИВЕДЕНИЕ ТИПА
  Text3.Text := UTF8Encode('Ё') + sTest.Description;     // ЁОписание переменной

// константа завершает строку типа String
  Text4.Text := sTest.AsStr + ' Кракозябра';             // Это строка Кракозябра

// односимвольная константа внутри строки
  Text5.Text := sTest.Description + '%' + sTest.Units;   // Описание переменной%Единица измерения

// многосимвольная константа внутри строки
  Text6.Text := sTest.Description + '% ]' + sTest.Units; // Описание переменной% ]Единица измерения

// переменная как String
  Text7.Text := sTest.Description + ' = ' + sTest.AsStr;  // Описание переменной = Это строка

// переменная как UTF8string
  Text8.Text := sTest.Description + ' = ' + sTest.AsUTF8String;  // Описание переменной = Это строка
end.

       
Название: Re: Кодировка русского языка при считывании из скриптов.
Отправлено: JibberHorse от 19 Февраля 2019, 09:00:48
Спасибо!
UTF8Encode - на все доп.символы (типа '-', ' (', и т.д. и т.п.) в складываемой строке - ПОМОГ.
Название: Re: Кодировка русского языка при считывании из скриптов.
Отправлено: metamorphogenesis от 24 Мая 2021, 16:18:49
Помогите, пожалуйста, сориентироваться в кодировках.

С текстового файла считываю строки вида
Код
ФАМИЛИЯ ИМЯ ОТЧЕСТВО
ФАМИЛИЯ ИМЯ ОТЧЕСТВО
...
ФАМИЛИЯ ИМЯ ОТЧЕСТВО

моя задача - сделать из каждой строки файла строку 'Фамилия И. О.' и добавить ее в комбобокс (это парсинг предоставляемого файла строк с именами персонала).циклически прохожусь по строкам, делю каждую на слова и заношу их во временный tempStringList:
Код
ФАМИЛИЯ
ИМЯ
ОТЧЕСТВО

Написал скрипт, который капитализирует (делает большой только первую букву) слово, но в том месте, где у меня UTF8LowerCase - проблемы с кодировкой.
Код: (delphi)
for j := 2 to tempStringList[0].Length do     buffer := buffer + tempStringList[0][j];             // составляем буфер из первой строки списка начиная со второй буквы - АМИЛИЯ

buffer := tempStringList[0][1] + UTF8LowerCase(buffer);  // составляем буфер из первой буквы этой строки и имеющегося буфера в нижнем регистре - Ф + амилия - Фамилия

for j := 1 to tempStringList.Count - 1 do
    buffer := buffer + ' ' + tempStringList[j][1] + '.'; // дополняем буфер инициалами - Фамилия + И. + О. - Фамилия И. О.

ComboBox.AddItem(buffer);                                // переносим буфер в комбобокс
(https://i.ibb.co/sgbG2sD/image.png)
Название: Re: Кодировка русского языка при считывании из скриптов.
Отправлено: pan2000 от 24 Мая 2021, 20:08:53
Здравствуйте.

Необходимо явно указать преобразования типов.
Код: (delphi)
buffer := tempStringList[0][1] + UTF8ToString(UTF8LowerCase(UTF8Encode(buffer)));  // составляем буфер из первой буквы этой строки и имеющегося буфера в нижнем регистре - Ф + амилия - Фамилия

P.S. Цикл удаления 1-го символа фамилии можно заменить функцией UTF8Copy
Код: (delphi)
buffer := tempStringList[0][1] + UTF8ToString(UTF8LowerCase(UTF8Copy(UTF8Encode(tempStringList[0]), 2, tempStringList[0].Length - 1))); // Фамилия
Название: Re: Кодировка русского языка при считывании из скриптов.
Отправлено: metamorphogenesis от 25 Мая 2021, 08:07:04
про подстроки забыл совсем, и правда так проще, спасибо за решение!