# How to “Copy as Unicode” from a Notebook?

I spent some time manually editing a post replacing Mathematica ASCII \[Alpha] with Unicode α. I did this by laboriously choosing Copy as LaTeX, pasting into the edit box, and then copying the Unicode symbol from the preview below. This made me realize I am lacking a "Copy as Unicode string" function in Mathematica.

How can I most easily copy an expression such as:

In Unicode:

αβ + Mod[δΨ, 2 ⁢ρ^2]

-

Since a native method is not forthcoming, I shall post my file based circumvention, for Windows.

You will need to have this utility in the command path (it apparently is stock with Windows 7).

copyUnicode[expr_] := Run["clip <",
Export["$Clipboard.temp", ToString[expr, InputForm], "Text", CharacterEncoding -> "Unicode"] ];  Usage: expr = \[Alpha]\[Beta] + Mod[\[Delta]\[CapitalPsi], 2\[InvisibleTimes]\[Rho]^2]; copyUnicode[expr]  This leaves the following text in the Windows Clipboard: αβ + Mod[δΨ, 2*ρ^2]  Here is a version of the function that holds (does not evaluate) the expression: SetAttributes[copyUnicode, HoldFirst] copyUnicode[expr_, form_: InputForm] := Run["clip <", Export["$Clipboard.temp", ToString[Unevaluated@expr, form], "Text",
CharacterEncoding -> "Unicode"]];


Now:

Plot[\[Alpha], {\[Alpha], 0, 10}] // copyUnicode


Puts in the Windows Clipboard:

Plot[α, {α, 0, 10}]

-
I think clip is native in at least win-7. Perhaps you should note that this places the output in the system clipboard. The output of your copyUnicode function is just a 0 (at least, on my PC). You have to do a ctrl-v paste afterwards. A MMA Paste doesn't seem to work. –  Sjoerd C. de Vries Feb 2 '12 at 21:10
Very useful function! Why not make it available for any code sample? (Now it works only for single expression…) –  xzczd Nov 23 '12 at 14:09
@xzczd I'll see if I can improve it. –  Mr.Wizard Nov 23 '12 at 23:56
There's a built-in CopyToClipboard function, but it doesn't seem to work, at least on Linux. –  Mechanical snail May 21 at 1:46
Does it possible to convert string to Plot[\[Alpha], {\[Alpha], 0, 10}] or Cell[BoxData["\<\"Plot[\\\\[Alpha], {\\\\[Alpha], 0, 10}]\"\>"], "Output"}] to Unicode Form? Because I use one function something like InputCell2SE@cellExpression//CopyToClipboard copy InputCell to SE which turns out Plot[\[Alpha], {\[Alpha], 0, 10}], and I used FrontEnd..."InputText" –  HyperGroups Jun 19 at 15:08

Edit

Fixed problem with pasting into textarea

In some applications on Mac, copying as Unicode from Mathematica already works without having to do any postprocessing. However, it doesn't work in textarea fields in web browsers.

Nevertheless, if you're willing to do a few additional mouse clicks, the Unicode forms can be brought into the browser by taking the detour through one of those applications that do support Mathematica's characters. One convenient choice is to open a new window in TextEdit and paste your original Mathematica code into it first. In the default RichText mode, TextEdit displays the special characters as Unicode glyphs. Then you can simply copy whatever you just pasted back from TextEdit and paste it into the browser. It seems that as soon as TextEdit is recognized as the provider of the Unicode text on the pasteboard, there is no conversion back to the Mathematica representation, so you get the correct appearance in the browser.

In the following, I use the same idea in order to automate the conversion. Instead of TextEdit, I go through a temporary file in RichText (RTF) format on the provider side. The Mac pasteboard does support RTF as a format for data on the pasteboard, but this isn't accepted by the browsers I've recently tried when attempting to paste into textarea.

Therefore, I have to add one additional step: using the textutil tool which is built into OS X, I convert the RTF file to a regular text file with Unicode characters first. Then I read the text file back in and put it on the pasteboard.

