СЦЕНАРИЙ
- Мои пользователи будут копировать ячейки из 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();
}