Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.04.2017, 21:06
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
Злость Из PansiChar в String (и WideString) Delphi 2010

Здравствуйте.

Проблема в том, функция DLL* возвращает PansiChar.
Не могу понять\найти как конвертировать в String ибо русские буквы кракозябры, но не всегда**.

* == Bass.dll.
** онлайн радио. Например 'РадиоСибирь' исполнитель и название пишется нормально.
А вот RadioRcord rus черти что, в WMP все ОК.


Как правильно сделать?

Последний раз редактировалось Stalker2-42, 23.04.2017 в 18:25.
Ответить с цитированием
  #2  
Старый 12.04.2017, 00:05
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Делфи должна сама преобразовывать PAnsiChar в String/WideString при присваивании без явного преобразования типов.
Может быть проблема в том, что строка как раз-таки не всегда PAnsiChar? Посмотри под отладкой значения в памяти по указателю PAnsiChar в обоих случаях.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 12.04.2017, 01:02
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,056
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не совсем так. С юникодом там чуть-чуть посложнее.
Попробуй примерно так:
Код:
type
  TCyrString = AnsiString(1251); // указываем кодовую страницу
var
  a_s : TCyrString;
  apc : PAnsiChar;
  s : String; // UnicodeString by default
begin
  ...
  dll_function_call(apc);
  a_s := TCyrString(apc);
  s := a_s;
Собственно, мы принудительно сообщаем компилятору кодовую страницу для AnsiString. Ну а дальше он должен все сделать сам.

Последний раз редактировалось lmikle, 12.04.2017 в 17:59.
Ответить с цитированием
  #4  
Старый 12.04.2017, 18:24
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Не совсем так. С юникодом там чуть-чуть посложнее.
Попробуй примерно так:
Код:
type
  TCyrString = AnsiString(1251); // указываем кодовую страницу
var
  a_s : TCyrString;
  apc : PAnsiChar;
  s : String; // UnicodeString by default
begin
  ...
  dll_function_call(apc);
  a_s := TCyrString(apc);
  s := a_s;
Собственно, мы принудительно сообщаем компилятору кодовую страницу для AnsiString. Ну а дальше он должен все сделать сам.


К сожалению так же и осталось.
Подсмотрел здесь
Осмелюсь поправить.....

Код:
type
  TCyrString = type AnsiString(1251); // указываем кодовую страницу

Почему-то изменения цвета в коде не работает.

У меня так:
Код:
var
  meta: PAnsiChar;
  Sstr  : String;
......

Meta :=DLL_Func();
....
Sstr := Utf8ToWideString(meta);
И к стати, работает, не думаю что так будет работать всегда.
Как-то очень просто.

Может еще какие варианты имеются?
Ответить с цитированием
  #5  
Старый 12.04.2017, 22:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,056
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Осмелюсь поправить....

ну, да. Сорь... про...зевал... по инерции просто type нашкрябал.

Utf8ToWideString... а что в доке на тему возращаемого значения написано??? Т.е. если там действительно возвращается UTF-8, то будет работать. Тюею надо смотреть что же возвращает функция... бо как PAnsiChar, как я понимаю, просто для совместимости с char*
Ответить с цитированием
  #6  
Старый 12.04.2017, 23:56
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Utf8ToWideString... а что в доке на тему возращаемого значения написано?
WideString.

Чуть позже еще поработаю над этим.
Ответить с цитированием
  #7  
Старый 13.04.2017, 06:20
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,056
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Stalker2-42
WideString.

Чуть позже еще поработаю над этим.

дык может тогда описать возвращаемое значение как PWideChar и тогда напрямую присваивать String, который UnicodeString?
Ответить с цитированием
  #8  
Старый 23.04.2017, 17:57
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
Сообщение

Приветствую.
Не понятно работает способ UTF8ToString.
Я запутался. Интернет не помог.
Повторюсь:
От одного url(РадиоСибирь) , вместо русских букв пишет ромбики в которых вопросительные знаки(латиница - нормально) , от остальных URL, где присутствует кириллица все нормально.

В оригинальном коде из примера: (злощастного url(РадиоСибирь) все нормально, но другие станции(RUS) - кракозябры)
Код:
var
  meta: PAnsiChar;
begin
  meta := BASS_ChannelGetTags(chan, BASS_TAG_META);
  if (meta <> nil) then
  begin
    p := Pos('StreamTitle=', String(AnsiString(meta)));
    if (p = 0) then
      Exit;
    p := p + 13;
    SendMessage(win, WM_INFO_UPDATE, 7, DWORD(PAnsiChar(AnsiString(Copy(meta, p, Pos(';', String(meta)) - p - 1)))));
  end;

С костылем, из всех имеющихся станций с кириллицей , нормальные, читаемые слова.
А "РадиоСибирь" ересь.
Код:
var
  meta: PAnsiChar;
  p: Integer;
  S : string;
begin
  meta := BASS_ChannelGetTags(Channel, BASS_TAG_META);
  if (meta <> nil) then
    begin
      S := UTF8ToString(meta);
      p := Pos('StreamTitle=', s);
      if (p = 0) then
        Exit;
      p := p + 13;
      UpdateWin(3, PChar(Copy(S, p, Pos(';', S) - p - 1)));
    end;

Куда рыть?
PS: проверил эту станцию в WMP, вместо исполнителя и названия песни только название станции.

Что за кодировка???

Последний раз редактировалось Stalker2-42, 23.04.2017 в 18:15.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:34.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter