Модераторы: 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   Вверх
Страницы: (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.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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