FPC+TStringList+UTF8

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

FPC+TStringList+UTF8

Сообщение Vadim » 26.03.2018 13:24:20

Делаю кроссплатформенный код и мне нужно, чтобы в винде TStringList работал со строками в кодировке UTF8.
Я в этот компонент принимаю набор строк с сервера в этой кодировке. Нужно провести несколько обработок и отправить обратно на сервер. В Линуксе проблем нет, а вот в винде вместо строки получаю нечто из двойных байт. Дальше как со строками работать уже не удаётся...
Что посоветуете?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: FPC+TStringList+UTF8

Сообщение Ichthyander » 26.03.2018 14:55:56

Что-то не так в коде преобразования. Я только с этой кодировкой и работаю в Windows TStringList. Собственно компоненту StringList по большому счету все равно какая у него кодировка однобайтная или UTF8. То есть проблема у вас не в TStringList.

Добавлено спустя 1 минуту 7 секунд:
а вот в винде вместо строки получаю нечто из двойных байт
Вы это как определили? С помощью какого средства или визуального компонента?
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: FPC+TStringList+UTF8

Сообщение Vadim » 26.03.2018 18:27:33

Ichthyander писал(а):Вы это как определили?

С помощью сохранения в текстовый файл.

Забыл сказать: FPC версии 3.0.4.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: FPC+TStringList+UTF8

Сообщение Ichthyander » 26.03.2018 18:32:11

Если переоткрыть этот файл в кодировке UTF8, что произойдет? Каким блокнотом/редактором смотрите? Некоторые текстовые редакторы в Windows понимают только с BOM метками файлы. То есть если в Linux текстовый файл по умолчанию предполагается как UTF8, то в Windows по умолчанию идет местная Ansi. Блокнот Windows поэтому помечает такие файлы BOM (из-за чего к слову раньше бывали конфликты)

Добавлено спустя 48 секунд:
Vadim писал(а):Забыл сказать: FPC версии 3.0.4.

Не важно. Скорее всего у Вас все в порядке. Просто выберите кодировку в блокноте/редакторе
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: FPC+TStringList+UTF8

Сообщение pupsik » 26.03.2018 18:47:43

В транк версии ввели "понятие" DefaultEncoding. Т.е. можно TStrings указать с какой кодировкой работать. Иначе каша получается.

В стабильной можно попробовать:
1. LazUTF8Classes - TStringListUTF8;
2. Или указывать TEncode при загрузке строк.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: FPC+TStringList+UTF8

Сообщение Снег Север » 26.03.2018 20:41:35

TStringListUTF8 прекрасно работает в винде.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2990
Зарегистрирован: 27.11.2007 16:14:47

Re: FPC+TStringList+UTF8

Сообщение wofs » 27.03.2018 18:11:07

Снег Север писал(а):TStringListUTF8 прекрасно работает в винде.

Вот чего бы не сделать ключик компилятора, что бы ВСЕ функции/объекты работы со строками по умолчанию брались UTF8 версии.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: FPC+TStringList+UTF8

Сообщение pupsik » 27.03.2018 19:48:09

Да по сути утверждение
Собственно компоненту StringList по большому счету все равно какая у него кодировка однобайтная или UTF8. То есть проблема у вас не в TStringList.
вполне таки верно.
И сохранение в файл - это не совсем правильное решение. Возможно TStringList уже получил нечто невразумительное.

Просто смущает факт:
Я в этот компонент принимаю набор строк с сервера в этой кодировке.
. Три вопроса мешают: что, где, как. Т.о. есть фактор неизвестности. Поэтому считаю что в сам TStringList "приходят" валидные строки.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: FPC+TStringList+UTF8

Сообщение slyubez » 28.03.2018 07:34:45

Vadim писал(а):Не важно. Скорее всего у Вас все в порядке. Просто выберите кодировку в блокноте/редакторе

