从包含重音字符的剪贴板获取CSV数据(从Excel粘贴)

情景

  • 我的用户将从Excel复制单元格(从而将其放入剪贴板)
  • 而我的应用程序将从剪贴板中检索这些单元格

问题

  • 我的代码从剪贴板中检索CSV格式
  • 但是,如果原始的Excel内容包含ä(a与变音符号)等字符,则检索到的CSVstring不会具有正确的字符(ä最终会显示为“正方形”)
  • 相比之下,如果我的代码从剪贴板检索Unicode文本格式,一切正常:ä保存在从剪贴板检索的string中

SOURCE CODE – ORIGINAL – 有问题

[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中input一些文本(我用“doppelgänger”加上一些数字),只需按Ctrl-C将其复制到剪贴板,然后运行上面的代码。
  • data_csv设置为“doppelgnger,1 \ r \ n2,3 \ r \ n \ 0”
  • data_string设置为“doppelgänger\ t1 \ r \ n2 \ t3 \ r \ n”

  • 我能做些什么来获得正确的字符?

注释

  • 是的,我知道我可以通过使用Unicode文本来解决这个问题。 但我实际上想要了解CSV的情况
  • 在检索stream时使用或不使用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(); } 

Excel使用Unicode字符编码将string存储在剪贴板上。 当您尝试读取ANSIstring时,得到一个正方形的原因是系统的ANSI代码页中没有该字符的表示forms。 你应该只使用Unicode。 如果你打算处理本地化问题,那么ANSI就比它的价值更麻烦。

编辑:乔尔Spolsky写了一个很好的介绍字符编码,这是绝对值得检查: 绝对最低每个软件开发人员绝对积极必须知道Unicode和字符集(没有借口!)

您的UTF8stream的编码不起作用。 变音符的字节正被转换为“replace字符”的Unicode字符。

相反,只需查看stream的数据,不需要额外的编码指令。 数据将采用Excel使用的一些设置格式。 你应该可以通过查看unlaut所在的字节来判断。 然后,您应该能够将其转换为UTF-8。

最糟糕的情况是,如果CSV格式化器抛出一切不是Ascii。 在这种情况下,您可能可以编写自己的数据格式化程序。

在某些情况下,Excel人士认为CSV只意味着Ascii。 请参阅http://www.tech-archive.net/Archive/Excel/microsoft.public.excel.misc/2008-07/msg02270.html