Страница 1 из 1

Вопрос про OLE

СообщениеДобавлено: 03.01.2013 20:03:30
Alex333
Всем привет.

Lazarus 1.0.4, FPC 2.6.0, всё это под Windows XP.
Пишу вот такое:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var v:Variant;
begin
  Windows.MessageBoxA(0,pchar(utf8toansi('Привет')),'',0); //Тут пишет по-русски
  v:=CreateOleObject('Word.Application');
  v.Documents.Add;
  v.Selection.ParagraphFormat.Alignment:=1;
  v.Selection.TypeText(utf8toansi('Привет!'#13)); //А тут закорючками. ???
  v.Visible:=True;
  v.Activate;
end;   

Как мне корректно вывести русский текст в MS-Word? Чего ему не хватает?

Я грешил сначала на utf8toansi(), но ведь в начальной строчке она нормально переводит кодировку, значит дело не в этом.
А в чём тогда?

Re: Вопрос про OLE

СообщениеДобавлено: 03.01.2013 21:00:16
SSerge
Alex333 писал(а):но ведь в начальной строчке она нормально переводит кодировку, значит дело не в этом.

У операционной системы Windows есть фактически два программных интерфейса: старый, со времен Windows 3.0, ANSI, и нормальный Unicode. Взаимодействие с Unicode производится через WideStrings (в терминах fpc) - то есть кодировку UCS2, или в терминах лазаруса почему-то она называется UTF16.

Более того, MessageBox операционной системы не имеет никакого отношения к OLE объекту Word.Application. Вообще то надо в описании объекта определить, что именно и в какой кодировке должно ему передаваться. Если это word типа 2007, то скорее всего - строка в UCS2. Как либо подтвердить или опровергнуть сие утверждение не могу по причине отсутствия word'a.

Однако, смотрим сюда: http://msdn.microsoft.com/en-us/library ... cs(v=vs.80).aspx

C# работает во внутреннем представлении со строками UCS2, если что. И только с ними.
Попробуйте применить UTF8toUTF16

Re: Вопрос про OLE

СообщениеДобавлено: 04.01.2013 09:12:30
Alex333
Попробовал. Ругается ошибкой:

project1
--------------------------------------------
Press OK to ignore and risk data corruption
Press Cancel to kill program
--------------------------------------------
OK Cancel
--------------------------------------------

В то же время, если убрать этот utf8toansi() и скомпилировать в Delphi-6, то работает "на ура".

А ведь там кодировка ansi наверняка.

Re: Вопрос про OLE

СообщениеДобавлено: 04.01.2013 10:50:37
alexey38
А Вы что одновременно использовали и utf8toansi() и UTF8toUTF16 ?

Re: Вопрос про OLE

СообщениеДобавлено: 04.01.2013 20:06:23
Alex333
А Вы что одновременно использовали и utf8toansi() и UTF8toUTF16 ?


Не понял вопроса :-) Вот так utf8toansi(UTF8toUTF16('Текст')) или вот так UTF8toUTF16(utf8toansi('Текст')) я не делал. А что - надо было?

v.Selection.TypeText(UTF8toUTF16('Привет!'#13)); - вот так выдаёт ошибку.

Re: Вопрос про OLE

СообщениеДобавлено: 05.01.2013 00:12:07
iskander
Попробуйте привести к WideString
Код: Выделить всё
  v.Selection.TypeText(WideString(UTF8toUTF16('Привет!'#13)));

Re: Вопрос про OLE

СообщениеДобавлено: 05.01.2013 18:48:32
Alex333
Во! Наконец-таки то, что надо.
Это работает. Спасибо.

Re: Вопрос про OLE

СообщениеДобавлено: 07.01.2013 17:28:56
Иван Шихалев
SSerge писал(а):C# работает во внутреннем представлении со строками UCS2, если что.

Нет. Таки UTF-16. UCS2 использовалась до Win2k.

Re: Вопрос про OLE

СообщениеДобавлено: 15.04.2015 10:24:44
sakooon
Вообще то надо в описании объекта определить, что именно и в какой кодировке должно ему передаваться. Если это word типа 2007, то скорее всего - строка в UCS2. Как либо подтвердить или опровергнуть сие утверждение не могу по причине отсутствия word'a.????

Re: Вопрос про OLE

СообщениеДобавлено: 16.04.2015 08:49:21
Vapaamies
UCS2 -- это UTF-16 без суррогатных пар, то есть является его подмножеством. Физическое представление у них одинаковое -- последовательность WideChar. OLE-строки в ОС до Windows 2000 -- UCS2, начиная с Windows 2000 -- UTF-16, как правильно заметил Иван Шихалев. По собственному опыту могу сказать, что суррогатные пары прекрасно работают под XP.