Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Кодировка русского языка при считывании из скриптов.  (Прочитано 5651 раз)

JibberHorse

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Приветствую!

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

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


Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Здравствуйте.

Цитировать
то через скрипт они считываются в странной кодировке (кракозябрами).
Это значит, что Вы берёте описание не учитывая кодировку, либо неправильно складываете описание переменной со строкой другого типа (напр. AnsiString + UTF8String). Пришлите пример скрипта в котором возникает проблема. Мы напишем что нужно исправить.

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
При приведении строки к типу 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.

       

JibberHorse

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Спасибо!
UTF8Encode - на все доп.символы (типа '-', ' (', и т.д. и т.п.) в складываемой строке - ПОМОГ.

metamorphogenesis

  • Пользователь
  • **
  • Сообщений: 58
    • Просмотр профиля
Помогите, пожалуйста, сориентироваться в кодировках.

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

моя задача - сделать из каждой строки файла строку 'Фамилия И. О.' и добавить ее в комбобокс (это парсинг предоставляемого файла строк с именами персонала).циклически прохожусь по строкам, делю каждую на слова и заношу их во временный 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);                                // переносим буфер в комбобокс
« Изменён: 24 Мая 2021, 16:29:37 от metamorphogenesis »

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Здравствуйте.

Необходимо явно указать преобразования типов.
Код: (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))); // Фамилия
« Изменён: 25 Мая 2021, 07:43:11 от pan2000 »

metamorphogenesis

  • Пользователь
  • **
  • Сообщений: 58
    • Просмотр профиля
про подстроки забыл совсем, и правда так проще, спасибо за решение!