• Re: PSA: Clipboard differences between Chromium & Firefox across platforms

    From Maria Sophia@mariasophia@comprehension.com to alt.comp.software.firefox on Wed Mar 11 16:06:54 2026
    From Newsgroup: alt.comp.software.seamonk

    Herbert Kleebauer wrote:
    There shouldn't be any problem when you copy text from a web page and
    past it into an usnet posting. There is only a problem if you
    convert the utf-8 text into "something else" and then paste it
    into the posting. You don't solve a problem, you create a problem.

    Hi Herbert,

    Thank you for asking a question to understand why the conversion is needed. You've helped me many times over the decades, and you deserve the answer.

    In the past, Carlos, Andy & others have noted my nntp headers have a
    character set defined (or not) that doesn't always match the character set.

    That's because I don't use a "real" newsreader.

    I wrote a unique simple newsreader (which is just a bunch of batch scripts with telnet, stunnel & gVim predominating) but which has no good way of knowing what character set I'm pasting into my gVim NNTP editing sessions.

    Worse, I can spend hours on a Usenet post, where I can combine input from dozens or even scores of web page sources, so character sets will mix.

    So I try to automagically force every character in the final gVim edit to
    be only 7-bit pure-ASCII characters (using a Notepad++ control-B macro).

    1. I select text in Chromium & press "ctrl+c" to copy to clipboard
    2. I type "n" in the taskbar Windows "Win+R" runbox to bring up Notepad++
    3. I type "ctrl+v" to paste that HTML text into that Notepad++ session
    4. I type "ctrl+b" to run the conversion to ASCII & clean the clipboard
    5. I type "ctrl+v" to paste that clipbrd into my gVim editing session

    This is extremely simple.
    Yet very complicated.

    It's brilliant, IMHO, but most people likely won't understand that concept.
    But some people *do* understand that the Windows clpbrd is rather messy.

    And some people might *appreciate* that I clean everything to 7-bit ASCII.

    While many people waste about five seconds per Usenet post, I can invest hours, where I collate input from a huge variety of sources, and, as it
    turns out, when copying from many sources, CF_HTML metadata fragments can corrupt the text in ways that most people have absolutely no idea of.

    Newsgroups: alt.comp.software.firefox,comp.sys.mac.system,alt.os.linux
    Subject: PSA: Clipboard differences between Chromium & Firefox across platforms
    Date: Thu, 12 Feb 2026 15:26:32 -0500
    Message-ID: <10mld1o$1910$1@nnrp.usenet.blueworldhosting.com>

    I need to stress that out of a million people, only two or three know what
    is in that thread I listed above, so I understand that most people wouldn't have any idea that the Linux/macOS/Windows clipboard is so complicated.

    It's simple.
    But it is complicated too.

    A clipboard copied from a browser contains a lot of "garbage".
    Only some of that garbage is visible, but much of it is invisible.

    The updated notepad++ macro below converts all that invisible/visible
    garbage into the ~95 7-bit pure ASCII characters found on my keyboard.

    <?xml version="1.0" encoding="UTF-8" ?>
    <!-- C:\app\editor\txt\N++\shortcuts.xml for Windows Notepad++ (N++) -->
    <!-- Automatically cleans fragments, converts to ASCII & copies to clipbrd --> <!-- Use model: Control+V (paste) & Control+B (run the macro) -->
    <!-- Notepad++ does not treat shortcuts.xml as a user-editable file. -->
    <!-- It treats it as an internal state file. -->
    <!-- If you hand-edit it, Notepad++ will rewrite it, reorder it, -->
    <!-- truncate it, or revert it to whatever it feels like doing. -->
    <!-- Which means you need to always save a text copy of every version -->
    <!-- v4p6 20260311 fix the problem that it doesn't always work -->
    <!-- Scintilla may preserve CF_HTML metadata even after cutting -->
    <!-- Force the clipboard to contain plain text by doing a 2x copy --> <!-- Copy cleaned text, Insert dummy char, Delete dummy char -->
    <!-- Select all, Copy again -->
    <!-- So clipboard contains only the 2nd copy, which is always text-->
    <!-- Fixed inaccuracies in the Scintilla-command comment section -->
    <!-- Also fixed two Tangsa blocks U+16C00 and U+16C20 which did nothing prior -->
    <!-- v4p5 20260311 fix the problem that a space is deleted -->
    <!-- But Scintilla 2326 had deleted the character before the caret --> <!-- So, instead of Insert space, Delete space before the caret -->
    <!-- Insert a newline, Move caret left, Delete the newline -->
    <!-- v4p4 Replace U+FFFD (REPLACEMENT CHARACTER) with nothing & collapse--> <!-- Merged letters around U+00A1 (inverted exclamation mark) -->
    <!-- v4p3 Replace U+FF1A (FULLWIDTH COLON) with ASCII ':' -->
    <!-- v4p2 Replace U+00D7 (MULTIPLICATION SIGN) with ASCII 'x' -->
    <!-- v4p1 20260213 Convert Tangsa UTF-8 (F4 86 B0 80) to a placeholder -->
    <!-- v4p0 (Scintilla changes this file so always save a text backup! -->
    <!-- v3p9 20260211 N++ was not running the macro in the order shown -->
    <!-- But it turned out any error causes an OLDER version to run. -->
    <!-- Worse, when that happens, N++ overwrites this file -->
    <!-- Worse, N++ is executing macro actions in a different order -->
    <!-- than they appear in the XML so a total rewrite is needed in v4p0 -->
    <!-- v3p8 20260211 U+2060 is driving me nuts so it's the first block now --> <!-- v3p7 20260211 moved U+2060 up because it's the most disruptive -->
    <!-- v3p6 20260211 U+2009 & U+200B not being converted properly -->
    <!-- v3p5 20260211 fixed U+200B failing when U+200B is between ' & s -->
    <!-- A 2nd pass was duplicated after apostrophe normalization rules --> <!-- v3p4 20260211 added U+275E (heavy double quote right) -->
    <!-- v3p3 20260211 added U+2009 (thin space) -->
    <!-- v3p2 20260211 added seven new conversions after running testcases -->
    <!-- U+02BE (modifier letter right half ring) -->
    <!-- U+02BF (modifier letter left half ring) -->
    <!-- U+201E (double low-9 quote) -->
    <!-- U+201F (double high-reversed-9 quote) -->
    <!-- U+275D (heavy double quote left) -->
    <!-- U+275E (heavy double quote right) -->
    <!-- U+2015 (horizontal bar) -->
    <!-- U+2009 (thin space) -->
    <!-- v3p1 20260211 reorganized into a dozen distinct categories -->
    <!-- (1) control characters: U+000F U+0001 -->
    <!-- (2) dashes & minus signs: U+2010 U+2011 U+2012 U+2212 -->
    <!-- (3) zero-width characters: U+200C U+200B U+200D U+FEFF U+2060 -->
    <!-- (4) special spaces: U+00A0 U+2007 U+202F U+200A U+2008 U+2006 -->
    <!-- (5) apostrophe-like characters:
    U+0F0C U+2018 U+2019 U+2032 U+02BC U+02B9 U+02C8 U+02EE
    U+201B U+02CB U+A78C U+FF07 -->
    <!-- (6) combining marks (remove after apostrophes):
    U+0351 U+0307 U+0331 U+0335 U+0336 U+0337 U+0338 -->
    <!-- (7) double-quote normalization: U+201C U+201D -->
    <!-- (8) dash-like & ellipsis & HTML entities:
    U+2026 - U+2014 U+2013 - -->
    <!-- (9) bullets, math symbols, diacritics:
    U+2022 U+8722 U+011F U+2009 U+00E1 U+0161 U+011B -->
    <!-- (10) miscellaneous symbols:
    U+2713 ASCII hyphen ' U+2192 U+00B0 U+00A9 U+2122 U+00AE -->
    <!-- (11) invisible operators:
    U+00AD U+2061 U+2062 U+2063 U+2064 U+180E -->
    <!-- (12) line separators: U+2028 U+2029 U+0085 -->
    <!-- v3p0 20260211 added combining marks U+0351 U+0307 U+0331 -->
    <!-- v3p1 20260211 added apostrophe-like characters U+201B U+02CB -->
    <!-- v2p9 20260211 moved U+2060 to be above apostrophe-related blocks -->
    <!-- v2p8 20260211 fixed Chromium CF_HTML paste control+A anomaly -->
    <!-- v2p7 20260211 added U+02EE modifier letter double apostrophe rule -->
    <!-- v2p6 20260211 fixed U+02C8 modifier letter vertical line) rule -->
    <!-- v2p5 20260211 fixed U+02B9 (modifier letter prime) rule -->
    <!-- v2p4 20260211 removed one of two U+000F blocks -->
    <!-- v2p3 20260211 removed two (duplicate) 1700 lines in U+0161 -->
    <!-- v2p2 20260211 fixed all zero-width blocks to replace with nothing -->
    <!-- v2p1 20260211 fixed BOM to replace with nothing -->
    <!-- v2p0 20260210 cleaned (emptied out) closing sections of the file -->
    <!-- v1p9 20260210 ported old shortcuts.xml to improve coverage -->
    <!-- Cleans Chromium pasted text & normalizes Unicode to ASCII -->
    <!-- Use model: paste (using control+v) & fix (using control+b) -->
    <!-- The macro should 1st break CF_HTML fragment mode (so Ctrl+A works) --> <!-- and then run the Unicode-to-ASCII cleanup on all the pasted text -->
    <!-- cutting (control+x) the result back into the Windows clipboard -->
    <!-- thereby leaving the N++ GUI empty & ready for the next paste-->

    <!--
    To break Scintilla's CF_HTML fragment mode, we need to make any edit.
    We can insert a space & then delete that space, for example.
    <Action type="0" message="2001" wParam="32" /> (insert a space)
    <Action type="0" message="2326" /> (delete a char to the left)
    But that is dependent on the position of the cursor, which changes!
    So, in v4p4, instead of Insert space, Delete space before the caret
    Insert a newline, Move caret left, Delete the newline


    <!-- Scintilla message-id engine command meanings:
    1601 = set the search string (the Unicode character to find)
    1602 = set the replacement string (ASCII equivalent)
    1625 = clear the replacement buffer
    1700 = begin a new search/replace operation
    1701 = end this search/replace block
    1702 = execute Replace All
    2001 = Replace the current selection with the given text
    2013 = SCI_SELECTALL (selects everything)
    2177 = SCI_CUT (cut all)
    2304 = Move caret one character to the left
    2326 = SCI_DELETEBACK (delete the character to the left of the caret)
    2327 = Delete the character to the right of the caret
    41001 = IDM_FILE_EXIT (close)


    <!-- When you paste from a Chromium-based app, the clipboard contains:
    CF_UNICODETEXT (plain text) & CF_HTML (HTML fragment)
    And sometimes CF_RTF where N++ prefers CF_HTML if available.

    v2p0 fixes a N++ selection issue caused by CF_HTML pastes.
    "HTML Paste Mode" prevents the "Control+A" from working.
    "HTML paste mode" inserts HTML fragment as plain text
    where Ctrl+A is disabled until the buffer is "normalized"
    (until the first edit that breaks the fragment state)


    <!-- BELOW IS THE START OF THE NOTEPAD++ SHORTCUTS.XML FILE -->
    <!-- Below is garbage that N++ adds to shortcuts.xml -->
    <NotepadPlus>
    <InternalCommands>
    <Shortcut id="43009" Ctrl="no" Alt="no" Shift="no" Key="0" />
    </InternalCommands>
    <Macros>
    <!-- Above is garbage that N++ adds to shortcuts.xml -->

    <!-- ASCII "control+b" Cleanup Macro -->
    <Macro name="ASCII" Ctrl="yes" Alt="no" Shift="no" Key="66">

    <!-- Begin Scintilla HTML-paste workaround top portion -->
    <!-- Break Chromium CF_HTML fragment mode by adding & deleting a line -->
    <!-- Insert newline -->
    <Action type="0" message="2001" wParam="10" lParam="0" sParam="" />
    <!-- Move caret left -->
    <Action type="0" message="2304" wParam="0" lParam="0" sParam="" />
    <!-- Delete character to the right -->
    <Action type="0" message="2327" wParam="0" lParam="0" sParam="" />
    <!-- Select all text before running cleanup -->
    <Action type="0" message="2013" wParam="0" lParam="0" sParam="" />
    <!-- End Scintilla HTML-paste workaround top portion -->

    <!-- BEGIN STANDARD CONVERSION BLOCKS -->

    <!-- U+2060 is driving me nuts so I'm making it the 1st block -->
    <!-- U+2060 must be placed above the apostrophe-related blocks -->
    <!-- Otherwise apostrophe block may skip over it -->
    <!-- U+2060 is disruptive as it must be placed above zero-width too -->
    <!-- Replace U+2060 (WORD JOINER) with nothing -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2060;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #1. CONTROL CHARACTERS (remove first) -->
    <!-- Replace U+000F (SHIFT-OUT control character) with nothing -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+0001 (SOH control character) with nothing -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0001;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #2. DASHES & MINUS SIGNS (safest to remove early) -->
    <!-- Replace U+2010 (HYPHEN) with ASCII "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2010;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2011 (NON-BREAKING HYPHEN) with ASCII hyphen "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2011;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2012 (FIGURE DASH) with ASCII "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2012;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2212 (MINUS SIGN) with ASCII "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2212;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #3. ZERO-WIDTH CHARACTERS (must be BEFORE apostrophes) -->

    <!-- Replace U+200C (ZERO WIDTH NON-JOINER) with "" (nothing) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x200C;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+200B (ZERO WIDTH SPACE) with nothing -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x200B;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+200D (ZERO WIDTH JOINER) with nothing -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x200D;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+FEFF (BOM) with nothing -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#xFEFF;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #4. SPECIAL SPACES (convert to ASCII space) -->
    <!-- Replace U+00A0 (NO-BREAK SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x00A0;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2007 (FIGURE SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2007;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+202F (NARROW NO-BREAK SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x202F;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+200A (HAIR SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x200A;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2008 (PUNCTUATION SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2008;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2006 (SIX-PER-EM SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2006;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #5. APOSTROPHE-LIKE CHARACTERS -->
    <!-- Replace U+0F0C (TIBETAN MARK DELIMITER) with ASCII apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0F0C;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2018 (LEFT SINGLE QUOTE) with ASCII apostrophe "'" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2018;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2019 (RIGHT SINGLE QUOTATION) with ASCII apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2019;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2032 (PRIME) with ASCII apostrophe -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2032;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+02BC (MODIFIER LETTER APOSTROPHE) with ASCII apostrophe --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x02BC;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+02B9 (MODIFIER LETTER PRIME) with ASCII apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x02B9;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+02C8 (MODIFIER LETTER VERTICAL) with ASCII apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x02C8;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+02EE (MODIFIER DOUBLE APOSTROPHE) with ASCII apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x02EE;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- U+201B (SINGLE HIGH-REVERSED-9 QUOTATION MARK) with apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x201B;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+02CB (MODIFIER LETTER GRAVE ACCENT) with ASCII apostrophe "'" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x02CB;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- This is is a duplication which is after the apostrophes -->
    <!-- When U+200B appears between two characters that were already replaced --> <!-- the first pass fails to remove it, so I added this duplicate -->
    <!-- Remove U+200B (ZERO-WIDTH SPACE) second pass -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x200B;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #6. COMBINING MARKS (remove only after apostrophes are done) -->
    <!-- Remove U+0351 (COMBINING RIGHT HALF RING ABOVE) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0351;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Remove U+0307 (COMBINING DOT ABOVE) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0307;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Remove U+0331 (COMBINING MACRON BELOW) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0331;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />


    <!-- #7. DOUBLE-QUOTE NORMALIZATION -->
    <!-- Replace U+201C (LEFT DOUBLE QUOTE) with ASCII double quote " -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x201C;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam='&quot;' /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+201D (RIGHT DOUBLE QUOTE) with ASCII double quote -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x201D;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam='&quot;' /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #8. ELLIPSIS, EM DASH, EN DASH, HTML ENTITIES -->
    <!-- Replace U+2026 (HORIZONTAL ELLIPSIS) with ASCII "..." -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2026;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="..." />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace literal - (HTML entity for EM DASH) with ASCII "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&amp;#151;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2014 (EM DASH) with ASCII "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2014;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2013 (EN DASH) with ASCII "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2013;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace literal - (ZERO WIDTH NON-JOINER entity) with ASCII "-" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #9. BULLETS, MATH SYMBOLS, LETTERS WITH DIACRITICS -->
    <!-- Replace U+2022 (BULLET) with ASCII "*" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2022;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&#x002A;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+8722 (MATHEMATICAL MINUS variant) with ASCII "&" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x8722;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&amp;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+011F (LATIN SMALL G WITH BREVE) with ASCII "g" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x11f;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="g" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+00E1 (LATIN SMALL A WITH ACUTE) with ASCII "a" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#xe1;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="a" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+0161 (LATIN SMALL S WITH CARON) with ASCII "s" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x161;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="s" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+011B (LATIN SMALL E WITH CARON) with ASCII "e" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x11b;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="e" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #10. MISCELLANEOUS SYMBOLS -->
    <!-- Replace U+2713 (CHECK MARK) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2713;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace ASCII hyphen "-" with ASCII hyphen "-" (normalize) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace backtick with ASCII single quote -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="'" />
    <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace Unicode Arrow (U+2192) with ASCII dash greaterthan -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2192;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="->" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace degree symbol with deg -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x00B0;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="deg" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace copyright symbol U??? with (C) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x00A9;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="(C)" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace Trademark (U+2122) with (TM) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2122;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="(TM)" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace Registered (U+00AE) with (R) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x00AE;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="(R)" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />


    <!-- #11. INVISIBLE OPERATORS (remove) -->
    <!-- Replace U+00AD (SOFT HYPHEN) with "" (remove completely) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x00AD;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2061 (FUNCTION APPLICATION) with "" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2061;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2062 (INVISIBLE TIMES) with "" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2062;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2063 (INVISIBLE SEPARATOR) with "" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2063;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2064 (INVISIBLE PLUS) with "" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2064;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+180E (MONGOLIAN VOWEL SEPARATOR) with "" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x180E;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #12. LINE SEPARATORS -->
    <!-- Replace U+2028 (LINE SEPARATOR) with ASCII newline -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2028;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2029 (PARAGRAPH SEPARATOR) with ASCII newline -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2029;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+0085 (NEXT LINE / NEL) with ASCII newline -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0085;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+A78C (LATIN SMALL LETTER SALTILLO) with ASCII apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#xA78C;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+FF07 (FULLWIDTH APOSTROPHE) with ASCII apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#xFF07;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Remove U+0335 (COMBINING SHORT STROKE OVERLAY) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0335;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Remove U+0336 (COMBINING LONG STROKE OVERLAY) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0336;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Remove U+0337 (COMBINING SHORT SOLIDUS OVERLAY) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0337;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Remove U+0338 (COMBINING LONG SOLIDUS OVERLAY) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0338;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2043 (HYPHEN BULLET) with ASCII "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2043;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+02BE (MODIFIER LETTER RIGHT HALF RING) w/ ASCII apostrophe --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x02BE;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+02BF (MODIFIER LETTER LEFT HALF RING) w/ ASCII apostrophe --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x02BF;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+201E (DOUBLE LOW-9 QUOTATION MARK) w/ ASCII double quote --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x201E;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&quot;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+201F (DOUBLE HIGH-REVERSED-9 QUOTATION MARK) w/ dquote --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x201F;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&quot;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+275D (HEAVY DOUBLE QUOTATION MARK ORNAMENT LEFT) w/ dquote --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x275D;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&quot;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+275E (HEAVY DOUBLE QUOTATION MARK ORNAMENT RIGHT) w/ dquote --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x275E;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&quot;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2015 (HORIZONTAL BAR) with ASCII hyphen -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2015;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2009 (THIN SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2009;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2009 (THIN SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2009;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+00D7 (MULTIPLICATION SIGN) with ASCII 'x' -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x00D7;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="x" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+FF1A (FULLWIDTH COLON) with ASCII ':' -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#xFF1A;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=":" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- END OF STANDARD CONVERSION BLOCKS -->

    <!-- v4p1 Convert Tangsa UTF-8 (F4 86 B0 80) to a harmless placeholder -->
    <!-- Replace U+16C00 (Tangsa Letter OZ) with placeholder -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x16C00;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="[[NW]]" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />


    <!-- Replace U+16C20 (mutated Tangsa) with placeholder -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x16C20;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="[[NW]]" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+FFFD (REPLACEMENT CHARACTER) with nothing -->
    <!--
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#xFFFD;" />
    <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />


    <!-- Merge letters around U+FFFD (fix broken ligatures by collapsing) --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="([A-Za-z])&#xFFFD;([A-Za-z])" />
    <Action type="3" message="1625" wParam="0" lParam="0" sParam="\1\2" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Merge letters around U+00A1 (inverted exclamation mark) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="([A-Za-z])&#x00A1;\s*([A-Za-z])" />
    <Action type="3" message="1625" wParam="0" lParam="0" sParam="\1\2" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Begin Scintilla HTML-paste workaround bottom portion -->
    <!-- First copy -->
    <Action type="0" message="2178" />
    <!-- Insert dummy space -->
    <Action type="0" message="2001" wParam="32" />
    <!-- Move caret left -->
    <Action type="0" message="2304" />
    <!-- Delete dummy space safely -->
    <Action type="0" message="2327" />
    <!-- Select all again -->
    <Action type="0" message="2013" />
    <!-- Second copy (guaranteed plain text) -->
    <Action type="0" message="2178" />
    <!-- Cut to empty editor -->
    <Action type="0" message="2177" />
    <!-- End Scintilla HTML-paste workaround bottom portion -->

    <!-- Close N++ -->
    <Action type="2" message="41001" wParam="0" lParam="0" sParam="" />

    <!-- N++ will save shortcuts.xml automatically as it
    rewrites the file whenever shortcuts/macros/plugins change.
    Some sections are required so empty sections will be recreated.


    </Macro>
    </Macros>
    <UserDefinedCommands>
    </UserDefinedCommands>

    <PluginCommands />
    <ScintillaKeys />

    </NotepadPlus>

    <!-- ABOVE IS THE MEAT OF THE NOTEPAD++ SHORTCUTS.XML FILE -->
    --
    There are two kinds of people on Usenet, only one of which can add value.
    --- Synchronet 3.21d-Linux NewsLink 1.2