Получить данные CSV из буфера обмена (вставленные из Excel), содержащие символы с акцентом - PullRequest
30 голосов
/ 09 июня 2009

СЦЕНАРИЙ

  • Мои пользователи будут копировать ячейки из Excel (помещая его в буфер обмена)
  • И мое приложение будет извлекать эти ячейки из буфера обмена

ПРОБЛЕМА

  • Мой код извлекает формат CSV из буфера обмена
  • Однако, если исходное содержимое Excel содержит символы, такие как ä (a с umlaut), тогда извлеченная строка CSV не имеет правильных символов (ä в конечном итоге для меня отображается как «квадрат»)
  • Для сравнения, если мой код извлекает текстовый формат Unicode из буфера обмена, все работает нормально: символ сохраняется в строке, извлеченной из буфера обмена

ИСТОЧНИК КОДА - ОРИГИНАЛ - С ПРОБЛЕМОЙ

[STAThread]
static void Main(string[] args)
{
    var fmt_csv = System.Windows.Forms.DataFormats.CommaSeparatedValue;

    // read the CSV
    var dataobject = System.Windows.Forms.Clipboard.GetDataObject();
    var stream = (System.IO.Stream)dataobject.GetData(fmt_csv);
    var enc = new System.Text.UTF8Encoding();
    var reader = new System.IO.StreamReader(stream,enc);
    string data_csv = reader.ReadToEnd();

    // read the unicode string
    string data_string = System.Windows.Forms.Clipboard.GetText();



}

РЕЗУЛЬТАТЫ ПРИ ИСПОЛЬЗОВАНИИ КОДА ОБРАЗЦА

  • Действия по воспроизведению: введите некоторый текст в Excel (я использовал слово «двойник» плюс несколько цифр) и просто нажмите Ctrl-C, чтобы скопировать его в буфер обмена, а затем запустите приведенный выше код.
  • data_csv имеет значение "doppelg nger, 1 \ r \ n2,3 \ r \ n \ 0"
  • data_string имеет значение "doppelgänger \ t1 \ r \ n2 \ t3 \ r \ n"

ВОПРОС

  • Что я могу сделать, чтобы получить правильные символы?

КОММЕНТАРИИ

  • Да, я знаю, что могу обойти эту проблему, используя текст Unicode. Но я действительно хочу понять, что происходит с CSV
  • использование или отсутствие использования кодировки UTF-8 при извлечении потока не имеет значения в результатах

ОТВЕТ

После просмотра комментариев и пристального внимания к тому, что Excel помещал в буфер обмена для CSV, казалось разумным, что Excel может размещать содержимое с использованием «устаревшей» кодировки вместо UTF-8. Поэтому я попытался использовать кодовую страницу Windows 1252 в качестве кодировки, и она работала. Смотрите код ниже

ИСТОЧНИК КОДА - С ОТВЕТОМ

[STAThread]
static void Main(string[] args)
{
    var fmt_csv = System.Windows.Forms.DataFormats.CommaSeparatedValue;

    //read the CSV
    var dataobject = System.Windows.Forms.Clipboard.GetDataObject();
    var stream = (System.IO.Stream)dataobject.GetData(fmt_csv);
    var enc = System.Text.Encoding.GetEncoding(1252);
    var reader = new System.IO.StreamReader(stream,enc);
    string data_csv= reader.ReadToEnd();

    //read the Unicode String
    string data_string = System.Windows.Forms.Clipboard.GetText();
}

Ответы [ 2 ]

7 голосов
/ 09 июня 2009

Excel сохраняет строку в буфере обмена, используя кодировку Unicode. Причина, по которой вы получаете квадрат при попытке прочитать строку в ANSI, заключается в том, что в кодовой странице ANSI вашей системы нет представления для этого символа. Вы должны просто использовать Unicode. Если вы собираетесь иметь дело с проблемами локализации, то ANSI - это просто больше проблем, чем стоит.

Редактировать: Джоэл Спольски написал отличное введение в кодирование символов, которое, безусловно, стоит проверить: Абсолютный минимум, который должен знать каждый разработчик программного обеспечения. !)

1 голос
/ 09 июня 2009

Ваша кодировка потока как UTF8 не работает. Байты для умлаута конвертируются в символ Юникода «символ замены».

Вместо этого просто посмотрите на данные потока без каких-либо дополнительных инструкций по кодированию. Данные будут в некотором заданном формате, используемом в Excel. Вы должны быть в состоянии сказать, посмотрев на байт (ы), где находится unlaut. После этого вы сможете преобразовать его в UTF-8.

В худшем случае, если CSV Formatter выбрасывает все, что не является Ascii. В этом случае вы можете написать собственный форматер данных.

В некоторых случаях люди из Excel считали, что CSV означает только Ascii. См. http://www.tech -archive.net / Архив / Excel / microsoft.public.excel.misc / 2008-07 / msg02270.html

...