Вопрос с символами unicode FileAgeUTF8

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

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

Вопрос с символами unicode FileAgeUTF8

Сообщение poiuyt555 » 07.12.2012 14:50:27

Здравствуйте.
2 вопроса:
1) В программе вывожу символ в одном из label.caption: ▲. на win7 выводится без проблем на xp вместо него выводит квадратик незаполненный.
Вопрос: в чем дело, как сделать чтобы на всех ОС выводил этот символ?

2) Если файл с русскими буквами и путем - тогда все нормально, но как быть, если например, в названии папки есть французские буквы.
Функция FileAgeUTF8 дает тогда -1?
Например: FileAgeUTF8('C:\é\1.jpg')
showmessage('C:\é\1.jpg') - выводит все правильно.
Всякие systoutf8 utf8decode - пробовал, но может не все.
Вопрос: как сделать, чтобы корректно сработало?
Ведь виндоуз сам нормально обрабатывает эти пути и символы - показывает и размер файла и т.д.
poiuyt555
новенький
 
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

Re: Вопрос с символами unicode FileAgeUTF8

Сообщение amateur » 07.12.2012 15:37:57

1)каким образом вы выводите треугольник?
2) что показывает, к примеру:
Код: Выделить всё
Label1.Caption := OpenDialog1.FileName
?
Аватара пользователя
amateur
энтузиаст
 
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Re: Вопрос с символами unicode FileAgeUTF8

Сообщение Vapaamies » 07.12.2012 20:13:16

poiuyt555 писал(а):ЗВопрос: как сделать, чтобы корректно сработало?

Попробовать установить поддержку азиатских языков на XP. Мне помогло с выводом стрелочки → в меню.

Установка азиатчины добавляет не только шрифты, но и дополнительные правила подстановки шрифтов в GDI. В наших случаях, скорее всего, срабатывает именно это. В Windows 7 поддержка азиатских языков стоит уже из коробки (часто помимо желания обычных пользователей, но на радость анимешникам), поэтому все и работает. Если вывод спецсимвола настолько критичен и установка азиатчины решит проблему, можно поставить в обязательные требования к программе.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Вопрос с символами unicode FileAgeUTF8

Сообщение poiuyt555 » 10.12.2012 06:49:43

Треугольник выводим: label1.caption:='▲'; или сразу в инспекторе объектов.

Label1.Caption := OpenDialog1.FileName; - выводит правильный путь: 'C:\é\1.jpg'
То есть вопрос: как корректно работать с файлом в пути , или в имени которого есть буквы других алфавитов (не рус и анг.)?
poiuyt555
новенький
 
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

Re: Вопрос с символами unicode FileAgeUTF8

Сообщение Gust » 10.12.2012 11:50:17

В чем-то похожая проблема (по пункту 2) описана здесь.
Gust
новенький
 
Сообщения: 14
Зарегистрирован: 04.03.2011 11:45:24

Re: Вопрос с символами unicode FileAgeUTF8

Сообщение amateur » 10.12.2012 11:58:01

1. Т.е. просто копи-пасте, а не код символа, в этом, возможно и проблема.

Код: Выделить всё
  Label2.Caption := Char(19) + '  hhhhhhhhhh';
если у Вас будет квадрат, то ... я прав :)

2. Если OpenDialog1.FileName показывает правильный путь значит:
Всякие systoutf8 utf8decode - пробовал, но может не все.
не так пробывали, возможно надо
Код: Выделить всё
строка := UTF8ToSys(OpenDialog1.FileName)

По крайней мере у меня: "..\aaf_(привет#_2@ttіііі\файл" и тому подобные открываются.
Кстати: данный вопрос уже был на форуме

п.с. Если Вы работаете с ютф то, у Вас все должно быть ютф (хотя первоначально может быть какое угодно). А что бы узнать что Вам показывает лазарь выводите на экран. Хоть в лазаре ютф но не все...
Аватара пользователя
amateur
энтузиаст
 
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Re: Вопрос с символами unicode FileAgeUTF8

Сообщение poiuyt555 » 10.12.2012 12:15:35

1) да по копи-паст. Была мысль вставлять по коду символа, но это, как я понимаю, utf-символ.
Какой командой вывести данный символ по коду?

2) UTF8ToSys UTF8ToAnsi - не помогают - все равно -1.
Выяснил!: команда FileSize - КОРРЕКТНО работает и возвращает правильный размер с таким путем, а FileAge или FileAgeUTF8 - не "понимают" такой путь.
То есть, видимо, можно как-то сделать, чтобы корректно такие пути обрабатывались.
poiuyt555
новенький
 
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

Re: Вопрос с символами unicode FileAgeUTF8

