UTF8 и система...

Вопросы программирования и использования среды Lazarus.

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

UTF8 и система...

Сообщение vitaly_l » 19.03.2012 12:32:52

как определить когда нужно UTF8ToSys, и когда применять UTF8Encode итд?
Короче при разных стечениях (в том числе при обращении в реестр) - возвращает битый путь (Русские символы)...
Если UTF8Encode, то путь нормальный. Однако если его повторно UTF8Encode или UTF8ToSys, то путь опять битый...
При этом часть стандартных функций самостоятельно используют UTF8Encode или UTF8ToSys, а часть нет...

Единственный, (на мой взгляд): выход - это заранее определять, в какой кодировке путь.

:?: Как определить в какой кодировке строка?
:?: Как определить если половина строки в другой кодировке?
:?: Возможно есть иные (более правильные) варианты?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: UTF8 и система...

Сообщение dunin » 19.03.2012 14:25:50

Все, что "внутри" Лазаруса - в кодировке UTF8.
Все, что снаружи на диске (пути и имена файлов) - в системной кодировке (как правило, если Виндус - то ANSI, если Линукс - то UTF8).
Все, что в базе данных - в кодировке заданной в базе данных.
Содержимое внешнего файла может быть в любой кодировке.

Вот отсюда и исходим:
- при обращению к файловой системе UTF8ToSys (и в другую сторону) лишним не будет;
- при работе с БД смотрим свойства БД;
- ковыряя файл есть смысл определить его кодировку заранее.
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: UTF8 и система...

Сообщение vitaly_l » 19.03.2012 14:44:54

dunin писал(а):Все, что "внутри" Лазаруса - в кодировке UTF8.

Это точно??? Он(lazarus) всегда любой текст автоматически: читает, обрабатывает и сохраняет в UTF8??? (охотно верю)
Теперь понятно почему он(lazarus) сам не определяет в какой кодировке путь (при обращении к "внешним" файлам)...
Тобишь UTF8ToSys и UTF8Encode - сами определяют кодировку, а я просто их неверно применил...???
Так? ("ДА" / "НЕТ") ?!
Если "ДА", то почему он(lazarus) - не определяет, что строка в UTF8???
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: UTF8 и система...

Сообщение dunin » 19.03.2012 14:57:57

vitaly_l писал(а):
dunin писал(а):Все, что "внутри" Лазаруса - в кодировке UTF8.

Это точно??? Он(lazarus) всегда любой текст автоматически: читает, обрабатывает и сохраняет в UTF8??? (охотно верю)
Теперь понятно почему он(lazarus) сам не определяет в какой кодировке путь (при обращении к "внешним" файлам)...
Тобишь UTF8ToSys и UTF8Encode - сами определяют кодировку, а я просто их неверно применил...??? Так? Да / нет?!

Бывают исключения, когда файл в редакторе в другой кодировке. Например кодер поленился скопипасить и просто открыл файл из дельфевого проекта или древняя версия Лазаруса, но это редкость. Проверить - контекстсное меню в редакторе - там поискать где-то есть про кодировки. UTF8ToSys сам определяет системную кодировку, главное не напутать в какую сторону его применять, т.е. где UTF8ToSys, а где SysToUTF8. Что делает UTF8Encode сам до конца не понимаю, использую его при работе с XML-инами.
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: UTF8 и система...

Сообщение vitaly_l » 19.03.2012 15:07:56

dunin писал(а): UTF8ToSys, а где SysToUTF8


Вот пример в windows:
s : UTF8string;

s := {UTF8Encode(}SelectDirectoryDialog1.FileName{)};
ShowMessage(s);

Если "раскоментить", то будут кракозябры...

если SysToUTF8, то всё нормально...
я ложно взял UTF8Encode...
Однако из реестра он(UTF8Encode) Encod-ирует правильно...

СПАСИБО добрый dunin.
.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: UTF8 и система...