Что касается блокнота винды - не знаю, как в Вынь 10, но в старых версиях системы блокнот считает, что если в файле нет BOM, то он не Юникодный, и изменить такое поведение нельзя. Выбор кодировки в блокноте тут не поможет. В стринглисте явно не хватает опции добавления/отключения BOM.
slyubez
постоялец
 
Сообщения: 173
Зарегистрирован: 31.03.2015 08:44:07

Re: FPC+TStringList+UTF8

Сообщение alexs » 28.03.2018 09:29:04

slyubez писал(а):В стринглисте явно не хватает опции добавления/отключения BOM.

TStringList.WriteBOM - Именно так и назвали :-)
В текущей 3.1.1
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4051
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: FPC+TStringList+UTF8

Сообщение SSerge » 28.03.2018 10:42:09

alexs писал(а):TStringList.WriteBOM - Именно так и назвали :-)
В текущей 3.1.1


А что текущий TStringList делает при обнаружении BOM в читаемом файле? Ничего, как и ранее? Или же выбрасывает BOM из полезной информации и меняет кодировку?
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: FPC+TStringList+UTF8

Сообщение alexs » 28.03.2018 10:49:16

Там можно разное поведение задать
Можно игнорировать всё
Можно указать руками кодировку
А можно и читать файл в соответствии с BOM
Посмотри исходники:
Код: Выделить всё
    procedure LoadFromFile(const FileName: string); overload; virtual;
    procedure LoadFromFile(const FileName: string; IgnoreEncoding : Boolean);
    procedure LoadFromFile(const FileName: string; AEncoding: TEncoding); overload; virtual;
    procedure LoadFromStream(Stream: TStream); overload; virtual;
    procedure LoadFromStream(Stream: TStream; IgnoreEncoding : Boolean); overload;
    procedure LoadFromStream(Stream: TStream; AEncoding: TEncoding); overload; virtual;
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4051
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: FPC+TStringList+UTF8

Сообщение Ichthyander » 28.03.2018 13:25:41

slyubez писал(а):Что касается блокнота винды - не знаю, как в Вынь 10, но в старых версиях системы блокнот считает, что если в файле нет BOM, то он не Юникодный, и изменить такое поведение нельзя. Выбор кодировки в блокноте тут не поможет. В стринглисте явно не хватает опции добавления/отключения BOM.

Разве что в Win98. Давно не пользовался им, но когда пользовался уже была возможность выбора кодировки UTF8, даже если не BOM. Но по умолчанию - да, считает, что локальный Ansi...
Ну, и к слову, я имел ввиду необязательно блокнот Windows и думаю уж вряд ли топикстартер им пользуется раз уж кодер, тем более работает с Lazarus'ом.
А вообще я рекомендую CudaText в качестве редактора
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: FPC+TStringList+UTF8

Сообщение Vadim » 28.03.2018 13:59:32

В самом TStringList кодировка строк 100% UTF-8. К примеру, если сделать Utf8ToAnsi() - то в винь кодировке я читаю то, что там хранится.
Проблема в том, что мне надо произвести поиск в этих строках по определённому шаблону и если этот шаблон в UTF-8, найти ничего не удаётся. В Линуксе тот же самый код отлично работает. При перекодировке в 1251 или в 866 тоже все сравнения с шаблоном происходят прекрасно. Мне бы хотелось не пользоваться дополнительными преобразованиями.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: FPC+TStringList+UTF8

Сообщение Ichthyander » 28.03.2018 14:41:15

Ну, собственно как я и говорил в самом начале проблема не в StringList. Что Вы имеет ввиду под поиск в строках по определенному шаблону? Значит шаблон этот не в UTF8 почти наверняка.
То есть объясните вот эту Вашу проблему более развернуто
мне надо произвести поиск в этих строках по определённому шаблону и если этот шаблон в UTF-8, найти ничего не удаётся.
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Google Adsense [Bot] и гости: 5

Рейтинг@Mail.ru
cron