Сообщение SSerge » 10.12.2012 12:28:32

poiuyt555 писал(а):2) UTF8ToSys UTF8ToAnsi - не помогают


Вы все таки уясните для себя, что эти функции делают. А именно - преобразование из UTF в пределах таблиц преобразования, действующих в текущей локали операционной системы. Все знаки, находящиеся за пределами, либо будут выброшены, либо преобразованы в знак вопроса.
Давайте все таки запустим отладчик, и после каждого преобразования будем смотреть на результаты, тогда все прояснится.

И, пожалуйста, сообщите сообществу наконец unicode код вашей злосчастной буковки, а то даже и повторить задачу при желании не удастся.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Вопрос с символами unicode FileAgeUTF8

Сообщение poiuyt555 » 10.12.2012 13:01:48

Нашел на каком-то сайте ее код:
é
Латинская строчная буква e с актом
Номер в юникоде: 00E9
poiuyt555
новенький
 
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

Re: Вопрос с символами unicode FileAgeUTF8

Сообщение SSerge » 10.12.2012 13:38:50

ыыы...
Опаньки, я был прав :D

Операция FindFirst, через которую производится поиск файла с указанным именем в реализации функции FileAge, неспособна возвратить в названии каталога и файла символы, не относящиеся к текущей локали операционной системы

Ради интереса можете скомпилировать и запустить в интересующих каталогах

Код: Выделить всё
Program Example43;
{$mode objfpc}
{$H+}

Uses SysUtils;

Var Info : TSearchRec;
    Count : Longint;

function NameToHex(name:string):string;
Var i:integer;
begin
  result:='';
  for i:=1 to length(name) do begin
     result:=result+format(' %x',[ord(name[i])]);
  end;
end;


Begin
  Count:=0;
  If FindFirst ('*',faAnyFile and faDirectory,Info)=0 then 
    begin
    Repeat
      Inc(Count);
      With Info do
        begin
        If (Attr and faDirectory) = faDirectory then
          Write('Dir : ');
        Writeln (Name:40,Size:15,NameToHex(Name):60);
        end;
    Until FindNext(info)<>0;
    end;
  FindClose(Info);
  Writeln ('Finished search. Found ',Count,' matches');

End.



смотрим на шестнадцатиричное представление справа. У меня это, впрочем, нестабильный fpc, проверьте пожалуйста на релизном 2.6.0
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Вопрос с символами unicode FileAgeUTF8

Сообщение amateur » 10.12.2012 13:54:58

э:
Код: Выделить всё
if OpenDialog1.Execute then begin
    Label2.Caption := IntToStr(FileAgeUTF8(OpenDialog1.FileName));
  end;


путь к файлу "...\Sergey.Sin.Привіт#$\файл", Label2.Caption > 1. Что я сделал не так?
Аватара пользователя
amateur
энтузиаст
 
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Re: Вопрос с символами unicode FileAgeUTF8

Сообщение SSerge » 10.12.2012 14:02:30

amateur писал(а):Что я сделал не так?



Я, например использовал #$E2#$E5#$E8#$E6 (âåèæ)
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Вопрос с символами unicode FileAgeUTF8

Сообщение amateur » 10.12.2012 14:06:12

ээ:
неспособна возвратить в названии каталога и файла символы
у меня возвращает...
фпс 2.6.0 лаз 1.1, семерка. Кажись система плоха :?
Аватара пользователя
amateur
энтузиаст
 
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Re: Вопрос с символами unicode FileAgeUTF8

Сообщение SSerge » 10.12.2012 14:24:01

Специально откомпилировал примерчик релизным 2.6.0. Результаты те же - конверсит âåèæ вот в это: aae? т.е. в hex: 61 61 65 3F

Под XP, кстати, имечко точно так же выглядит и для самой операционной системы. Так что уже нет обратной совместимости. Сама windows нормально отображает - âåèæ, FAR commander и Double Commander - тоже (под семеркой). Win 7 x64
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Вопрос с символами unicode FileAgeUTF8

Сообщение poiuyt555 » 10.12.2012 14:28:03

Операция FindFirst, через которую производится поиск файла с указанным именем в реализации функции FileAge, неспособна возвратить в названии каталога и файла символы, не относящиеся к текущей локали операционной системы


Получается, что в данном случае FileAge не подходит в принципе.

Тогда какая подходит? Может быть есть нужная winapi?

Думаю, что есть функции, которые могут работать с такими путями, так как во первых сама виндоуз корректно все отображает.

Кстати та же проблема с ShellExcecute - тоже не получается запустить с такими символами.

у меня возвращает...

То есть у вас поучилось удачно вывести дату по FileAge?
poiuyt555
новенький
 
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 239

Рейтинг@Mail.ru