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

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

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

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

Сообщение Vapaamies » 12.12.2012 06:28:42

SSerge писал(а):Explorer работает, а вот консоль в XP определяется с такими именами более чем никак.

Создал файл 新幹線.txt, открыл консоль, дал команду dir. Иероглифы отобразились квадратиками, что лишь свидетельствует об отсутствии их начертаний в Lucida Console (у меня именно он). Если выделить квадратики на экране, скопировать и вставить в Word, будут видны исходные иероглифы.

SSerge писал(а):И, если уж уточнять, что работает - так на уровне только SP3.

Это работает минимум с NT4.

SSerge писал(а):Кстати, все помнят, что в апреле 2014 года завершится жизненный цикл Windows XP? :D

И она станет abandonware.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

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

Сообщение poiuyt555 » 12.12.2012 06:51:38

- LCL Используются неуникодные функции WinAPI

То есть получается, что есть и юникодный вариант, например, той же ShellExcecute, просто из под lazarus он недоступен на данный момент?
А то я думаю: как так сам виндоуз без проблем со всем работает, а тут приходится чуть-ли не для каждой функции что-то придумывать.

poiuyt555 чем окончились эксперименты? Любопытно - в чем загвоздка была?

По поводу символа - пока ничем, оставил как есть, пусть пока в xp будет квадратик, а по поводу fileAge - вроде определять стало корректно.
poiuyt555
новенький
 
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

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

Сообщение SSerge » 12.12.2012 07:40:14

poiuyt555 писал(а):просто из под lazarus он недоступен на данный момент?


в rtl fpc вполне доступна уникодная функция в "чистом виде". Имя ей - ShellExecuteW
Пользоваться никто не запрещает, как и остальными функциями WinApi.
Не забываем, что уникодным функциям нужны аргументы в виде нулль-терминированных строк в UCS2.

poiuyt555 писал(а):поводу fileAge - вроде определять стало корректно


Стандартная FileAge стала определять корректно, или код ее заново написали?
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение poiuyt555 » 12.12.2012 09:23:19

Стандартная FileAge стала определять корректно, или код ее заново написали?

Имею ввиду задача определения даты решилась, воспользовался вашим примером. саму ф-цию fileAge - не использую.

Не забываем, что уникодным функциям нужны аргументы в виде нулль-терминированных строк в UCS2.

То есть лучше ей не пользоваться? А попробовать, как вы советовали, TProcessUTF8?
Просто пока этим вопросом не занимался и не разбирался, что такое:нулль-терминированных строк в UCS2
poiuyt555
новенький
 
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

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

Сообщение SSerge » 12.12.2012 09:30:51

poiuyt555 писал(а):То есть лучше ей не пользоваться? А попробовать, как вы советовали, TProcessUTF8?


TProcessUTF8 будет проще в использовании; если сумеет взять ваши экзотические имена.
Пользоваться же можно всем что есть; если нужно.

poiuyt555 писал(а):что такое:нулль-терминированных строк в UCS2


Type WideString, из UTF8 туда надо правильно преобразовать; ну и структуры, возвращаемые WinApi, довольно своеобразны.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение poiuyt555 » 28.12.2012 07:07:20

1) А не подскажете, как узнать, что в строке есть такие символы "нехорошие", напр é в строке c:\é\myfile.lnk?
2) Вопрос теоретический: напр FileExistsUTF8 выполняет UTF8toANSI и затем FileExists.
Тогда получается в кодировке ANSI тоже есть символ é только с другим кодом, отличным от UTF8, раз в итоге функция FileExistsUTF8 срабатывает, или как?
3) Как выполнить команду CreateShortcut:
Код: Выделить всё
WShell,sht : OleVariant;
WShell := CreateOleObject('WScript.Shell');
sht := WShell.CreateShortcut('c:\é\myfile.lnk');

Что то вообще не получается, с какой строкой работает WScript.Shell CreateShortcut?
poiuyt555
новенький
 
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

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

Сообщение SSerge » 28.12.2012 09:55:39

poiuyt555 писал(а):2) Вопрос теоретический: напр FileExistsUTF8 выполняет UTF8toANSI и затем FileExists.


Неверно. Эта функция не выполняет преобразований, посмотрите на исходный код, вызывается FileGetAttrUTF8, которая на самом деле из себя представляет:
Код: Выделить всё
function FileGetAttrWide(const FileName: String): Longint;
begin
  Result:=Integer(Windows.GetFileAttributesW(PWideChar(UTF8Decode(FileName))));
end;



poiuyt555 писал(а):с какой строкой работает WScript.Shell CreateShortcut


Раз вы передаете символы, не имеющие отношения к Ansi, то строка по логике должна быть в кодировке UCS2 - хотя на самом деле всё исключительно определеяется тем, как написан ваш OleObject. Что в нем определено принимать, то он и принимает. Реального контроля над параметрами нет.

Добавлено спустя 1 минуту 2 секунды:
poiuyt555 писал(а):как узнать, что в строке есть такие символы "нехорошие", напр é в строке c:\é\myfile.lnk?


Например преобразовать в ANSI потом обратно в UTF8 и сравнить с исходной строкой, не?
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение poiuyt555 » 15.01.2013 07:57:31

Неверно. Эта функция не выполняет преобразований, посмотрите на исходный код, вызывается FileGetAttrUTF8, которая на самом деле из себя представляет:

Но я посмотрел в исходник: модуль: LazFileUtils
Код: Выделить всё
function FileExistsUTF8(const Filename: string): boolean;
begin
  Result:=SysUtils.FileExists(UTF8ToSys(Filename));
end;

Function FileExists (Const FileName : String) : Boolean;  // в другом модуле
var
  Attr:Dword;
begin
  Attr:=GetFileAttributes(PChar(FileName));
  if Attr <> $ffffffff then
    Result:= (Attr and FILE_ATTRIBUTE_DIRECTORY) = 0
  else
    Result:=False;
end;


Не нашел использование FileGetAttrWide.
poiuyt555
новенький
 
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

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

Сообщение SSerge » 15.01.2013 09:17:19

poiuyt555

winfileutil.inc, определение функции из FileUtils.pas

:D Что характерно, имеем ДВА набора одних и тех же функций с разной реализацией. FileUtils выглядит более корректным.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Пред.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru