Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2015, 21:26   #1
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
Вопрос Кириллица и PAnsiChar

Есть функция, которая возвращает строку в формате PAnsiChar.
На русскоязычных ОС всё нормально, а вот если ОС английской локализации, то текст PAnsiChar содержащий кириллицу превращается в набор непонятных символов.

Подскажите, как конвертировать строку формата PAnsiChar в нормальный вид, чтобы кириллица отображалась нормально (я так полагаю надо привести к WideString). Использую Delphi 2010

Функция вот:
Код:
var
  Cliente_DDE: TDDEClientConv;
  temp: PansiChar;
begin
   Result := '';
   Cliente_DDE:= TDDEClientConv.Create( nil );
    with Cliente_DDE do
       begin
          SetLink('Firefox', 'WWW_GetWindowInfo');
          temp := RequestData('0xFFFFFFFF'); // RequestData возращает строку PAnsiChar
          Result := StrPas(temp);
          StrDispose(temp);
          CloseLink;
       end;
     Cliente_DDE.Free;

Последний раз редактировалось garuna; 25.10.2015 в 21:43.
garuna вне форума Ответить с цитированием
Старый 25.10.2015, 21:37   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Использую Delphi 2010
Попробуй применить класс TEncoding для переконвертации в юникод.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.10.2015, 21:41   #3
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Попробуй применить класс TEncoding для переконвертации в юникод.
А можно подробнее? Где поменять?
garuna вне форума Ответить с цитированием
Старый 25.10.2015, 21:45   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Что поменять? Тебе же переконвертировать нужно?
Или я чего-то не понимаю?
Кстати попробовать можно функцию AnsiToUTF8()
В D2010 должна быть.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.10.2015, 21:49   #5
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Что поменять? Тебе же переконвертировать нужно?
Или я чего-то не понимаю?
Кстати попробовать можно функцию AnsiToUTF8()
В D2010 должна быть.
Сорри, глаза уже слипаются, "применить" как "поменять" читаю)
AnsiToUTF8() попробовал, не помогло
garuna вне форума Ответить с цитированием
Старый 25.10.2015, 21:50   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А такое?: http://www.programmersforum.ru/showp...5&postcount=16
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.10.2015, 21:58   #7
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение

Тоже нет (
garuna вне форума Ответить с цитированием
Старый 25.10.2015, 22:24   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну тогда облом... Вполне возможно, что локали нужной на компе нет.
Я не знаю как такие проблемы решаются.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.10.2015, 00:34   #9
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

Цитата:
Сообщение от garuna Посмотреть сообщение
На русскоязычных ОС всё нормально, а вот если ОС английской локализации, то текст PAnsiChar содержащий кириллицу превращается в набор непонятных символов.
В целом так и должно быть, поскольку в случае AnsiChar кодировка берется из умолчаний системы. Если умолчание в системе стоит на США, нужно или перестать работать с кириллицей, или установить кириллицу как умолчание. В Панели управления → Язык → Язык по умолчанию для программ, не использующих Юникод. Это нормальный и человеческий способ решения проблем, избегающий жесткого прописывания кириллицы в программе (что есть быдлокод, на мой взгляд).

Сам код тоже неплохо бы переписать, раз уж версия Delphi современная:
Код:
function GetDataFromFirefox: string;
var
  Temp: PAnsiChar;
begin
  with TDDEClientConv.Create(nil) do
  try
    SetLink('Firefox', 'WWW_GetWindowInfo');
    Temp := RequestData('0xFFFFFFFF');
    try
      SetString(Result, Temp, StrBufSize(Temp)); // используется DefaultSystemCodePage
      //SetCodePage(Result, 1251, False); // быдлокод, если системные умолчания -- не кириллица
    finally
      StrDispose(Temp);
    end;
  finally
    Free;
  end;
end;
В разработке: воспроизводственный контур ИТ
Vapaamies вне форума Ответить с цитированием
Старый 26.10.2015, 09:41   #10
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
В Панели управления → Язык → Язык по умолчанию для программ, не использующих Юникод.
Это понятно, но пользователи об этом не знают, а всякий раз объяснять что нужно изменить в системе не вариант (


Пробовал раскомментировать в вашем коде строку
Код:
SetCodePage(Result, 1251, False);
Но компилятор ругается что Result не является RawByteString:



Пробовал так (код ниже), компилируется, но кириллицу все равно не отображает.
Код:

function GetDataFromFirefox: string;
var
  Temp: PAnsiChar;
  s: RawByteString;
begin
  with TDDEClientConv.Create(nil) do
  try
    SetLink('Firefox', 'WWW_GetWindowInfo');
    Temp := RequestData('0xFFFFFFFF');
    try
      SetString(Result, Temp, StrBufSize(Temp));
      s:= RawByteString(Result);
      SetCodePage(s, 1251, False); 
      Result:= s;
    finally
      StrDispose(Temp);
    end;
  finally
    Free;
  end;
end;

Последний раз редактировалось garuna; 26.10.2015 в 10:48.
garuna вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
'String' and 'PAnsiChar' Halogen Общие вопросы Delphi 4 23.11.2014 19:29
Pchar or Pansichar stasa9711 Общие вопросы Delphi 9 26.06.2014 21:32
Pansichar и string Kapitan4ik Общие вопросы Delphi 4 09.11.2012 21:25
PAnsiChar... наверное... Nub Общие вопросы Delphi 6 17.10.2010 11:12
pansichar to string Toxa Общие вопросы Delphi 16 31.05.2007 13:40