如何检索 Unicode CSV 剪贴板数据 MS Windows XP?
Posted
技术标签:
【中文标题】如何检索 Unicode CSV 剪贴板数据 MS Windows XP?【英文标题】:How to retrieve Unicode CSV Clipboard data MS Windows XP? 【发布时间】:2011-03-06 10:41:38 【问题描述】:我正在为一个更大的项目编写一个测试应用程序,但似乎无法从 Windows 剪贴板检索 Unicode CSV 数据,我使用内置的 GetClipboardData api 调用成功检索了 CF_UNICODETEXT,但是当我将 Unicode CSV 放在剪贴板上时在 MSExcel 中并尝试使用 CSV 格式检索,我得到了错误的数据。这是一些代码;
procedure TForm1.Button7Click(Sender: TObject);
var
hMem : THandle;
dwLen : DWord;
ps1, ps2 : pChar;
begin
OpenClipboard( form1.Handle );
RichEdit1.Lines.Clear;
try
if Clipboard.HasFormat( CF_UNICODETEXT ) then
begin
hMem := GetClipboardData( CF_UNICODETEXT );
ps1 := GlobalLock( hMem );
dwLen := GlobalSize( hMem );
ps2 := StrAlloc( 1 + dwLen );
StrLCopy( ps2, ps1, dwLen );
GlobalUnlock( hMem );
RichEdit1.Lines.Add( ps2 );
end
else
ShowMessage( 'No CF_UNICODETEXT on Clipboard!' );
finally
CloseClipboard;
end;
end;
现在这段代码也应该适用于 CSV,但是当我将剪贴板格式更改为我想要的格式时,应用程序将无法获得正确的数据。重要的是要知道我可以很好地获得标签式 Unicode,而不是我想要的 CSV。
【问题讨论】:
【参考方案1】:CSV 剪贴板格式 Excel 使用 is ANSI encoded,而不是 Unicode。
通过转储 Excel 2007 剪贴板,启用 Unicode 的剪贴板是:
CF_UNICODETEXT “html 格式” “富文本格式” “XML 电子表格”“XML 电子表格”和“HTML 格式”都有明确定义的表/行,因此从中提取数据应该不会太难。
【讨论】:
但是,但是,但是,从剪贴板获取数据应该在 CF_TEXT 和 CF_UNICODETEXT 之间进行自动转换。请参阅:msdn.microsoft.com/en-us/library/ms649013(VS.85).aspx 中的合成剪贴板格式。但可能发生的情况是 CF_UNICODETEXT 从剪贴板中提取 UTF-8 而不是 UTF-16LE?虽然看到 Windows 本身是 UTF-16LE 会很奇怪。 @Marjan:CF_UNICODE 有效,但它是 tab 分隔的,而不是逗号分隔的。 Excel 在剪贴板上包含第二种格式,即 ANSI 编码的 CSV,这就是 wfoster 所要求的。他的问题实际上是:“这段代码可以正常工作,但是如果我用RegisterClipboardFormat('CSV')
替换CF_UNICODETEXT
会失败”。
知道了。感谢您的澄清
太好了,感谢您的帮助。那时我可能会使用选项卡式格式。还偶然发现了这个blogs.msdn.com/b/michkap/archive/2005/09/17/470413.aspx,似乎 Excel 应该使用 Unicode CSV,因为它可以将任何语言保存到 CSV 文件中,但我想我不能拥有一切【参考方案2】:
您需要请求 CF_CSV 格式。将数据作为 CF_CSV 获取后,您可以将其视为 AnsiString,然后根据需要转换为 UnicodeString。
这是一个屏幕截图,显示了从 Excel2007 复制的 6 个单元格。我以 CF_CSV 的形式捕获到 ClipMate,然后用 ClipMate 的十六进制查看器显示。您会看到字段由逗号(十六进制 2C)分隔,由 CRLF (x0Dx0A) 终止。您在下面看到的是带注释的合成,显示 Excel、复制的区域以及 ClipMate 将 CF_CSV 呈现为十六进制字节。 (来源:thornsoft.com)
另外,在这个相关线程中有趣的阅读: Get CSV Data from Clipboard (pasted from Excel) that contains accented characters
【讨论】:
msdn.microsoft.com/en-us/library/ff729168%28VS.85%29.aspx 列出了标准剪贴板格式,而 CSV 不是其中之一,所以是的,您需要使用 RegisterClipboardFormat。由于这个问题专门针对剪贴板上的 Unicode 数据,所以说他可以从 ANSI 转换也没那么有用。 @wfoster, @Craig - 哎呀!对于那个很抱歉。 CF_CSV 确实需要注册。但它就是这样,它不会是 Unicode。因此,您可以将其视为 Ansi,也可以从 UnicodeText 构建自己的 CSV,然后猜测 cols 应该在哪里中断。 这是个糟糕的主意 - 将 ANSI 字符串转换为 Unicode 不会帮助您恢复因 ANSI 编码而丢失的任何信息。如果您想要支持 Unicode 的表数据是 Craig 的回答中提到的 XML 电子表格或 HTML,那么这似乎是正确的方法。以上是关于如何检索 Unicode CSV 剪贴板数据 MS Windows XP?的主要内容,如果未能解决你的问题,请参考以下文章
如何打开/ Python中转换CSV这样的字符串不是Unicode?