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

nam*_*los 30 c# csv excel clipboard diacritics

情景

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

问题

  • 我的代码从剪贴板中检索CSV格式
  • 但是,如果原始Excel内容包含ä(a with 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();



}
Run Code Online (Sandbox Code Playgroud)

运行示例代码时的结果

  • Repro步骤:在Excel中输入一些文本(我使用"doppelgänger"加上一些数字),只需按Ctrl-C将其复制到剪贴板,然后运行上面的代码.
  • data_csv设置为"doppelg nger,1\r \n \n3,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();
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*man 7

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

编辑: Joel Spolsky写了一篇关于字符编码的精彩介绍,绝对值得一试:绝对最低每个软件开发人员绝对必须知道Unicode和字符集(没有借口!)


Lar*_*y K 1

您将流编码为 UTF8 不起作用。元音变音的字节正在转换为“替换字符”unicode 字符。

相反,只需查看流的数据,无需任何额外的编码指令。数据将采用 Excel 使用的某种设定格式。您应该能够通过查看字节来判断 unlaut 所在的位置。然后您应该能够将其转换为 UTF-8。

最坏的情况是 CSV 格式化程序丢弃所有非 Ascii 字符。在这种情况下,您也许可以编写自己的数据格式化程序。

在某些情况下,Excel 人员认为 CSV 仅表示 Ascii。请参阅http://www.tech-archive.net/Archive/Excel/microsoft.public.excel.misc/2008-07/msg02270.html