Of course, this means it's only going to work on Mac OS X because it uses Cocoa bindings in the built-in Python interpreter:

copyAsUnicode[t_] :=
Module[{out =
FileNameJoin[{\$TemporaryDirectory,
"MathematicaOutput" <> StringJoin[Map[ToString, DateList[]]]}]},
Export[out <> ".rtf", t];
Run["textutil -convert txt " <> out <> ".rtf -output " <> out <>
".txt"];
Run["printf \"from AppKit import *\n\
board=NSPasteboard.generalPasteboard()\n\
content=NSData.dataWithContentsOfFile_('" <> out <>
".txt')\nboard.declareTypes_owner_([NSStringPboardType], None)\n\
board.setData_forType_(content, NSStringPboardType)\n\
\" | /usr/bin/python"];
DeleteFile[{out <> ".txt", out <> ".rtf"}]]


The idea is to export to RTF and read the result to the clipboard outside of Mathematica. The function is invoked for example as copyAsUnicode["αβ+Mod[δΨ+ρ2]"]. This example itself was copied that way, too, i.e., I typed copyAsUnicode["copyAsUnicode[\"αβ+Mod[δΨ+ρ2]\"]"], which I again copied the same way... OK, I think you get the idea.

Of course the next step would be to make this into a Palette that acts on the NotebookSelection, but the above is the main step. Maybe someone else knows how to do something like this in other operating systems (I don't).

-
This looks good, but since I cannot test it on Windows I will leave it to Mac users to upvote. Thank you for your answer. –  Mr.Wizard Feb 2 '12 at 4:27
Hi, I posted one question with little difference from directly copy Input Expression to SE and need your attention. mathematica.stackexchange.com/questions/27289/… –  HyperGroups Jun 20 at 1:47

Here's a version that doesn't require a temporary file.

# Linux (needs xclip)

SetAttributes[copyUnicode, HoldAll];
copyUnicode[expr_] := With[{
stream = OpenWrite["!xclip -in -selection clipboard", CharacterEncoding -> "UTF-8"]
},
WriteString[stream, ToString[Unevaluated@expr, InputForm]];
Close@stream;
];


Example: executing the cell

Cell[BoxData[
RowBox[{"copyUnicode", "[",
RowBox[{
RowBox[{
RowBox[{
SuperscriptBox["x", "2"], "\[SmallCircle]",
RowBox[{"{",
RowBox[{
RowBox[{"\[LeftFloor]", "\[Alpha]", "\[RightFloor]"}], ",",
"\"\<\[LeftFloor]\[Alpha]\[RightFloor]\>\""}], "}"}]}],
"\[PlusMinus]",
RowBox[{
SqrtBox["5"], "\[CirclePlus]", "\[HappySmiley]"}]}],
"<=",
"\"\<\[Integral]\[PartialD]\[RightArrow]\[Union]\[Sum]\[Infinity]\
\[Element]\>\""}], "]"}]], "Input"]


gives x^2 ∘ {Floor[α], "⌊α⌋"} ± Sqrt[5] ⊕ ☺ <= "∫∂→⋃∑∞∈".

# Windows

Not tested, but it should work if you use "!clip"instead of"!xclip -in -selection clipboard". You might have to change the encoding to UTF-16.

# Caveats

• Note that certain characters get ASCIIfied anyway in InputForm when not inside a string.
• Mathematica uses non-standard private-use code points for some characters like U+211D ℝ, even when a standard code point exists, so the output will be wrong if the input contains such characters.
-
Your caveats also apply to Mac OS X, so there's more work to be done before it becomes 100% reliable... (+1) –  Jens Jun 19 at 20:21
Another caveat to add: some special characters, such as \[UpEquilibrium], get converted incorrectly or not at all, no matter what I try. So I don't think it's possible to get a perfect translation to Unicode in general. –  Jens Jun 19 at 20:46
On Mac, I can get the same result by simply pasting the Mathematica code into the TextEdit` application and immediately copying the same passage from there. So there's no need to go to the web. –  Jens Jun 19 at 17:15