# 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]  - 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 To circumvent Mathematica's internal representation, I decided to use the operating system. 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[]]] <>
".rtf"}]
},
Export[out, t];
Run["printf \"from AppKit import *\n\
board=NSPasteboard.generalPasteboard()\n\
content=NSData.dataWithContentsOfFile_('" <> out <>
"')\nboard.declareTypes_owner_([NSRTFPboardType], None)\n\
board.setData_forType_(content, NSRTFPboardType)\n\" | \
/usr/bin/python"];
DeleteFile[out]
]


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

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