[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在剪贴板上放置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();
}
答案 0 :(得分:7)
Excel使用Unicode字符编码将字符串存储在剪贴板上。当您尝试读取ANSI中的字符串时,您获得正方形的原因是系统的ANSI代码页中没有该字符的表示。你应该只使用Unicode。如果您要处理本地化问题,那么ANSI就会比它的价值更麻烦。
编辑:Joel Spolsky写了一篇关于字符编码的精彩介绍,绝对值得一试:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
答案 1 :(得分:1)
您将流编码为UTF8无法正常工作。变音符号的字节被转换为“替换字符”unicode字符。
相反,只需查看流的数据,无需任何额外的编码指令。数据将采用Excel使用的某种设置格式。您应该能够通过查看unlaut所在的字节来判断。然后,您应该能够将其转换为UTF-8。
最糟糕的情况是CSV Formatter会抛出不是Ascii的所有内容。在这种情况下,您可以编写自己的数据格式化程序。
在某些情况下,Excel人员认为CSV仅表示Ascii。 见http://www.tech-archive.net/Archive/Excel/microsoft.public.excel.misc/2008-07/msg02270.html