Как получить данные буфера обмена Unicode CSV в MS Windows XP?

Я пишу тестовое приложение для более крупного проекта и, похоже, не могу получить данные Unicode CSV из буфера обмена Windows, мне удалось получить CF_UNICODETEXT, используя встроенный вызов API GetClipboardData, однако, когда я помещаю Unicode CSV в буфер обмена в MSExcel и пытаюсь получить в формате CSV, я получаю неверные данные. Вот код;

procedure TForm1.Button7Click(Sender: TObject);
var
   hMem     : THandle;
   dwLen    : DWord;
   ps1, ps2 : pChar;
begin
   OpenClipboard( form1.Handle );
   RichEdit1.Lines.Clear;
   try
      if Clipboard.HasFormat( CF_UNICODETEXT ) then
      begin
         hMem := GetClipboardData( CF_UNICODETEXT );
         ps1 := GlobalLock( hMem );
         dwLen := GlobalSize( hMem );
         ps2 := StrAlloc( 1 + dwLen );
         StrLCopy( ps2, ps1, dwLen );
         GlobalUnlock( hMem );
         RichEdit1.Lines.Add( ps2 );
      end
      else
         ShowMessage( 'No CF_UNICODETEXT on Clipboard!' );
   finally
      CloseClipboard;
   end;
end;

Теперь этот код должен работать и для CSV, но когда я изменяю формат буфера обмена на желаемый, приложение не получит правильных данных. Возможно, важно знать, что я могу отлично получить Unicode с вкладками, но не тот CSV, который мне нужен.


person wfoster    schedule 21.06.2010    source источник


Ответы (2)


Формат буфера обмена CSV Excel использует ANSI в кодировке, а не в Юникоде.

После сброса буфера обмена Excel 2007, Unicode включен:

  • CF_UNICODETEXT
  • «Формат HTML»
  • «Расширенный текстовый формат»
  • "Таблица XML"

«Таблица XML» и «Формат HTML» имеют четко определенные таблицы / строки, поэтому извлекать данные из них не должно быть слишком сложно.

person Zoë Peterson    schedule 21.06.2010
comment
Но, но, но при получении данных из буфера обмена должно выполняться автоматическое преобразование между CF_TEXT и CF_UNICODETEXT. См .: Синтезированные форматы буфера обмена в msdn.microsoft.com/en -us / library / ms649013 (VS.85) .aspx. Но что могло случиться, так это то, что CF_UNICODETEXT извлекает UTF-8 из буфера обмена вместо UTF-16LE? Было бы странно видеть, что Windows изначально имеет UTF-16LE. - person Marjan Venema; 21.06.2010
comment
@Marjan: CF_UNICODE работает, но он разделен табуляцией, а не запятой. Excel включает в себя второй формат в буфере обмена - CSV в кодировке ANSI, и именно об этом спрашивает wfoster. На самом деле его вопрос: этот код работает правильно, но не работает, если я заменяю CF_UNICODETEXT на RegisterClipboardFormat('CSV'). - person Zoë Peterson; 21.06.2010
comment
Понятно. Спасибо за разъяснения - person Marjan Venema; 21.06.2010
comment
Отлично, спасибо за помощь. Тогда я, вероятно, буду использовать формат с вкладками. Также наткнулся на этот blogs.msdn.com/b/ michkap / archive / 2005/09/17 / 470413.aspx Казалось бы, Excel должен использовать Unicode CSV, так как он может сохранять любой язык в файл CSV, но я думаю, у меня не может быть всего - person wfoster; 21.06.2010

Вам необходимо запросить формат CF_CSV. ПОСЛЕ того, как вы получите данные как CF_CSV, вы можете рассматривать их как AnsiString, а затем преобразовать в UnicodeString, если хотите.

Вот скриншот, показывающий 6 ячеек, скопированных из Excel2007. Я записал в ClipMate как CF_CSV, а затем отобразил с помощью шестнадцатеричного средства просмотра ClipMate. Вы увидите, что поля разделены запятыми (шестнадцатеричный 2C) и оканчиваются CRLF (x0Dx0A). То, что вы видите ниже, представляет собой аннотированный композит, показывающий Excel, скопированную область и визуализацию ClipMate CF_CSV в виде шестнадцатеричных байтов. alt text
(источник: thornsoft .com)

Также интересное чтение в этой связанной теме: Получить данные CSV из буфера обмена (вставленные из Excel), содержащие символы с диакритическими знаками

person Chris Thornton    schedule 21.06.2010
comment
Стандартные форматы буфера обмена перечислены на msdn.microsoft.com /en-us/library/ff729168%28VS.85%29.aspx, и CSV не входит в их число, поэтому да, вам нужно использовать RegisterClipboardFormat. Поскольку вопрос был конкретно о данных Unicode в буфере обмена, утверждение, что он может конвертировать из ANSI, тоже не очень полезно. - person Zoë Peterson; 22.06.2010
comment
@wfoster, @Craig - ой! Извини за это. CF_CSV необходимо зарегистрировать. Но это то, что есть, и это не будет Unicode. Таким образом, вы можете рассматривать его как Ansi, или вы можете создать свой собственный CSV из UnicodeText и угадать, где должны сломаться столбцы. - person Chris Thornton; 22.06.2010
comment
Это ужасная идея - преобразование строки ANSI в Unicode не поможет вам восстановить информацию, потерянную из-за кодирования ANSI. Кажется, правильный путь, если вы хотите, чтобы данные таблицы с поддержкой Unicode были в виде электронной таблицы XML или HTML, как указано в ответе Крейга. - person EFraim; 17.11.2012