FPC+TStringList+UTF8
Модератор: Модераторы
FPC+TStringList+UTF8
Делаю кроссплатформенный код и мне нужно, чтобы в винде TStringList работал со строками в кодировке UTF8.
Я в этот компонент принимаю набор строк с сервера в этой кодировке. Нужно провести несколько обработок и отправить обратно на сервер. В Линуксе проблем нет, а вот в винде вместо строки получаю нечто из двойных байт. Дальше как со строками работать уже не удаётся...
Что посоветуете?
Я в этот компонент принимаю набор строк с сервера в этой кодировке. Нужно провести несколько обработок и отправить обратно на сервер. В Линуксе проблем нет, а вот в винде вместо строки получаю нечто из двойных байт. Дальше как со строками работать уже не удаётся...
Что посоветуете?
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Re: FPC+TStringList+UTF8
Что-то не так в коде преобразования. Я только с этой кодировкой и работаю в Windows TStringList. Собственно компоненту StringList по большому счету все равно какая у него кодировка однобайтная или UTF8. То есть проблема у вас не в TStringList.
Добавлено спустя 1 минуту 7 секунд:
Добавлено спустя 1 минуту 7 секунд:
Вы это как определили? С помощью какого средства или визуального компонента?а вот в винде вместо строки получаю нечто из двойных байт
Re: FPC+TStringList+UTF8
Ichthyander писал(а):Вы это как определили?
С помощью сохранения в текстовый файл.
Забыл сказать: FPC версии 3.0.4.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Re: FPC+TStringList+UTF8
Если переоткрыть этот файл в кодировке UTF8, что произойдет? Каким блокнотом/редактором смотрите? Некоторые текстовые редакторы в Windows понимают только с BOM метками файлы. То есть если в Linux текстовый файл по умолчанию предполагается как UTF8, то в Windows по умолчанию идет местная Ansi. Блокнот Windows поэтому помечает такие файлы BOM (из-за чего к слову раньше бывали конфликты)
Добавлено спустя 48 секунд:
Не важно. Скорее всего у Вас все в порядке. Просто выберите кодировку в блокноте/редакторе
Добавлено спустя 48 секунд:
Vadim писал(а):Забыл сказать: FPC версии 3.0.4.
Не важно. Скорее всего у Вас все в порядке. Просто выберите кодировку в блокноте/редакторе
Re: FPC+TStringList+UTF8
В транк версии ввели "понятие" DefaultEncoding. Т.е. можно TStrings указать с какой кодировкой работать. Иначе каша получается.
В стабильной можно попробовать:
1. LazUTF8Classes - TStringListUTF8;
2. Или указывать TEncode при загрузке строк.
В стабильной можно попробовать:
1. LazUTF8Classes - TStringListUTF8;
2. Или указывать TEncode при загрузке строк.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Re: FPC+TStringList+UTF8
TStringListUTF8 прекрасно работает в винде.
- wofs
- постоялец
- Сообщения: 379
- Зарегистрирован: 05.10.2009 10:16:55
- Откуда: Астрахань
- Контактная информация:
Re: FPC+TStringList+UTF8
Снег Север писал(а):TStringListUTF8 прекрасно работает в винде.
Вот чего бы не сделать ключик компилятора, что бы ВСЕ функции/объекты работы со строками по умолчанию брались UTF8 версии.
Re: FPC+TStringList+UTF8
Да по сути утверждение
И сохранение в файл - это не совсем правильное решение. Возможно TStringList уже получил нечто невразумительное.
Просто смущает факт:
вполне таки верно.Собственно компоненту StringList по большому счету все равно какая у него кодировка однобайтная или UTF8. То есть проблема у вас не в TStringList.
И сохранение в файл - это не совсем правильное решение. Возможно TStringList уже получил нечто невразумительное.
Просто смущает факт:
. Три вопроса мешают: что, где, как. Т.о. есть фактор неизвестности. Поэтому считаю что в сам TStringList "приходят" валидные строки.Я в этот компонент принимаю набор строк с сервера в этой кодировке.
Re: FPC+TStringList+UTF8
Vadim писал(а):Не важно. Скорее всего у Вас все в порядке. Просто выберите кодировку в блокноте/редакторе
Что касается блокнота винды - не знаю, как в Вынь 10, но в старых версиях системы блокнот считает, что если в файле нет BOM, то он не Юникодный, и изменить такое поведение нельзя. Выбор кодировки в блокноте тут не поможет. В стринглисте явно не хватает опции добавления/отключения BOM.
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Re: FPC+TStringList+UTF8
slyubez писал(а):В стринглисте явно не хватает опции добавления/отключения BOM.
TStringList.WriteBOM - Именно так и назвали
В текущей 3.1.1
Re: FPC+TStringList+UTF8
alexs писал(а):TStringList.WriteBOM - Именно так и назвали
В текущей 3.1.1
А что текущий TStringList делает при обнаружении BOM в читаемом файле? Ничего, как и ранее? Или же выбрасывает BOM из полезной информации и меняет кодировку?
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Re: FPC+TStringList+UTF8
Там можно разное поведение задать
Можно игнорировать всё
Можно указать руками кодировку
А можно и читать файл в соответствии с BOM
Посмотри исходники:
Можно игнорировать всё
Можно указать руками кодировку
А можно и читать файл в соответствии с 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;
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Re: FPC+TStringList+UTF8
slyubez писал(а):Что касается блокнота винды - не знаю, как в Вынь 10, но в старых версиях системы блокнот считает, что если в файле нет BOM, то он не Юникодный, и изменить такое поведение нельзя. Выбор кодировки в блокноте тут не поможет. В стринглисте явно не хватает опции добавления/отключения BOM.
Разве что в Win98. Давно не пользовался им, но когда пользовался уже была возможность выбора кодировки UTF8, даже если не BOM. Но по умолчанию - да, считает, что локальный Ansi...
Ну, и к слову, я имел ввиду необязательно блокнот Windows и думаю уж вряд ли топикстартер им пользуется раз уж кодер, тем более работает с Lazarus'ом.
А вообще я рекомендую CudaText в качестве редактора
Re: FPC+TStringList+UTF8
В самом TStringList кодировка строк 100% UTF-8. К примеру, если сделать Utf8ToAnsi() - то в винь кодировке я читаю то, что там хранится.
Проблема в том, что мне надо произвести поиск в этих строках по определённому шаблону и если этот шаблон в UTF-8, найти ничего не удаётся. В Линуксе тот же самый код отлично работает. При перекодировке в 1251 или в 866 тоже все сравнения с шаблоном происходят прекрасно. Мне бы хотелось не пользоваться дополнительными преобразованиями.
Проблема в том, что мне надо произвести поиск в этих строках по определённому шаблону и если этот шаблон в UTF-8, найти ничего не удаётся. В Линуксе тот же самый код отлично работает. При перекодировке в 1251 или в 866 тоже все сравнения с шаблоном происходят прекрасно. Мне бы хотелось не пользоваться дополнительными преобразованиями.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Re: FPC+TStringList+UTF8
Ну, собственно как я и говорил в самом начале проблема не в StringList. Что Вы имеет ввиду под поиск в строках по определенному шаблону? Значит шаблон этот не в UTF8 почти наверняка.
То есть объясните вот эту Вашу проблему более развернуто
То есть объясните вот эту Вашу проблему более развернуто
мне надо произвести поиск в этих строках по определённому шаблону и если этот шаблон в UTF-8, найти ничего не удаётся.
