Страница 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 09:24:44
sakooon
Вообще то надо в описании объекта определить, что именно и в какой кодировке должно ему передаваться. Если это word типа 2007, то скорее всего - строка в UCS2. Как либо подтвердить или опровергнуть сие утверждение не могу по причине отсутствия word'a.????
Re: Вопрос про OLE
Добавлено: 16.04.2015 07:49:21
Vapaamies
UCS2 -- это UTF-16 без суррогатных пар, то есть является его подмножеством. Физическое представление у них одинаковое -- последовательность WideChar. OLE-строки в ОС до Windows 2000 -- UCS2, начиная с Windows 2000 -- UTF-16, как правильно заметил Иван Шихалев. По собственному опыту могу сказать, что суррогатные пары прекрасно работают под XP.