writing Unicode text to the Windows clipboard

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

writing Unicode text to the Windows clipboard

Jennifer Bryan-2
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
Reply | Threaded
Open this post in threaded view
|

Re: writing Unicode text to the Windows clipboard

Jeroen Ooms-2
On Fri, May 24, 2019 at 12:06 AM Jennifer Bryan <[hidden email]> wrote:

>
> 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

Thanks!

I tested this and can confirm that this patch works. With this change,
any (non ascii) unicode text now properly copies and pastes from/to
the Windows clipboard.

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|

Re: writing Unicode text to the Windows clipboard

Martin Maechler
In reply to this post by Jennifer Bryan-2
>>>>> Jennifer Bryan
>>>>>     on Thu, 23 May 2019 00:03:05 -0400 writes:

    > 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]]

Thank you, Jenny -- and Jeroen for confirmation!

I've now found the time to read up a bit on this, notably ?writeClipboard
and the underlying source code,
and just from that reading I'd agree that the change seems a
clear improvement and does what indeed the documentation had
suggested all along.

I'll commit the change to R-devel .. and plan to port it to 'R
3.6.0 patched' in a few days.

Martin

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