Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверить наличие Русского языка на сервере 
:(
    Опции темы
lollollollol
Дата 28.1.2014, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Всем добрый день/вечер/ночь/утро,  подскажите как Проверить наличие Русского языка на сервере?

Т.е. нужна функция, чтото типа 

function RusLang:boolean;

Проблема в том что я не представляю к каким api функциям можно обратиться для этого.
PM MAIL   Вверх
Illusion Dolphin
Дата 28.1.2014, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Цитата

Проверить наличие Русского языка на сервере?

Некорректный вопрос. Что значит "есть русский"? Вам надо язык всех надписей узнать на русском или нет? 


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
lollollollol
Дата 28.1.2014, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



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

Мне нужно функцию которая програмно определит, поддерживается ли русский язык сервером.


т.е. возьми любой  Windows  VPS сервер купленный у зарубежного хостера, и попробуй напечатать(или скопировать из буфера) в блокнот русский текст.
Если там нет русского языка, текст отобразится не корректно. Вот это и нужно проверить программно 
PM MAIL   Вверх
Illusion Dolphin
Дата 28.1.2014, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



(facepalm) 

Если у вас проблемы с кодировкой Ansi-Unicode то просто настройте кодовую страницу по умолчанию на русскую в региональных настройках. А лучше не используйте Ansi, делфи давно уже юникодное начиная c 2010. 


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
lollollollol
Дата 28.1.2014, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



у меня делфи 7, какую версию посоветуете чтобы было меньше проблем с переносом проектов?
PM MAIL   Вверх
lollollollol
Дата 28.1.2014, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Цитата


т.е. возьми любой  Windows  VPS сервер купленный у зарубежного хостера, и попробуй напечатать(или скопировать из буфера) в блокнот русский текст.
Если там нет русского языка, текст отобразится не корректно. Вот это и нужно проверить программно  

Вопрос актуален
PM MAIL   Вверх
kami
Дата 28.1.2014, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(lollollollol @  28.1.2014,  11:35 Найти цитируемый пост)
попробуй напечатать(или скопировать из буфера) в блокнот русский текст.

Несколько некорректная постановка задачи. Кто в здравом уме будет набирать текст на сервере? smile
Как вариант:
Код

function IsValidLocaleName(lpLocaleName: PWideChar): BOOL; stdcall; external 'Kernel32.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
    ShowMessage(BoolToStr(IsValidLocaleName('ru-RU'), True));


PM MAIL WWW   Вверх
lollollollol
Дата 29.1.2014, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Код

program  dddddd;

uses windows;

function BoolToStr(x:boolean):string;
begin
  if (x=True) then result:='True' else result:='False';
end;

function IsValidLocaleName(lpLocaleName: PWideChar): BOOLEAN; stdcall; external 'Kernel32.dll';

begin
  MessageBox(0,Pchar(BoolToStr(IsValidLocaleName('ru-RU'))),'',0);
end.


На сервере нет русского языка, но функция выдаёт True
PM MAIL   Вверх
Poseidon
Дата 29.1.2014, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



lollollollol, семерка нифига не юникодная, отсюда и проблемы. Тебе же подсказали, начиная с версии 2010 Delphi стала юникодной, вот и выбирай. В семерке эту проблему если и удастся решить, то через грабли. Сервер хранит текст в юникоде, семерка в анси. Моя твоя не понимать у них происходит, отсюда и кракозябры.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
kami
Дата 29.1.2014, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(lollollollol @  29.1.2014,  17:47 Найти цитируемый пост)
На сервере нет русского языка, но функция выдаёт True

Возможно, т.к. она проверяет локаль на "установлена или доступна". А вот если посмотреть в MSDN рядом с ней, то увидим несколько других интересных функций, например:
Код

  // for MAKELANGID see http://msdn.microsoft.com/en-us/library/dd318693(v=vs.85).aspx
  Result := IsValidLocale(MAKELCID(MAKELANGID($19, 1), SORT_DEFAULT), LCID_INSTALLED) and IsValidCodePage(1251);

или же - можно перечислить вообще всё, что есть в системе:
Код

var
  FindedLocale, FindedCodePage: Boolean;

function EnumLocalesProc(lpStr: PChar): DWORD; stdcall; // см. Community Additions - если возвращать BOOL (-1 по Delphi),
// то перечисления не будет.
begin
  // Form1.mmo1.Lines.Add(lpStr);
  if lpStr = '00000419' then // http://www.science.co.il/Language/Locale-codes.asp
    begin
      FindedLocale := True;
      Result := 0;
    end
  else
    Result := 1;
end;

function EnumCodepagesProc(lpStr: PChar): DWORD; stdcall;
begin
  // Form1.mmo1.Lines.Add(lpStr);
  if lpStr = '1251' then
    begin
      FindedCodePage := True;
      Result := 0;
    end
  else
    Result := 1;
end;

function ruRUInstalled: Boolean;
begin
  FindedLocale := False;
  FindedCodePage := False;

  EnumSystemLocales(@EnumLocalesProc, LCID_INSTALLED);
  EnumSystemCodePages(@EnumCodepagesProc, CP_INSTALLED);
  Result :=  FindedLocale and FindedCodePage;
end;

Кстати, хоть в данном контексте это слабо относится к делу, но тем не более: в Вашем коде IsValidLocaleName должна возвращать BOOL, а не Boolean.

Цитата(lollollollol @  28.1.2014,  08:38 Найти цитируемый пост)
не представляю к каким api функциям можно обратиться для этого.
 - представление получено smile а мне тестить не на чем - я глянул список установленных языков на своем компе и ужаснулся  smile чего там только нет...

Добавлено через 5 минут и 28 секунд
Цитата(Poseidon @  29.1.2014,  20:35 Найти цитируемый пост)
Сервер хранит текст в юникоде, семерка в анси.

а серверу разве не все равно, в чем хранить? smile

И в дополнение - тема про мои грабли

Это сообщение отредактировал(а) kami - 29.1.2014, 21:46
PM MAIL WWW   Вверх
kami
Дата 29.1.2014, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Вообще - я не представляю как такое возможно без попыток обработки текста 
Цитата

На сервер был скачен текстовый файл с русским текстом, на сервере нет русского языка,
 Загрузка/скачивание - это ж бинарные операции...
PM MAIL WWW   Вверх
lollollollol
Дата 29.1.2014, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Спасибо, тестить завтра с утра буду! о результатах отпишусь
PM MAIL   Вверх
Poseidon
Дата 29.1.2014, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(kami @  29.1.2014,  21:45 Найти цитируемый пост)
а серверу разве не все равно, в чем хранить?

Серверу пофик. Но если ОС там английская, а пытаются сохранить кириллицу, то сервер конвертнет это дело в юникод, если его конкретно не попросить об ином.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
lollollollol
Дата 30.1.2014, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Код

program  dddddd;

uses windows;

var
  FindedLocale, FindedCodePage: Boolean;

function EnumLocalesProc(lpStr: PChar): DWORD; stdcall;
begin
  if lpStr = '00000419' then // http://www.science.co.il/Language/Locale-codes.asp
    begin
      FindedLocale := True;
      Result := 0;
    end
  else
    Result := 1;
end;

function BoolToStr(x:boolean):string;
begin
  if (x=True) then result:='True' else result:='False';
end;

function EnumCodepagesProc(lpStr: PChar): DWORD; stdcall;
begin
  if lpStr = '1251' then
    begin
      FindedCodePage := True;
      Result := 0;
    end
  else
    Result := 1;
end;
function ruRUInstalled: Boolean;
begin
  FindedLocale := False;
  FindedCodePage := False;
  EnumSystemLocales(@EnumLocalesProc, LCID_INSTALLED);
  EnumSystemCodePages(@EnumCodepagesProc, CP_INSTALLED);
  Result :=  FindedLocale and FindedCodePage;
end;

begin
  MessageBox(0,Pchar(BoolToStr(ruRUInstalled)),'',0);
end.



Возвращает True, но вместо русских символоввсё равно сохраняются знаки вопросика или крякозябры :(
PM MAIL   Вверх
lollollollol
Дата 30.1.2014, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Код

function MAKELANGID(p, s: Word): Word;
begin
  Result := (s shl 10) or p;
end;

Function MakeLCID( lgID: Word; srtid: Word ): DWORD;
begin
  Result := MakeLong( lgid, srtid );
end;

function IsValidLocale(Locale:DWORD;dwFlags:DWORD):BOOLEAN; stdcall; external 'Kernel32.dll';

begin
  MessageBox(0,Pchar(BoolToStr(IsValidLocale(MAKELCID(MAKELANGID($19, 1), SORT_DEFAULT), LCID_INSTALLED) and IsValidCodePage(1251))),'',0);
end.


Тоже на сервере где нет ru, возвращает True
PM MAIL   Вверх
kami
Дата 30.1.2014, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(lollollollol @  30.1.2014,  09:49 Найти цитируемый пост)
на сервере где нет ru, возвращает True

Все же думаю, что ru есть. Ось врать не может, раз говорит "есть", значит в ней присутствуют и локаль ru-RU и русскоязычная кодовая страница.
Панель управления - Часы, язык и регион - Язык и региональные стандарты - Дополнительно - текущий язык программ, не поддерживающих Юникод.
Что там? И есть ли возможность изменить на "Русский (Россия)"?
PM MAIL WWW   Вверх
lollollollol
Дата 30.1.2014, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Странно, там действительно есть Русский язык, но всё равно не могу сохранить русские символы, чтото с кодировкой?
PM MAIL   Вверх
kami
Дата 30.1.2014, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(kami @  30.1.2014,  10:15 Найти цитируемый пост)
Панель управления - Часы, язык и регион - Язык и региональные стандарты - Дополнительно - текущий язык программ, не поддерживающих Юникод.Что там? 

?
и опять обращаю внимание - в Вашем коде результат функций должен быть BOOL, а не Boolean.
PM MAIL WWW   Вверх
lollollollol
Дата 30.1.2014, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



BOOL = LongBool;

Boolean
False = 0
True = 1

LongBool
False = 0
True <> 0

В любом случае должно вернуть нуль для False, так что тут это роли не играет, или я не прав?

Добавлено @ 19:01
Цитата

Панель управления - Часы, язык и регион - Язык и региональные стандарты - Дополнительно - текущий язык программ, не поддерживающих Юникод.Что там? 

На англ винде не нашел в прошлый раз, увидел только список языков. гляну черз 2 часа, отпишу

Это сообщение отредактировал(а) lollollollol - 30.1.2014, 19:01
PM MAIL   Вверх
Poseidon
Дата 30.1.2014, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(lollollollol @ 30.1.2014,  10:50)
Странно, там действительно есть Русский язык, но всё равно не могу сохранить русские символы, чтото с кодировкой?

О боги, да неужели стало доходить! Ну разумеется в кодировке. Твоя семерка пытается сохранить в анси, а сервер сохраняет в юникоде. Локаль системы тут вообще не при делах. Тут хоть кириллица, хоть иероглифы, разницы нет. Отдавай на сохранение текст в юникоде и считывай его как юникод и все твои проблемы решатся. 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
kami
Дата 31.1.2014, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(lollollollol @  30.1.2014,  18:58 Найти цитируемый пост)
В любом случае должно вернуть нуль для False, так что тут это роли не играет, или я не прав?

Сравни SizeOf(Boolean) и SizeOf(BOOL);. В данном случае - это ничего не решает, но лучше так не привыкать делать.

Цитата(Poseidon @  30.1.2014,  20:17 Найти цитируемый пост)
Твоя семерка пытается сохранить в анси, а сервер сохраняет в юникоде. 

Это как? Где в сохранении файла участвует Ось, кроме открытия этого файла (грабли в моей теме были именно в именах)? 
В D7 Memo1.Items.SaveToFile в любом случае запишет ANSI, каким бы юникодным не был сервер.
Вот отображение на том же сервере содержимого Memo1 даст крякозябры, но это не означает, что сам файл побился.

Это сообщение отредактировал(а) kami - 31.1.2014, 08:58
PM MAIL WWW   Вверх
lollollollol
Дата 31.1.2014, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Пуск - Control Panel - Regional and Language Options - Administrative - Change system locale... - Current system locale:

Вот тут если поставить Russian, то все проблемы с сохранением Русского языка пропадают, соответственно вопрос:
Как сделать это программно? Вероятно нужно поменять какой-то ключик реестра, какой? кто знает, или подскажите как узнать?



Это сообщение отредактировал(а) lollollollol - 31.1.2014, 11:56
PM MAIL   Вверх
Poseidon
Дата 31.1.2014, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(kami @  31.1.2014,  08:57 Найти цитируемый пост)
Где в сохранении файла участвует Ось
Фигасе! Любое сохранение в результате приходит к функции CreateFile. А это, ну так, между прочим, функция оси. Хочется увидеть, как возможно сохранить файл без операционной системы?

Цитата(kami @  31.1.2014,  08:57 Найти цитируемый пост)
В D7 Memo1.Items.SaveToFile в любом случае запишет ANSI
Записать запишет, а толку? Стандартными способами прочитает как юникод и получаем ерунду.

Но мы тут вообще не об этом говорим. Вся суть заключается в том, что ОС по барабану какой она локали и есть ли в ней язык отображаемого текста. lollollollol, я думаю в твоей ОС нет какого-нибудь японского, но при этом всякие там японские сайты отобразятся у тебя нормально. Арабская вязь нормально отобразится в большинстве случаев. Я это к тому, что НЕ ВАЖНО есть ли в системе нужный язык. Т.е. ты изначально пошел не тем путем, и вместо того, что бы разобраться с кодировкой ты пытаешься понять есть ли нужный тебе язык в системе. Определись с тем, что бы твой файл читался в той же кодировке, в какой и сохраняется. На данный момент у тебя сохранение в ANSI, а чтение в Unicode. Отсюда и проблемы.

Добавлено через 2 минуты и 41 секунду
Цитата(lollollollol @  31.1.2014,  11:47 Найти цитируемый пост)
Вот тут если поставить Russian, то все проблемы с сохранением Русского языка пропадают, соответственно вопрос:
Как сделать это программно?
Нельзя делать подобные вещи программно! Есть в качественном программировании закон - "Не менять настройки пользователя, которые касаются не только нашей программы". Если мне какая-то программа пытается что-то поменять в системе, будет этой программе один приговор - Shift+Del. Я даже писать не стану как это сделать...



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
kami
Дата 1.2.2014, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(Poseidon @  31.1.2014,  21:20 Найти цитируемый пост)
Фигасе! Любое сохранение в результате приходит к функции CreateFile. А это, ну так, между прочим, функция оси. Хочется увидеть, как возможно сохранить файл без операционной системы?

Вообще-то полный мой вопрос звучал как
Цитата(kami @  31.1.2014,  08:57 Найти цитируемый пост)
 Где в сохранении файла участвует Ось, кроме открытия этого файла

Давай не будем выдергивать фразы из контекста.

Цитата(Poseidon @  31.1.2014,  21:20 Найти цитируемый пост)
Нельзя делать подобные вещи программно!

+100500.


Это сообщение отредактировал(а) kami - 1.2.2014, 09:46
PM MAIL WWW   Вверх
lollollollol
Дата 1.2.2014, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет




Цитата

Нельзя делать подобные вещи программно! Есть в качественном программировании закон - "Не менять настройки пользователя, которые касаются не только нашей программы". Если мне какая-то программа пытается что-то поменять в системе, будет этой программе один приговор - Shift+Del. Я даже писать не стану как это сделать...



Согласен, не подумал smile
А вообще нашел софт который показывает изменения в реестре и файлах, так что сделать не проблема.

По сути нужно просто передавать файлы в юникоде, что является проблемой, клиент который передаёт серверу файлы, передаёт их именно в ansi, если только в буфере при получении как-то менять с ansi на юникод

Это сообщение отредактировал(а) lollollollol - 1.2.2014, 10:13
PM MAIL   Вверх
Poseidon
Дата 1.2.2014, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(kami @  1.2.2014,  09:45 Найти цитируемый пост)
Давай не будем выдергивать фразы из контекста.
 Контекст изначально сам себе противоречит.  "Где в сохранении файла участвует Ось, кроме открытия этого файла". Хочешь сказать, что при открытии файла ОС участвует в сохранении? Звучит как бред. А вот мой довод о том, что в сохранении файла ОС участвует как минимум своей WinAPI-функцией CreateFile, по-моему, звучит вполне логично. Плюс я попросил привести пример сохранения файла без ОС, примера нет. Вывод? А вывод прост, в сохранении файла ОС в любом случае участвует. Более того, файл сохраняется средствами ОС. Нет у железа возможности самому сохранить файл, только средствами ОС.

Цитата(lollollollol @  1.2.2014,  10:12 Найти цитируемый пост)
По сути нужно просто передавать файлы в юникоде, что является проблемой, клиент который передаёт серверу файлы, передаёт их именно в ansi, если только в буфере при получении как-то менять с ansi на юникод
Ну молодец. К третьей странице разобрались. Dephi 7 изначально не умеет работать с юникодом, поэтому и получается такая вот бяка. Придется перелазить на более ранние версии.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
kami
Дата 1.2.2014, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(Poseidon @  1.2.2014,  15:06 Найти цитируемый пост)
"Где в сохранении файла участвует Ось, кроме открытия этого файла". Хочешь сказать, что при открытии файла ОС участвует в сохранении? Звучит как бред.

Гхм... чтобы сохранить файл, его надо сперва открыть, не? И CreateFile как раз возвращает хендл на открытый файл.
Посему - 
Цитата(Poseidon @  1.2.2014,  15:06 Найти цитируемый пост)
А вот мой довод о том, что в сохранении файла ОС участвует как минимум своей WinAPI-функцией CreateFile, по-моему, звучит вполне логично. 
 - это мимо кассы.

Вообще - да, изначальное мое высказывание было несколько неполно и допускало двоякие толкования. Я хотел сказать, что участие оси, в котором хоть как-то принимает участие кодировка, завершается на открытии этого файла. Если брать не-юникодное приложение, то участие заключается в перекодировке не-юникодного имени файла в юникодное на основе дефолтной локали. В дальнейшем все операции с файлом идут в бинарном режиме (естественно, с участием ОС - это, наверное, было не очевидно из контекста), к которому кодировка не имеет отношения.

Исходя из всего вышесказанного, немного переиначу.Сервер просто сохраняет. Кодировка содержимого файла определяется приложением и только им. Посему с моей точки зрения фраза 
Цитата(Poseidon @  30.1.2014,  20:17 Найти цитируемый пост)
Твоя семерка пытается сохранить в анси, а сервер сохраняет в юникоде. Локаль системы тут вообще не при делах.
, (а так же некоторые предыдущие в этой теме) прозвучала крайне некорректно и последовали вопросы с моей стороны.

PM MAIL WWW   Вверх
lollollollol
Дата 1.2.2014, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



вопрос не по теме, какую версию с юникодом посоветуете, чтобы было как можно меньше проблем с переносом проектов? 
могу лишь сказать что у меня все проекты не используют делфийские компоненты(серверное ПО).

Это сообщение отредактировал(а) lollollollol - 1.2.2014, 18:52
PM MAIL   Вверх
Poseidon
Дата 1.2.2014, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(lollollollol @  1.2.2014,  18:51 Найти цитируемый пост)
могу лишь сказать что у меня все проекты не используют делфийские компоненты
Если так, то смотри какую версию Delphi поддерживают эти компоненты. Delphi поддерживает Unicode начиная с версии 2009.

Цитата(kami @  1.2.2014,  17:03 Найти цитируемый пост)
Гхм... чтобы сохранить файл, его надо сперва открыть, не?
Не. Вот представим, файла у нас нет. Мы получаем его из сети в память, а потом его сохраняем из памяти на диск. В какой из этих операций участвует открытие файла?

Цитата(kami @  1.2.2014,  17:03 Найти цитируемый пост)
И CreateFile как раз возвращает хендл на открытый файл.
CreateFile возвращает хэндл на созданный этой функцией файл. 
Цитата(msdn)
If the function succeeds, the return value is an open handle to the specified file, device, named pipe, or mail slot.




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
kami
Дата 1.2.2014, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(Poseidon @  1.2.2014,  19:20 Найти цитируемый пост)
Вот представим, файла у нас нет. Мы получаем его из сети в память, а потом его сохраняем из памяти на диск. В какой из этих операций участвует открытие файла?

Если получаем "в память" - то как минимум CreateFile. Если не "получаем в память", то - я не знаю внутренностей работы CopyFile. В любом случае на исходную кодировку способ копирования не повлияет.
Цитата(Poseidon @  1.2.2014,  19:20 Найти цитируемый пост)
CreateFile возвращает хэндл на созданный этой функцией файл. 

specified <> "созданный".

Poseidon, продолжать прения дальше не вижу смысла - ты ищешь ошибки в моих высказываниях и не хочешь признавать в своих. На начальный вопрос автора ответ был дан, всё дальнейшее считаю выходящим за рамки обсуждения.

Это сообщение отредактировал(а) kami - 1.2.2014, 20:52
PM MAIL WWW   Вверх
lollollollol
Дата 1.2.2014, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Скачал/поставил длфи 2010, не могу скомпилировать проект, во всех uses пишет чтото типа
[DCC Fatal Error] servsoft.dpr(14): F1026 File not found: 'kol.dcu'

Это сообщение отредактировал(а) lollollollol - 1.2.2014, 23:13
PM MAIL   Вверх
lollollollol
Дата 2.2.2014, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Во торможу, папка то у делфи изменилась, щас закину кол в новую 
PM MAIL   Вверх
Poseidon
Дата 2.2.2014, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(kami @  1.2.2014,  20:51 Найти цитируемый пост)
Если получаем "в память" - то как минимум CreateFile.
Ну а я о чем? А ты "чтение, чтение".

Цитата(kami @  1.2.2014,  20:51 Найти цитируемый пост)
specified <> "созданный"
Да ладно. Хотелось бы увидеть твой вариант перевода того предложения из msdn, что бы там был смысл "хэндл на открытый файл". Особенно учитывая то, что функция CreateFile (СоздатьФайл)



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
kami
Дата 2.2.2014, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Не выдержал, но сие будет мое заключительное сообщение в этой теме smile
Цитата(Poseidon @  2.2.2014,  16:13 Найти цитируемый пост)
Ну а я о чем? А ты "чтение, чтение".

Не вижу противоречия с тем, что я говорил ранее. Более того, если не считать этого сообщения, то Ctrl+F говорит, что "чтение" в этом топике встречается только 2 раза и оба - в твоих сообщениях. 

Цитата(Poseidon @  2.2.2014,  16:13 Найти цитируемый пост)
Особенно учитывая то, что функция CreateFile (СоздатьФайл)

Дословный перевод <> максимально соответствующий по смыслу. Мои соболезнования по поводу использования этой функции исключительно для создания файлов. Советую обратить внимание на значения dwCreationDisposition, отличные от CREATE_NEW. Жаль, что нет официального перевода, к которому можно было бы обратиться, а без этого в любом случае выйдет мое мнение против твоего.

Все мои вопросы канули в Лету... По своим ошибочным высказываниям я дал объяснения.  От тебя же так и не дождался адекватного ответа, зато - получил кучу "асимметричных", в которых замалчивались твои ошибки и внимание акцентировалось на моих, в том числе путем выдергивания интересующих фраз.
Напоследок (исключительно в качестве напоминания, с чего всё началось):
Цитата(Poseidon @  29.1.2014,  23:33 Найти цитируемый пост)
Но если ОС там английская, а пытаются сохранить кириллицу, то сервер конвертнет это дело в юникод,

Цитата(Poseidon @  30.1.2014,  20:17 Найти цитируемый пост)
Твоя семерка пытается сохранить в анси, а сервер сохраняет в юникоде.

Цитата(Poseidon @  31.1.2014,  21:20 Найти цитируемый пост)
Цитата(kami @  31.1.2014,  08:57 )В D7 Memo1.Items.SaveToFile в любом случае запишет ANSI
Записать запишет, а толку? Стандартными способами прочитает как юникод и получаем ерунду.

Эти высказывания в корне не верны, и к ним я без тени сомнения могу применить твое же 
Цитата(Poseidon @  1.2.2014,  15:06 Найти цитируемый пост)
Звучит как бред. 

Но - продолжай быть уверенным в своей непогрешимости, у тебя хорошо получается.
PM MAIL WWW   Вверх
Poseidon
Дата 2.2.2014, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(kami @  2.2.2014,  18:20 Найти цитируемый пост)
Более того, если не считать этого сообщения, то Ctrl+F говорит, что "чтение" в этом топике встречается только 2 раза и оба - в твоих сообщениях. 

А мы только по Ctrl+F смысл понимаем? Ты утверждал, что при открытии файла ОС участвует только в сохранении. Говоря твоим языком, открытие_файла = сохранение_файла. О каком вообще сохранении речь, если мы говорим об открытии? Я тебе привел в пример функцию ОС, которая используется при сохранении файла, но не используется в открытии этого файла. Попросил привести пример сохранения файл без операционной системы, примера не последовало. Хотя ты яро утверждал, что ОС участвует только в открытии файла. В общем, твоя фраза "получил кучу "асимметричных", в которых замалчивались твои ошибки и внимание акцентировалось на моих, в том числе путем выдергивания интересующих фраз." применима и к тебе.

Цитата(kami @  2.2.2014,  18:20 Найти цитируемый пост)
Дословный перевод <> максимально соответствующий по смыслу.
Дословно specified вообще переводится как "указанный". Соответствует по смыслу там именно "хэндл на созданный файл". Я просил привести свой вариант перевода, его нет.

Цитата(kami @  2.2.2014,  18:20 Найти цитируемый пост)
Мои соболезнования по поводу использования этой функции исключительно для создания файлов.
Мы ведем речь о файлах. Мои соболезнования по поводу создания файлов через создание девайсов.


Какой делаем вывод? Имеем железную фразу "Где в сохранении файла участвует Ось, кроме открытия этого файла", которая имеет явный смысл "ОС участвует в сохранении файла только в открытии этого файла". И звучит это явно бредово. Попросил привести пример создания файла без участи ОС. Примера нет. Далее возникли разногласия по поводу перевода MSDN. Я попросил привести свой вариант перевода. Перевода нет. Тут же последовал "совет" использовать BOOL вместо Boolean. Человек вполне резонно спросил "Зачем?" Ответа не последовало. Хотя вполне вразумительный довод, что False в обоих типах одинаков (проще говоря, равен 0) бы отвергнут. Более того, даже если учесть, что в Kernel32.dll функция IsValidLocaleName возвращает BOOL, а мы ее описываем при загрузке как Boolean, то даже при возврате True в BOOL (-1) магия компилятора вернет нам True в Boolean (1). Другими словами, в данном примере для данной функции нет разницы что использовать. Более того, разница есть только для единичных функциях и только для передаваемых параметров. Большинство функций проверяет параметр на 0 (False) и им все-равно что там передается, BOOL или Boolean. Ну а для возвращаемых значений уж тем более все-равно. Но нет, была ярая рекомендация, но без разъяснения зачем это надо (по правде сказать, мне бы тоже было интересно почитать). 
Обобщая все вышесказанное, глубоко уважаемый мной kami увидел в некоторых моих фразах смысловую ошибку (в частности там, где я писал о конвертировании ОС кодировки при сохранении) но указывая мне на это сам допустил ряд оплошностей, которые так и не захотел признавать.


lollollollol, можешь использовать во всех подобных случаях Boolean и не слушать никого. Особое внимание уделяй только когда передаешь булевое значение в WinAPI-функцию. Есть еще функции, хоть их и не много, которые проверяют параметр на соответствие значению -1 (True для BOOL) и если не соответствует, то считают, что передано False (в случае с Boolean при передаче True будет передано значение 1, оно не соответствует -1 и функция посчитает, что передано False). Но большинство функций проверяют параметр на соответствие значению 0 (False и для BOOL, и для Boolean), а если не соответствует, то считают, что передано True.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0840 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.