Utf-16LE to UTF-8

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Utf-16LE to UTF-8

Сообщение Brainenjii » 19.10.2010 17:33:50

Здравствуйте,
пытаюсь запросить у wmic список установленного ПО через wmic product get name, но оно возвращает результат в UTF-16LE. Как ни бьюсь - заполучить оный в UTF-8 не получается. Как это можно сделать без iconv?
Спасибо.
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Utf-16LE to UTF-8

Сообщение Sergei I. Gorelkin » 19.10.2010 17:50:04

А что не так с Utf8Encode()?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Utf-16LE to UTF-8

Сообщение Brainenjii » 19.10.2010 18:04:53

А не обрабатывает... Прикладываю файл с коварным UTF-16LE ^_^
P.S. АААААААААААААААА 0.о Какие-то параноидальные настройки добавления вложений!!! На все попытки - или запрещено расширение, или не удалось определить размеры изображения >_<
P.P.S. попробуйте сделать wmic /OUTPUT:\path\to\file product get name - получите ту самую кодировку...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Utf-16LE to UTF-8

Сообщение Sergei I. Gorelkin » 19.10.2010 19:37:15

Сделал, получил. Самая натуральная utf-16le.
Дальше нужно действовать как-то так:
Код: Выделить всё
var
  istream: TStream;
  ofile: TextFile;
  buffer: array[0..1023] of widechar;
  ws: widestring;
  s: string;
begin
  istream := TFileStream.Create('имя_файла_с_utf16.txt', fmOpenRead);
  Assign(ofile, 'имя_файла_с_utf8.txt');
  repeat
    count := istream.read(buffer, sizeof(buffer));
    SetString(ws, buffer, count div sizeof(widechar));
    s := utf8encode(ws);
    write(ofile, s);
  until count < sizeof(buffer);
  istream.free;
  closeFile(ofile);
end;
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Utf-16LE to UTF-8

Сообщение count » 17.10.2012 01:49:55

procedure utf16to8(fname_in,fname_out:string);
var
istream: TStream;
ofile: TextFile;
buffer: array[0..1023] of widechar;
ws: widestring;
s: string;
count:integer;
begin
istream := TFileStream.Create(fname_in, fmOpenRead);
if not FileExists(fname_out) then FileClose(FileCreate(fname_out));
Assign(ofile, fname_out);
repeat
count := istream.read(buffer, sizeof(buffer));
SetString(ws, buffer, count div sizeof(widechar));
s := utf8encode(ws);
append(ofile);
write(ofile, s);
until count < sizeof(buffer);
istream.free;
closeFile(ofile);
end;
count
незнакомец
 
Сообщения: 9
Зарегистрирован: 06.03.2011 21:41:15


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 211

Рейтинг@Mail.ru