AnsiToUtf8 и Utf8ToAnsi, не понимаю, где ошибаюсь

ZeroHold
Дата: 28.06.2009 12:02:36
Исходный файл в Utf8. содержит типа: "Р РчР_акС'Р_С_"
Delphi 2009.
Требуется: произвести несколько манипуляций с utf файлов и сохранить изменения при этом отобразить изменения в TRichEdit;
var rich_in: TRichEdit;
...
rich_in.Lines.LoadFromFile(list.Strings[it]);// загрузить utf8 файл, с русскими буквами
s:=Utf8ToAnsi(rich_in.Lines.Text);// <- преобразует правильно
rich_in.Lines.Text:=s;// отображает верно
// манипуляции
s:=AnsiToUtf8(rich_in.Lines.Text);// <- не преобразует в utf
rich_in.Lines.Text:=s;// отображает без преобразования
rich_in.Lines.SaveToFile(list.Strings[it]+'1');

пробовал через SelAttrinbutes - эффект тот же
не пойму, где ошибаюсь. Почему не преобразуется обратно в UTF или это специфика RichEdit.
Спасибо.
Anatoly Podgoretsky
Дата: 28.06.2009 12:15:23
Это специфика Д2009 - она у тебя Юникодовая, кроме того UTF8String это совсем не то что в младших версиях. Попробуй объявить переменную данного типа и сделать простое присваивание. Не требуется в Юникод программе функция Utf8ToAnsi и обратно.

--
http://www.podgoretsky.com
ZeroHold
Дата: 28.06.2009 12:39:10
Anatoly Podgoretsky,

Эффект тот же.
при условии если s: string; или s: UTF8String;
причем если в TRichEdit загрузить utf8 файл и не проводить никаким манипуляций то при сохранении все путем и файл остается utf8.
значит 100% где то в конвертации дело. :(
Альт
Дата: 28.06.2009 12:45:19
А с чего вы взяли, что у вас в Lines.Text плавающая кодировка, а не стабильные utf? Вас смутило прозрачное приведение к utf на не выделенной строке?
+
s:=Utf8ToAnsi(rich_in.Lines.Text);// <- преобразует правильно
rich_in.Lines.Text:=s;// отображает верно
....
s:=AnsiToUtf8(rich_in.Lines.Text);// <- не преобразует в utf
ZeroHold
Дата: 28.06.2009 13:05:40
Альт,

потому что после строки
s:=Utf8ToAnsi(rich_in.Lines.Text);// <- преобразует правильно
крокозяблы превращаются в читабельный вид.

Нашел следующее:
var code: TEncoding;
begin
  code:=TEncoding.UTF8;
  rich_in.Lines.LoadFromFile(list.Strings[it],code);// utf8 файл, с русскими буквами, грузится уже с преобразованными крокозабликами в читабельный вид
... манипуляции
  rich_in.Lines.SaveToFile(list.Strings[it]+'1',code);// сохраняет в првильном виде с крокозябликами utf8
end;
но новый фикус
1. Добавляет загрузчик BOM (который не нужен)
2. Файл отличается на цельных 20 байт если сохранять в один в один без каких либо изменений
ZeroHold
Дата: 28.06.2009 14:23:14
ZeroHold,

Прикрепляю результат изменения.
открываю и тут же закрываю файл без каких либо манипуляций.
на маленьких файлах проблем нет. на больших возникают непонятные левые символы и чем больше файл тем чаще они появляются. может кто сталкивался ? или знает какое свойство изменить в Trichedit?
ZeroHold
Дата: 28.06.2009 14:25:11
ZeroHold,

речь не идет про BOM загрузчик
ZeroHold
Дата: 28.06.2009 14:38:19
ZeroHold,

хммм...
Изменил основной компонент rich_in с типа TRichEdit на Tmemo - проблема пропала! то есть любые файлы ковертируются все кичи пики. Сохраняет правда BOM заголовок но убрать его это уже не проблема.
Я так понимаю это проблема получается в компоненте TRichEdit ? или все же в его настройках?
Если в компоненте подскажите кому написать о таком баге?