Сообщение Odyssey » 19.03.2012 22:22:32

vitaly_l писал(а):Как определить в какой кодировке строка?

Обычно это не определяют, а стараются знать наверняка. Как - см. пост dunin, и заметку ниже. Теоретически, можно попытаться угадать кодировку (см. функцию GuessEncoding из модуля LConvEncoding), но это накладно по ресурсам и не на 100% надёжно (т.е. алгоритм определения может ошибиться).
vitaly_l писал(а):Как определить если половина строки в другой кодировке?

Такого нельзя допускать, получится некорректная строка. Перебирать все возможные варианты сочетания частей во всех возможных кодировках слишком ресурсоёмко.
vitaly_l писал(а):Возможно есть иные (более правильные) варианты?

Да: знать какая функция с какой кодировкой работает, и какая переменная строку в какой кодировке хранит. В будущих версиях FPC, возможно, появятся строки, которые сами "знают" о том, в какой кодировке хранятся, но пока за кодировкой нужно следить нам самим.

vitaly_l писал(а):При этом часть стандартных функций самостоятельно используют UTF8Encode или UTF8ToSys, а часть нет...

Те, что являются частью Lazarus - используют. Те что являются частью FPC - нет. Проверить просто. Нужно зажать на клавиатуре Ctrl и щёлкнуть мышкой на интересующую функцию. Откроется модуль, в котором она описана. В редакторе кода Lazarus в правом нижнем углу указан путь к текущему модулю. Если этот модуль лежит в папке Lazarus'а - функция почти наверняка использует UTF8ToSys сама (в этом можно убедиться, посмотрев её код). Если файл лежит в папке исходного кода FPC, то функция в нём не использует UTF8ToSys, а работает с системной кодировкой. Если файл исходного кода не открылся - это внутренняя функция компилятора, и тоже не использует UTF8ToSys.

vitaly_l писал(а):Тобишь UTF8ToSys и UTF8Encode - сами определяют кодировку, а я просто их неверно применил...???
Так? ("ДА" / "НЕТ") ?!

НЕТ, сами не определяют.
dunin писал(а):Что делает UTF8Encode сам до конца не понимаю, использую его при работе с XML-инами.

UTF8Encode преобразует WideString (UCS2, UTF-16) в UTF-8.
UTF8Decode, наоборот, преобразует UTF-8 в WideString (UCS2, UTF-16).
Поскольку FCL-XML использует именно WideString, при работе с этой библиотекой из проектов Lazarus приходится вызывать эти функции.
Ещё WideString используется в вызовах WinAPI-функций, поддерживающих Unicode (тех, которые заканчиваются на W).
Если WideString не используется, UTF8Encode/UTF8Decode ни к чему.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: UTF8 и система...

Сообщение vitaly_l » 19.03.2012 22:49:00

Odyssey писал(а):Те, что являются частью Lazarus - используют. Те что являются частью FPC - нет... В редакторе кода Lazarus в правом нижнем углу

СПАСИБО добрый Odyssey

Я нашёл, у Лазаруса, есть функция по определению кодировок...
(это волшебно, но в Лазарусе всегда, есть всё необходимое... просто нужно найти...).
:!: см. ищи юнит LConvEncoding
:arrow: там функция function ConvertEncoding(const s, FromEncoding, ToEncoding: string): string;
:arrow: а на самом деле вот эта ---> GetDefaultTextEncoding
Последний раз редактировалось vitaly_l 20.03.2012 10:18:18, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: UTF8 и система...

Сообщение dunin » 20.03.2012 02:38:12

Odyssey писал(а):...
UTF8Encode преобразует WideString (UCS2, UTF-16) в UTF-8.
UTF8Decode, наоборот, преобразует UTF-8 в WideString (UCS2, UTF-16).
...

Я всегда подозревал, что для чего-то это все-таки нужно. 8)
Спасибо.
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и


Вернуться в Lazarus

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

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

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