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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как скопировать из Memo текст в Unicode ? 
:(
    Опции темы
Данкинг
Дата 16.3.2010, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Вступление. smile Есть сайт с армянским текстом, к примеру, этот. Если я копирую на страничке текст, то затем я могу вставить его сюда, на Винград:
Цитата

Սևուկ ուլիկ,
Սիրուն բալիկ,
Ման եմ եկել սարե-սար,
Կաթն եմ արել քեզ համար,
Դռնակը բա՛ց, ներս գամ ես,
Անուշ-անուշ ծիծ տամ քեզ.
Սևուկ ուլիկ, Սիրուն բալիկ։

А теперь - сам вопрос. Есть Memo (или RichEdit, неважно), которому задан армянский шрифт ("anahid") и, соответственно, отображается текст нормально:
user posted image
Но если я копирую текст из этого Memo и вставляю сюда, то получается обычная латиница:
Цитата

RichEdit1

Итак, как бы скопировать текст в Юникоде? Пытался делать экспорт в .htm через FastReport, но всё равно если с получившейся странички вставить текст, то он отображается латиницей.



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Keeper89
Дата 17.3.2010, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну т.к. у тебя 7 Delphi, надо смотреть в сторону AnsiToUTF8 для текста в буфере обмена.
Сейчас навскидку скажу, что-то такое:
Код

Clipboard.Text := AnsiToUTF8(Clipboard.Text);



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


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Не получается, заменил на RichEdit - то же самое.
Код

clipboard.AsText:=AnsiToUTF8(RichEdit1.Text);



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Keeper89
Дата 17.3.2010, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот другой пример:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Clipbrd;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TUniClipboard = class(TClipboard)
  private
    procedure SetAsWideString(Value: WideString);
    function GetAsWideString:WideString;
  public
    property AsWideString: WideString read GetAsWideString write SetAsWideString;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var cl: TUniClipboard;
    ws: WideString;
begin
  cl := TUniClipboard.Create;
  ws := cl.AsWideString;
  Canvas.Font.Name := 'Arial Unicode MS';
  TextOutW(Canvas.Handle, 100, 100, PWideChar(ws), Length(ws));
end;

{ TUniClipboard }

function TUniClipboard.GetAsWideString: WideString;
var Data: THandle;
begin
  Open;
  Data := GetClipboardData(CF_UNICODETEXT);
  try
    if Data <> 0 then
      Result := PWideChar(GlobalLock(Data))
    else
      Result := '';
  finally
    if Data <> 0 then GlobalUnlock(Data);
    Close;
  end;
end;

procedure TUniClipboard.SetAsWideString(Value: WideString);
begin
  SetBuffer(CF_UNICODETEXT, PWideChar(Value)^, 2 * (Length(Value) + 1));
end;

end.



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


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Пишу:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
 TUniClipboard.SetAsWideString(richedit1.Text);
end;

Вылезает:
[Error] Unit1.pas(59): This form of method call only allowed for class methods


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Keeper89
Дата 17.3.2010, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

procedure TForm1.Button1Click(Sender: TObject);
var cl: TUniClipboard;
    ws: WideString;
begin
  cl := TUniClipboard.Create;
  cl.SetAsWideString(AnsiToUTF8(richedit1.Text));
end;


Это сообщение отредактировал(а) Keeper89 - 17.3.2010, 01:16


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


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



То же самое. Я так понимаю, каким-то образом следует указать именно армянскую локализацию. Но вот как именно - не знаю, так как кодовой страницы таковой нет, т.е. как-то надо сиё отобразить в юникоде.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Keeper89
Дата 17.3.2010, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Завтра могу попробовать посмотреть для не юникодной Delphi "вживую" smile


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


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Цитата(Keeper89 @ 17.3.2010,  01:48)
Завтра могу попробовать посмотреть для не юникодной Delphi "вживую" smile

Попробуй, вот шрифт прилагаю, который у меня используется. smile 

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  ANAHID.TTF 29,61 Kb


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Alexeyt
Дата 17.3.2010, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 15.9.2006
Где: около Москвы

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



D7-D2007: возьми комп-т Tnt Unicode controls, там есть TTntMemo,
замени им свое memo. И вызывай memo.Text.
Сайт - yunqa.de

PM WWW   Вверх
Keeper89
Дата 17.3.2010, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот к чему мне удалось придти. smile

Путь строки такой:
1) Сайт (юникод)
2) Буфер обмена (юникод)
3) Memo (юникод->ANSI)
4) Обратно (ANSI->юникод)

Например у меня (скорее всего из-за того. что нет армянской кодовой страницы) текст с сайта копируется в Memo как набор "?" (для Delphi 7, для Delphi > 2009 преобразование на третьем шаге не нужно). Ну и обратно тож никак.

Насколько я понимаю для отображения другого языка (в ANSI) надо для начала выставить его в Региональных настройках Windows и далее уже преобразовать его в Юникод обратно.

З.Ы. Вот нашел еще ссылочку.

З.Ы.2. Лично мое мнение - при мультиязычности нужно переходить на Юникодные версии Delphi smile Ну или на юникодные компоненты, как предложил Alexeyt.

Это сообщение отредактировал(а) Keeper89 - 17.3.2010, 19:27


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


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Цитата(Alexeyt @  17.3.2010,  17:58 Найти цитируемый пост)
TTntMemo

Вставляется аналогично:
Цитата

TntMemo1


Цитата(Keeper89 @  17.3.2010,  19:26 Найти цитируемый пост)
Насколько я понимаю для отображения другого языка (в ANSI) надо для начала выставить его в Региональных настройках Windows и далее уже преобразовать его в Юникод обратно.

З.Ы. Вот нашел еще ссылочку.

Систему трогать не хотелось бы, я думал, как-то всё же можно преобразовать программно.

Цитата(Keeper89 @  17.3.2010,  19:26 Найти цитируемый пост)
при мультиязычности нужно переходить на Юникодные версии Delphi 

Судя по тому, что с этим TNT результат такой же, ставить другую Дельфи смысла тоже нет. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Keeper89
Дата 17.3.2010, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Данкинг @  17.3.2010,  20:12 Найти цитируемый пост)
Судя по тому, что с этим TNT результат такой же, ставить другую Дельфи смысла тоже нет.

Почему нет, у меня в 2010 все работает smile

Просто если не иметь в системе кодовой страницы языка, строка будет содержать только те символы, которые есть в текущей странице. Поэтому даже если арм. язык и отображается, содержать он будет другие символы.

Это сообщение отредактировал(а) Keeper89 - 17.3.2010, 20:43


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


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Н-да. Ладно, пока оставим, вдруг что-то ещё в голову придёт. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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