gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:11:36 26 4
gpt4 key购买 nike

场景

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

问题

  • 我的代码从剪贴板中检索 CSV 格式
  • 但是,如果原始 Excel 内容包含 ä(带变音符号的 a)等字符,则检索到的 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 中输入一些文本(我使用了单词“doppelgänger”加上一些数字),只需按 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();
}

最佳答案

Excel 使用 Unicode 字符编码将字符串存储在剪贴板上。当您尝试读取 ANSI 字符串时出现方 block 的原因是系统的 ANSI 代码页中没有该字符的表示形式。你应该只使用 Unicode。如果您要处理本地化问题,那么 ANSI 只会带来更多麻烦。

编辑:Joel Spolsky 写了一篇关于字符编码的精彩介绍,绝对值得一读:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

关于c# - 从包含重音字符的剪贴板(从 Excel 粘贴)获取 CSV 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/967878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com