writing Unicode text to the Windows clipboard

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

writing Unicode text to the Windows clipboard

Jennifer Bryan
Hello,

I'm interested in moving text from and to the clipboard that cannot
necessarily be represented in the native encoding. So, really, this is
about Windows.

I can successfully read from the clipboard by specifying the format that
corresponds to unicode text.

From R >=2.7.0, it seems you should also be able to write unicode text
to the Windows clipboard.

https://github.com/wch/r-source/blob/5a156a0865362bb8381dcd69ac335f5174a4f60c/src/gnuwin32/CHANGES0#L535-L536

However, in my hands, this does not seem to be true. I can make it work
with this change:

diff --git a/src/library/utils/src/windows/util.c
b/src/library/utils/src/windows/util.c
index 373049495dd..fc3dc39e3a7 100644
--- a/src/library/utils/src/windows/util.c
+++ b/src/library/utils/src/windows/util.c
@@ -318,7 +318,7 @@ SEXP writeClipboard(SEXP text, SEXP sformat)
  warning(_("unable to open the clipboard"));
  GlobalFree(hglb);
      } else {
- success = SetClipboardData(CF_TEXT, hglb) != 0;
+ success = SetClipboardData(format, hglb) != 0;
  if(!success) {
      warning(_("unable to write to the clipboard"));
      GlobalFree(hglb);

Example:

"≧" is "GREATER-THAN OVER EQUAL TO", which is unicode <U+2267>, has
UTF-16LE bytes 67 22, and is not representable in latin1.

I copy ≧ to the Windows clipboard and attempt a round trip. I see:

x <- readClipboard(format = 13, raw = TRUE) # 13 <--> "Unicode text"
#> [1] 67 22 00 00
writeClipboard(x, format = 13L)
readClipboard(format = 13, raw = TRUE)
#> [1] 67 00 22 00 00 00 00 00

and, literally, pasting yields: g"

If I build r-devel with the patch, the same process yields

x <- readClipboard(format = 13, raw = TRUE)
#> [1] 67 22 00 00
writeClipboard(x, format = 13)
readClipboard(format = 13, raw = TRUE)
#> [1] 67 22 00 00

and pasting returns the original input: ≧

Passing the `format` to SetClipboardData() instead of hard-wiring
"CF_TEXT" brings behaviour in line with the docs.

-- Jenny

        [[alternative HTML version deleted]]

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel