{"id":1397,"date":"2023-07-20T00:13:18","date_gmt":"2023-07-20T05:13:18","guid":{"rendered":"https:\/\/www.brunerd.com\/blog\/?p=1397"},"modified":"2023-07-30T10:36:51","modified_gmt":"2023-07-30T15:36:51","slug":"exploring-unicode-in-macos-with-clui","status":"publish","type":"post","link":"https:\/\/www.brunerd.com\/blog\/2023\/07\/20\/exploring-unicode-in-macos-with-clui\/","title":{"rendered":"Exploring Unicode in macOS with clui"},"content":{"rendered":"\n<p>My new tool <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/clui\" target=\"_blank\">clui<\/a>, pronounced &#8220;clue-ee&#8221; offers <strong>Command Line Unicode Info<\/strong> with the ability to export to a variety of formats like CSV, JSON, YAML, RTF and more. While I&#8217;ve written a few macOS command line tools geared to the Mac Admin like <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/jpt\" target=\"_blank\">jpt<\/a> the JSON power tool, <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/ljt\" target=\"_blank\">ljt<\/a> the little JSON tool, <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/shui\" target=\"_blank\">shui<\/a> for easily adding AppleScript dialogs to your shell script, and most recently <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/shef\" target=\"_blank\">shef<\/a> a Unicode text encoder and formatter for shell scripters. This is one is almost &#8220;just for fun&#8221; although you might find some practical uses for it. Writing <code>shef<\/code> opened my eyes to the stunning amount of detail and craftsmanship in macOS&#8217; Unicode-aware fonts, which comprise not just the alphabets of the world but signs, symbols, and even Egyptian hieroglyphics! While macOS&#8217;s built-in Character Viewer does a pretty good job to group and display these characters it&#8217;s a painstakingly manual process if you want to get info on a <strong>range<\/strong> of characters. I hope <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/clui\" target=\"_blank\">clui<\/a> makes it fun and easy to poke around the vast Unicode neighborhood. <\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"clui - command line unicode info - walkthrough\" width=\"648\" height=\"486\" src=\"https:\/\/www.youtube.com\/embed\/KhNblOSffz4?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">If you don&#8217;t feel like reading you can watch this.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Starting with Character Viewer<\/h2>\n\n\n\n<p>First let&#8217;s take a look at Character View, perhaps you don&#8217;t know some of it&#8217;s features. If you <em>quickly<\/em> press the dedicated &#8220;globe&#8221; \ud83c\udf10 button on newer Macs (or the keyboard combo <code>Control-Command-Spacebar<\/code> on older models) it will likely open up Character Viewer in it&#8217;s default mini-sized version with preset categories along the bottom. You can click on a symbol or character and it will insert the text in your current app. The real fun begins when you click the little icon in the upper right to expand the view.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-8.png\" alt=\"\" class=\"wp-image-1399\" width=\"246\" height=\"296\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-8.png 640w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-8-249x300.png 249w\" sizes=\"auto, (max-width: 246px) 100vw, 246px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>The window will expand to show more information: The code point(s) in hexadecimal (U+hhhh), the UTF-8 encoding bytes, and related characters. You will need to double-click these to insert them into your current app.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-9.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-9-1024x641.png\" alt=\"\" class=\"wp-image-1400\" width=\"416\" height=\"261\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-9-1024x641.png 1024w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-9-300x188.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-9-768x480.png 768w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-9.png 1330w\" sizes=\"auto, (max-width: 416px) 100vw, 416px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>You can also Customize the List of categories that appear in the left column by clicking the encircled ellipsis\u2026<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-11.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-11.png\" alt=\"\" class=\"wp-image-1402\" width=\"192\" height=\"156\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-11.png 490w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-11-300x244.png 300w\" sizes=\"auto, (max-width: 192px) 100vw, 192px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>The one that has <em>everything<\/em> in it is <strong>Unicode<\/strong> under the <strong>Code Tables<\/strong> group at the bottom of the list.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-13.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-13-1024x641.png\" alt=\"\" class=\"wp-image-1404\" width=\"360\" height=\"224\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-13-1024x641.png 1024w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-13-300x188.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-13-768x480.png 768w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-13.png 1330w\" sizes=\"auto, (max-width: 360px) 100vw, 360px\" \/><\/a><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-12.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-12-1024x684.png\" alt=\"\" class=\"wp-image-1403\" width=\"566\" height=\"378\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-12-1024x684.png 1024w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-12-300x200.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-12-768x513.png 768w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-12-1536x1026.png 1536w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-12.png 1584w\" sizes=\"auto, (max-width: 566px) 100vw, 566px\" \/><\/a><figcaption class=\"wp-element-caption\">Jackpot!<\/figcaption><\/figure>\n<\/div>\n\n\n<p>You can right-click or control-click on a character to <strong>Copy Character Info<\/strong> into the clipboard. In the example below, we discover that what most Mac folks would call \u2318 &#8220;Command&#8221; is also known as the &#8220;Place of Interest Sign&#8221;. Whaddya know!<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-14.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-14.png\" alt=\"\" class=\"wp-image-1405\" width=\"218\" height=\"84\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-14.png 370w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-14-300x115.png 300w\" sizes=\"auto, (max-width: 218px) 100vw, 218px\" \/><\/a><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-10.png\" alt=\"\" class=\"wp-image-1401\" width=\"381\" height=\"87\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-10.png 542w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-10-300x69.png 300w\" sizes=\"auto, (max-width: 381px) 100vw, 381px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>This is all well and good but who&#8217;d want to do that for thousands of characters?! What if someone wanted this info at the command line? It got me thinking: There&#8217;s Got to Be a Better Way!\u2122 <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Searching for the Source<\/h2>\n\n\n\n<p>The first order of business was looking for where macOS kept it&#8217;s naming information and if it was possible to extract that information with command line tools. It ended up being in two files, a SQLite database and a plist. Here&#8217;s their full paths:<\/p>\n\n\n\n<pre class=\"wp-block-code language-bash\"><code>#Single code point characters and Unicode symbols\n\/System\/Library\/Input Methods\/CharacterPalette.app\/Contents\/Resources\/CharacterDB.sqlite3\n#plist of single and multiple code point Emoji\n\/System\/Library\/PrivateFrameworks\/CoreEmoji.framework\/Versions\/A\/Resources\/en.lproj\/AppleName.strings<\/code><\/pre>\n\n\n\n<p>There is <em>some<\/em> overlap with <code>CharacterDB.sqlite3<\/code> and <code>AppleName.strings<\/code> where Apple choose to use different phrasing for an Emoji vs. Unicodes name, but in general the former has single code point entries, while the latter has both single and the multi-codepoint Emoji sequences. clui will report on both, putting a semi-colon in between each version, you can also output discretely with the <code>-D<\/code> option. Descriptions\/info fields are converted from uppercase to lowercase BECAUSE WHO LIKES GETTING YELLED AT?! \ud83d\ude49 Although you can preserve case with <code>-p<\/code> which can help with deciphering the internal (and unlabeled!) columns Apple uses in the descriptions of the CJK Ideographic ranges.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">clui in Action: Practical Examples<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Simple Lookups<\/h3>\n\n\n\n<p>If you&#8217;d like to see what all the options and modes run <code>clui -u<\/code> to get the &#8220;usage&#8221; output, or take a look at on <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/clui\" target=\"_blank\">clui&#8217;s GitHub page<\/a>. To start with, clui is built to ingest both &#8220;regular&#8221; characters and also representation of Unicode code points in hexadecimal in the style of: <code>U+hhhhh<\/code> or <code>0xhhhhh<\/code>. <strong>Ranges<\/strong> can also be specified by simply adding a hyphen between to characters or codepoints and it can both <em>ascend and descend<\/em>. The default output is CSV. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-48.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-48.png\" alt=\"\" class=\"wp-image-1461\" width=\"462\" height=\"238\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-48.png 722w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-48-300x155.png 300w\" sizes=\"auto, (max-width: 462px) 100vw, 462px\" \/><\/a><figcaption class=\"wp-element-caption\">Apple doesn&#8217;t want to call anyone a nerd apparently, but that&#8217;s OK I embrace it.<\/figcaption><\/figure>\n<\/div>\n\n\n<p>For multiple code point emoji you can enclose the code point representations in quotes. Spaces within quotes are only used delimit each code point and are not part of the composite character.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-51.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-51-1024x88.png\" alt=\"\" class=\"wp-image-1464\" width=\"746\" height=\"64\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-51-1024x88.png 1024w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-51-300x26.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-51-768x66.png 768w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-51.png 1034w\" sizes=\"auto, (max-width: 746px) 100vw, 746px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>The <code>-X<\/code> expansion option will display the all the code points together, then break out each component<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-52.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-52-1024x202.png\" alt=\"\" class=\"wp-image-1465\" width=\"652\" height=\"128\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-52-1024x202.png 1024w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-52-300x59.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-52-768x151.png 768w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-52.png 1026w\" sizes=\"auto, (max-width: 652px) 100vw, 652px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>-x will expand the input and break out each code point without showing the composite character<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-49.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-49.png\" alt=\"\" class=\"wp-image-1462\" width=\"318\" height=\"111\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-49.png 502w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-49-300x104.png 300w\" sizes=\"auto, (max-width: 318px) 100vw, 318px\" \/><\/a><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Working with Categories and Groups<\/h3>\n\n\n\n<p><code>clui<\/code> can tap into categories and groups by leveraging the the plists inside the <code>Resources<\/code> folder of <code>CharacterPallette.app<\/code>. These plists contain a mix of <code>0x<\/code> code point representations and literal characters. The list option <code>-L<\/code> takes the upper and lowercase arguments of <code><strong>c<\/strong><\/code> or <code><strong>g<\/strong><\/code> for exactly what you think, <strong>categories<\/strong> and <strong>groups<\/strong>! <code><strong>-Lc<\/strong><\/code> gets categories marking those with internal subsections with an asterisk <code>*<\/code> and <code><strong>-LC<\/strong><\/code> will expand those categories to include the subsections within. All list outputs are CSV and includes a header row, <code>-<\/code>h will suppress headers. In this excerpted example below you can see Arrows contains a number of subsections:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-16.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-16.png\" alt=\"\" class=\"wp-image-1414\" width=\"160\" height=\"282\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-16.png 394w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-16-170x300.png 170w\" sizes=\"auto, (max-width: 160px) 100vw, 160px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p><code>clui<\/code> acts on a categories when you use the <code>-C<\/code> option and input one or more categories. If no subsection is specified the complete category will be output. Some can be quite large and take several minutes to output! If you are outputting RTF or JSON and redirecting to a file, if you interrupt with Control-C the output will be properly closed up, so it will still be valid.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-53.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-53.png\" alt=\"\" class=\"wp-image-1466\" width=\"380\" height=\"166\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-53.png 690w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-53-300x131.png 300w\" sizes=\"auto, (max-width: 380px) 100vw, 380px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>As you can see at the bottom of the list, not all characters have renderings. However, if you double click those question mark glyphs \u2370 to select and copy them (CSV is nice that way), you will get that <em>exact<\/em> character. I used the apl &#8220;quad question&#8221; character (U+2370) above to get something close to it for this example, but don&#8217;t let the generic visual representation fool you, it is unique. You can use Character Viewer to see if <em>any other<\/em> fonts have alternate graphical representations, since Terminal is using only the currently selected font to display output. Update: It <em>will<\/em> fall back to a font that has a representation if needed. I recommend the free <a rel=\"noreferrer noopener\" href=\"http:\/\/unifoundry.com\/unifont\/index.html\" target=\"_blank\">GNU Unifont<\/a> for &#8220;Glyphs above the Unicode Basic Multilingual Plane&#8221;, which fills in some of the gaps of Apple fonts (like the LCD-like segmented numbers <code>U+1FBF0-U+1FBF9<\/code>)<\/p>\n\n\n\n<p>Groups are about the same thing as categories except groups are comprised of <em>multiple categories<\/em>. <code>-Lg<\/code> lists all groups and <code>-LG<\/code> will expand the constituent categories within.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-18.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-18.png\" alt=\"\" class=\"wp-image-1416\" width=\"268\" height=\"310\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-18.png 734w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-18-259x300.png 259w\" sizes=\"auto, (max-width: 268px) 100vw, 268px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>You can use <code>-G<\/code> like <code>-C<\/code> specifying one or more groups. If you include a category name (comma delimited) after the group, it&#8217;ll simply report that category as if you&#8217;d used it solely with <code>-C<\/code>. Here&#8217;s an example of the first group <code>AdditionalModernScripts<\/code> and the member category <code>CanadianAboriginalSyllabics<\/code> . For variety I&#8217;ve added <code>-h<\/code> to hide the header row from the CSV output.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-54.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-54.png\" alt=\"\" class=\"wp-image-1467\" width=\"414\" height=\"208\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-54.png 788w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-54-300x151.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-54-768x386.png 768w\" sizes=\"auto, (max-width: 414px) 100vw, 414px\" \/><\/a><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">CSV Looks Great in QuickLook<\/h3>\n\n\n\n<p>Just in case you didn&#8217;t know, Quicklook will display files with a <code>csv<\/code> extension really nicely. Here&#8217;s the <code>CanadianAboriginalSyllabics<\/code> above as seen in Quicklook, you can even select characters from within Quicklook, pretty nice!<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-55.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-55-1024x452.png\" alt=\"\" class=\"wp-image-1468\" width=\"516\" height=\"227\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-55-1024x452.png 1024w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-55-300x133.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-55-768x339.png 768w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-55.png 1082w\" sizes=\"auto, (max-width: 516px) 100vw, 516px\" \/><\/a><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">CSV Can Look Even Better in Numbers<\/h3>\n\n\n\n<p>If you want to work with CSV in <a rel=\"noreferrer noopener\" href=\"https:\/\/apps.apple.com\/us\/app\/numbers\/id409203825?mt=12\" target=\"_blank\">Numbers<\/a> it will do quite nicely. Here&#8217;s a little tip for better legibility:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li> Select column A from the top of the column<\/li>\n\n\n\n<li>Command \u2318 click on A1 to deselect it<\/li>\n\n\n\n<li>Format the text to a larger size (like 50 points or higher)<\/li>\n\n\n\n<li>Adjust the column width a bit wider<\/li>\n\n\n\n<li>Save it as a .numbers file to retain formatting<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-57.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-57-1024x853.png\" alt=\"\" class=\"wp-image-1470\" width=\"412\" height=\"342\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-57-1024x853.png 1024w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-57-300x250.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-57-768x640.png 768w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-57.png 1282w\" sizes=\"auto, (max-width: 412px) 100vw, 412px\" \/><\/a><figcaption class=\"wp-element-caption\">Some of these Emoji will make you hungry<\/figcaption><\/figure>\n<\/div>\n\n\n<p><strong><span style=\"text-decoration: underline;\">Pro Tip:<\/span><\/strong> Quicklook will <em>not<\/em> let you select any text from a Numbers document! <em>However<\/em> if you click and drag anywhere in the Quicklook contents to the Desktop (or into Preview), it will export a <strong>seamless<\/strong> PDF with no page breaks! <em>Then<\/em> you <em>can<\/em> select text from the PDF in QuickLook. Who knew?! Now back to <code>clui<\/code> features!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Get a Good Look at Those Emojis in Rich Text Format!<\/h3>\n\n\n\n<p>A late entry feature to <code>clui<\/code> is RTF (Rich Text Format) output. This enables <code>clui<\/code> to present the characters in larger sizes without requiring additional work from you (as seen above in Numbers)! The format is the same as the &#8220;plain&#8221; output (<code>-Op<\/code>) which does not label the fields, simply use the <code>-Or<\/code> option<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-40.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-40.png\" alt=\"\" class=\"wp-image-1445\" width=\"144\" height=\"272\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-40.png 360w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-40-159x300.png 159w\" sizes=\"auto, (max-width: 144px) 100vw, 144px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>Your best bet with RTF output is to either redirect it to a file like this: <code>clui -Or -C Emoji &gt; Emoji.rtf<\/code> or pipe it into <code>pbcopy<\/code> like so: <code>clui -Or -C Emoji | pbcopy<\/code>. There&#8217;s a neat feature in <code>pbcopy<\/code> that detects the RTF header data and allows you to paste into TextEdit as rich text. You can also specify the font sizes withthis option: <code>-f &lt;char size, info size&gt;<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Searching by Description<\/h3>\n\n\n\n<p><code>clui<\/code> can also search descriptions for multiple words and phrases. In this example I&#8217;ll search for magic, castle, and &#8220;clock face&#8221; using the <code>-Sd<\/code> (search descriptions) option. If I had searched just for clock I&#8217;d have also gotten hits for &#8220;clockwise arrows&#8221; since it search for substrings.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-60.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-60.png\" alt=\"\" class=\"wp-image-1473\" width=\"444\" height=\"172\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-60.png 752w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-60-300x116.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-60-750x292.png 750w\" sizes=\"auto, (max-width: 444px) 100vw, 444px\" \/><\/a><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Searching by Character<\/h3>\n\n\n\n<p>Now, if you search for the usage of a single alphabetical character you&#8217;ll probably get <strong>one<\/strong> hit but macOS also has a database of &#8220;related characters&#8221; which are similar look-alike letters. You know, like the Subject lines of spam: &#8220;\ud835\udd05\ud835\udde2\ud835\udd3e\ud835\udd46 \ud835\udc12\ud835\udd86\ud835\udcf5\ud835\ude5a \u203c&#8221;. Let&#8217;s use <code>-SC<\/code> to search for <code>\"a\"<\/code> <em>plus<\/em> related characters. I&#8217;ve trimmed the output to get some of the more interesting characters in this screenshot<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-62.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-62.png\" alt=\"\" class=\"wp-image-1476\" width=\"426\" height=\"194\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-62.png 810w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-62-300x136.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-62-768x349.png 768w\" sizes=\"auto, (max-width: 426px) 100vw, 426px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>When you start searching for symbols you&#8217;ll start discovering Emojis constructed using existing symbols and zero-width joiners (ZWJ, U+200D), these are called <a rel=\"noreferrer noopener\" href=\"https:\/\/unicode.org\/emoji\/charts\/emoji-zwj-sequences.html\" target=\"_blank\">ZWJ Sequences<\/a> (and ZWJ is apparently pronounced &#8220;zwidge&#8221;) . Let&#8217;s use <code>-Sc<\/code> to search for anything with the female sign \u2640. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-63.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-63-1024x349.png\" alt=\"\" class=\"wp-image-1477\" width=\"634\" height=\"216\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-63-1024x349.png 1024w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-63-300x102.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-63-768x262.png 768w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-63.png 1280w\" sizes=\"auto, (max-width: 634px) 100vw, 634px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>Let&#8217;s examine &#8220;woman surfer&#8221; (BTW: <a rel=\"noreferrer noopener\" href=\"https:\/\/www.hbo.com\/100-foot-wave\/season-2\" target=\"_blank\">100 Foot Wave Season 2<\/a> is awesome!) with the <code>-X<\/code> option to expand all component code points with the complete glyph as-is at the top:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-71.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-71.png\" alt=\"\" class=\"wp-image-1492\" width=\"634\" height=\"127\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-71.png 1010w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-71-300x61.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-71-768x155.png 768w\" sizes=\"auto, (max-width: 634px) 100vw, 634px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>The first line has the Emoji sequence as-is, then each individual component that comprises it: a gender neutral surfer (U+1F3CF), a ZWJ (U+200D), the female sign (U+2640), and variation selector 16 (U+FE0F). You may also notice one of the quirks of Terminal: Sometimes pasted input does not fully render as a unified Emoji!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fitzpatrick Modifiers for Skin Color<\/h3>\n\n\n\n<p>To be honest I&#8217;d never heard of the <a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/Fitzpatrick_scale\" target=\"_blank\">Fitzpatrick scale<\/a> before working on <code>clui<\/code>! It&#8217;s simply a scale of 6 types of skin color. The Unicode modifier combines Types 1 &amp; 2 into U+1F3FB. Let&#8217;s demonstrate a search by description and then again with their ranges. Simply specify the range using standard Unicode notiation <code>U+hhhhh<\/code> with a hyphen in between.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-61.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-61.png\" alt=\"\" class=\"wp-image-1475\" width=\"426\" height=\"237\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-61.png 716w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-61-300x167.png 300w\" sizes=\"auto, (max-width: 426px) 100vw, 426px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>If you search for an Emoji with a Fitzpatrick Modifier you won&#8217;t get a hit in the databases. As a convenience <code>clui<\/code> will detect this and remove the modifier to get the description. Using the <code>-F<\/code> will also display the sequence without the modifier. We can combine it with <code>-X<\/code> for expanded output with a a summary.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-69.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-69.png\" alt=\"\" class=\"wp-image-1490\" width=\"558\" height=\"183\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-69.png 804w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-69-300x99.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-69-768x252.png 768w\" sizes=\"auto, (max-width: 558px) 100vw, 558px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>As you can see the sequence without the modifier is shown, then the original sequence with the Fitzpatrick modifier then each component part: surfer, Fitzpatrick modifier type-6, a ZWJ, female sign, and a variation selector.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">On Variation Selectors<\/h3>\n\n\n\n<p>To be honest I&#8217;d never known about variation selectors before working on this, more info on Emoji Presentation Sequences can be found <a rel=\"noreferrer noopener\" href=\"http:\/\/unicode.org\/emoji\/charts\/emoji-variants.html\" target=\"_blank\">here<\/a>. The two most common variation selectors are pretty easy to understand: U+FE0E is &#8220;variation selector 15&#8221; and it is used to explicitly specify the text\/non-graphic version and U+FE0F, &#8220;variation selector 16&#8221; gives you the emoji\/graphic version. Watch (U+231A) is a good example of this. It&#8217;s at the discretion of the OS on how to render a glyph. In this case U+231A is rendered in the emoji style of an Apple Watch\u231a\ufe0fby default. When combined with U+FE0E, it turns into ye olde Mac OS watch \u231a\ufe0e, this is the &#8220;text version&#8221;. Adding U+FE0F does nothing to change the appearance since it was already rendered in the emoji style without it.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-28.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-28.png\" alt=\"\" class=\"wp-image-1430\" width=\"518\" height=\"114\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-28.png 582w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-28-300x66.png 300w\" sizes=\"auto, (max-width: 518px) 100vw, 518px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>If you&#8217;d like to search for every character with a variation selector that is tracked in macOS&#8217;s database, you can run this query: <code>clui -Sc U+FE0E U+FE0F<\/code> A definitive list can be found <a rel=\"noreferrer noopener\" href=\"https:\/\/unicode.org\/Public\/emoji\/12.1\/emoji-variation-sequences.txt\" target=\"_blank\">here<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Encoding Options<\/h3>\n\n\n\n<p>So far we&#8217;ve just seen the default uppercase hexadecimal (<code>-Eh<\/code>) UTF-8 encoding. In the vein of <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/shef\" target=\"_blank\">shef<\/a>, <code>clui<\/code> can output in various styles of encoding: <code>\\x<\/code> hex escapes (<code>-Ex<\/code>), octal <code>\\nnn<\/code> (<code>-Eo<\/code>), leading zero octal <code>\\0nnn<\/code> (<code>-E0<\/code>), UTF-16 Javascript encoding (<code>-u<\/code>) and zsh style UTF-32 <code>\\U<\/code> code points (<code>-E<\/code>U).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-68.png\"><img loading=\"lazy\" decoding=\"async\" width=\"474\" height=\"340\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-68.png\" alt=\"\" class=\"wp-image-1483\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-68.png 474w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-68-300x215.png 300w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/a><figcaption class=\"wp-element-caption\">Surfing safari, encoding party! \ud83e\udd19<\/figcaption><\/figure>\n<\/div>\n\n\n<p> <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Formatting output<\/h3>\n\n\n\n<p>Besides the beautiful RTF output and functional CSV output, <code>clui<\/code> can also output characters simply space delimited, without any other data (<code>-Oc<\/code>).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-44.png\"><img loading=\"lazy\" decoding=\"async\" width=\"354\" height=\"70\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-44.png\" alt=\"\" class=\"wp-image-1452\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-44.png 354w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-44-300x59.png 300w\" sizes=\"auto, (max-width: 354px) 100vw, 354px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>JSON (<code>-Oj<\/code>) and JSON Sequences (<code>-OJ<\/code>) can be had as well. The difference between JSON and JSON Sequence is that JSON will be an array of objects, whereas JSON Sequences are JSON objects delimited with U+1E the &#8220;record separator&#8221; as ASCII calls it or &#8220;information separator two&#8221; as Unicode knows it to be and newlines. Both <a rel=\"noreferrer noopener\" href=\"https:\/\/jqlang.github.io\/jq\/\" target=\"_blank\">jq<\/a> and <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/jpt\" target=\"_blank\">jpt<\/a> can handle JSON sequneces.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-65.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-65.png\" alt=\"\" class=\"wp-image-1480\" width=\"330\" height=\"278\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-65.png 702w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-65-300x253.png 300w\" sizes=\"auto, (max-width: 330px) 100vw, 330px\" \/><\/a><figcaption class=\"wp-element-caption\">JSON (<code>-Oj<\/code>)<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-66.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-66.png\" alt=\"\" class=\"wp-image-1481\" width=\"342\" height=\"273\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-66.png 668w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-66-300x240.png 300w\" sizes=\"auto, (max-width: 342px) 100vw, 342px\" \/><\/a><figcaption class=\"wp-element-caption\">JSON Sequence (<code>-OJ<\/code>)<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Lastly we have <a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/YAML\" target=\"_blank\">YAML<\/a> (<code>-Oy<\/code>) the superset cousin of JSON. My JSON string encoder <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/jse\" target=\"_blank\">jse<\/a> gets some use in <code>clui<\/code> to encode strings and descriptions for these output modes.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-67.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-67.png\" alt=\"\" class=\"wp-image-1482\" width=\"400\" height=\"232\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-67.png 632w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-67-300x174.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><figcaption class=\"wp-element-caption\">YAML, cousin of JSON<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Making it work for you (and me)<\/h2>\n\n\n\n<p>I spent a lot of time trying to make <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/clui\" target=\"_blank\"><code>clui<\/code><\/a> work in an intuitive way, it replicates the core features of Character Viewer with plenty of bonus functionality thrown in. It may not be something you use daily, but it might come in handy when you get an email from let&#8217;s say, <code>tim@\u0430\u0440\u0440l\u0435.com<\/code>. You could run that string through <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/clui\" target=\"_blank\"><code>clui<\/code><\/a> in &#8220;expand&#8221; mode (-x) to analyze on each letter in the string. You might be surprised and perhaps disappointed that perhaps &#8220;Tim Apple&#8221; did <em>not<\/em> send you that email.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-56.png\"><img decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-56.png\" alt=\"\" class=\"wp-image-1469\" width=\"-292\" height=\"-262\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-56.png 476w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-56-300x270.png 300w\" sizes=\"(max-width: 476px) 100vw, 476px\" \/><\/a><figcaption class=\"wp-element-caption\">Cyrillic look-a-likes! \ud83d\udd0e<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Or maybe you&#8217;d like to figure out the secrets of <a rel=\"noreferrer noopener\" href=\"https:\/\/stackoverflow.com\/questions\/6579844\/how-does-zalgo-text-work\/20310289#20310289\" target=\"_blank\">Zalgo Text<\/a> or perhaps what characters are in <code>\u00af\\_(\u30c4)_\/\u00af<\/code> or make a catalog of Emoji in RTF: <code>clui<\/code> can do it! Head on over to the <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/clui\" target=\"_blank\">clui Github<\/a> page and download the <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/clui\/releases\/latest\" target=\"_blank\">Release<\/a> if you&#8217;d like to try it out on your (Monterey+) Mac, thanks!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bonus<\/h2>\n\n\n\n<p>Since you made it down here, how about a one-liner that will create RTFs of all the Unicode categories? It will likely take several hours and will open a Finder window when finished.<\/p>\n\n\n\n<pre class=\"wp-block-code language-bash\"><code>#make RTFs of every Unicode category, this might take a few hours, if you want to cancel close the Terminal window\nmkdir ~\/Desktop\/clui-rtfs; cd ~\/Desktop\/clui-rtfs; IFS=$'\\n'; for category in $(clui -LC | grep Unicode,); do clui -Or -C \"$category\" &gt; \"$category.rtf\"; done; open -R .<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>My new tool clui, pronounced &#8220;clue-ee&#8221; offers Command Line Unicode Info with the ability to export to a variety of formats like CSV, JSON, YAML, RTF and more. While I&#8217;ve written a few macOS command line tools geared to the Mac Admin like jpt the JSON power tool, ljt the little JSON tool, shui for [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":1470,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,19,57,51,53,4,12],"tags":[20,58,34,54,25,24,61,60],"class_list":["post-1397","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apple","category-bash","category-clui","category-json","category-ljt","category-os-x","category-scripting","tag-bash","tag-jse","tag-json","tag-ljt","tag-macos","tag-shell","tag-unicode","tag-yaml"],"_links":{"self":[{"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/posts\/1397","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/comments?post=1397"}],"version-history":[{"count":34,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/posts\/1397\/revisions"}],"predecessor-version":[{"id":1504,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/posts\/1397\/revisions\/1504"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/media\/1470"}],"wp:attachment":[{"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/media?parent=1397"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/categories?post=1397"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/tags?post=1397"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}