• Tutorial: Notepad++ shortcuts.xml macro converts unicode to the 95-keyboard ASCII characters

    From Marian@marianjones@helpfulpeople.com to alt.comp.os.windows-10,alt.comp.os.windows-11,alt.comp.microsoft.windows on Thu Dec 11 09:42:48 2025
    From Newsgroup: alt.comp.os.windows-11

    Tutorial:
    Notepad++ shortcuts.xml macro converts unicode to the 95-keyboard ASCII characters

    Below is a shortcuts.xml that builds a macro to convert any character that
    is in a copy-and-pasted excerpt into one of the 95 QWERTY keyboard 7-bit
    ASCII characters.

    The use model is simple:
    a. Edit or replace your current shortcuts.xml with this shortcuts.xml
    b. Paste the text to be converted into Notepad++
    c. Press Control+A Control+B to convert the Unicode to 7-bit ASCII

    A typical sequence is:
    ctrl+x (copies text snippet from a news article containing Unicode)
    Win+R > n (starts notepad using the registry App Paths key)
    ctrl+v (pastes the text into Notepad++)
    ctrl+a (selects it all, if not already all selected)
    ctrl+b (runs the macro which converts unicode to ascii)
    ctrl+x (cuts it all out of the Notepadd++ session)
    ctrl+v (pastes it back into where you needed it in gVim)

    Only the most common unicode characters are in this conversion xml such as
    Convert (') apostrophe instead of curly apostrophe (U+2018 U+2019)
    Convert (" straight doublequote instead of curly doublequote (U+201C U+201D)
    Convert (-) hyphen-minus instead of en dash or em dash (U+2013 U+2014)
    Convert (...) three periods instead of ellipsis character (U+2026)
    Convert (space) normal space instead of non-breaking space (U+00A0)
    Convert (*) asterisk or ( - ) hyphen instead of typographic bullet (U+2022)
    Convert text "degrees" instead of degree symbol (U+00B0)
    Convert (>) greater-than sign instead of [RIGHT ARROW U+2192]
    Convert (<) less-than sign instead of [LEFT ARROW U+2190]
    Convert text "(TM)" instead of trademark symbol (U+2122)
    Convert text "(R)" instead of registered mark symbol (U+00AE)
    Convert text "(C)" instead of copyright symbol (U+00A9)
    Convert CRLF (U+000D U+000A) Windows-style line endings instead of LF-only
    Convert (U+000A) Unix-style line endings when preparing code/text for Windows gVim.

    If any are missing that are common, please add the conversion code.
    (This is my actual copy - as it has been edited umpteen times over time;
    but I'll post a followup cleanup version which should be easier to parse.)

    <?xml version="1.0" encoding="UTF-8" ?>
    <!-- shortcuts.xml, version 1p0: ctrl+a ctrl+b, Macro > ASCII -->
    <NotepadPlus>
    <InternalCommands>
    <Shortcut id="43009" Ctrl="no" Alt="no" Shift="no" Key="0" />
    </InternalCommands>
    <Macros>
    <Macro name="ASCII" Ctrl="yes" Alt="no" Shift="no" Key="66">
    <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="" />

    <!-- === NEW: Handle SOH (ASCII 0x01) === -->
    <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="" />
    <!-- Replace SOH with nothing (strip it) -->
    <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 SOH block === -->

    <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="" />

    <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="" />
    <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="" />
    <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="" />

    <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="" />

    <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="" />

    <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="" />

    <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="" />

    <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="&#x2a;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <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="&apos;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <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="&apos;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <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="&apos;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <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="&apos;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <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="&apos;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <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="&apos;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <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="&apos;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <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="&apos;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <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="&apos;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <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="" />

    <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="" />


    <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="" />

    <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="" />

    <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="" />

    <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="" />

    <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="&amp;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <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="" />

    <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="" />

    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&zwnj;" />
    <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="" />

    <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="" />

    <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="" />

    <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="" />

    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#8201;" />
    <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="" />

    <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="" />

    <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="" />

    <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="" />
    <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="" />

    <!-- === START: Extra mappings === -->
    <!-- Apostrophe lookalikes -->
    <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="" />

    <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="" />

    <!-- Extra dash variants -->
    <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="" />

    <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="" />

    <!-- Backtick to 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="" />

    <!-- Unicode Arrow (U+2192) to 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="" />

    <!-- degree symbol to the word 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="" />

    <!-- copyright symbol to the letter (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="" />

    <!-- Trademark (U+2122) to (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="" />

    <!-- Registered (U+00AE) to (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="" />

    <!-- === END: Extra mappings === -->
    </Macro>

    </Macros>
    <UserDefinedCommands>
    <Command name="Get PHP help" Ctrl="no" Alt="yes" Shift="no" Key="112">https://www.php.net/$(CURRENT_WORD)</Command>
    <Command name="Wikipedia Search" Ctrl="no" Alt="yes" Shift="no" Key="114">https://en.wikipedia.org/wiki/Special:Search?search=$(CURRENT_WORD)</Command>
    <Command name="Open file in another instance" Ctrl="no" Alt="yes" Shift="no" Key="117">$(NPP_FULL_FILE_PATH) $(CURRENT_WORD) -nosession -multiInst</Command>
    </UserDefinedCommands>
    <PluginCommands />
    <ScintillaKeys />
    </NotepadPlus>
    --
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Marian@marianjones@helpfulpeople.com to alt.comp.os.windows-10,alt.comp.os.windows-11,alt.comp.microsoft.windows on Thu Dec 11 09:56:58 2025
    From Newsgroup: alt.comp.os.windows-11

    UPDATE:

    Currently every shortcuts.xml mapping is written out as a 6-line block:
    1700 -> start search
    1601 -> set search string (funky character)
    1625 -> clear replace buffer
    1602 -> set replacement string (ASCII equivalent)
    1702 -> run replace all
    1701 -> end

    That's why the file looks so long and repetitive.
    This started as a convertion of just a couple of funky characters to ASCII. Then it grew over time (years) one by one to include more characters.

    We can't avoid the repetition entirely because Notepad++ macros don't
    support loops or dictionaries.

    But we can simplify because for Notepad++ macros, we don't actually need
    the reset/clear/end lines every time.

    The essential trio is:
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="BADCHAR" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="GOODCHAR" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    So each mapping shrinks from 6 lines > 3 lines.

    However, if we're open to using a plugin (like PythonScript or LuaScript),
    we can collapse the whole macro into a dictionary loop such as this:
    mapping = {
    "\u2010": "-", # hyphen
    "\u2011": "-", # non-breaking hyphen
    "\u2013": "-", # en dash
    "\u2014": "-", # em dash
    "\u2018": "'", # left single quote
    "\u2019": "'", # right single quote
    "\u201C": '"', # left double quote
    "\u201D": '"', # right double quote
    "\u2026": "...",# ellipsis
    "\u2022": "*", # bullet
    "\u00A0": " ", # non-breaking space
    "\uFEFF": "", # BOM
    # ¡K add the rest
    }

    editor.beginUndoAction()
    for bad, good in mapping.items():
    editor.rereplace(bad, good)
    editor.endUndoAction()

    I'll post the test version of the rewritten macro in the next update.
    --
    I go to trouble and time and effort to write my Usenet posts because I'm
    kind hearted enough to care that everyone gets excellent researched data.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Marian@marianjones@helpfulpeople.com to alt.comp.os.windows-10,alt.comp.os.windows-11,alt.comp.microsoft.windows on Thu Dec 11 10:46:12 2025
    From Newsgroup: alt.comp.os.windows-11

    Marian wrote:
    Currently every shortcuts.xml mapping is written out as a 6-line block:
    1700 -> start search
    1601 -> set search string (funky character)
    1625 -> clear replace buffer
    1602 -> set replacement string (ASCII equivalent)
    1702 -> run replace all
    1701 -> end

    UPDATE:

    Drat. The original depended on 1700/1625/1701 around each replace.
    So I removed the redundancy. When I tested it, only some characters worked.

    But for characters like degree, copyright, trademark, registered, etc., Notepad++ apparently must have the reset (1700), clear (1625) and end (1701) lines around the replace (1702) because otherwise, AFAICT, the Find/Replace engine apparently doesn't execute.

    So we're stuck with the redundancy for Notepad++ to replace each character.
    Hyphens: - - - - - -
    Quotes: ' ' " " 'backtick'
    Ellipsis: ...
    Bullets: *
    Zero-widtha: ''' (these may look invisible)
    Spaces:
    Symbols: 90deg (C) (TM) (R)
    Arrowa: ->
    Literals: - &amp;#151;
    Diacritics: g s e a
    SOH: [U+0001 here]
    etc.


    Here is the latest working version which I tested against the above characters.

    <?xml version="1.0" encoding="UTF-8" ?>
    <!-- Notepad++ shortcuts.xml version 1p1 20251211 -->
    <!-- Use model: ctrl+A (select all), ctrl=B (convert) -->
    <!-- -->
    <!-- 1700 start search -->
    <!-- 1601 set search string (funky character) -->
    <!-- 1625 clear replace buffer -->
    <!-- 1602 set replacement string (ASCII equivalent) -->
    <!-- 1702 run replace all -->
    <!-- 1701 end -->
    <!-- -->

    <NotepadPlus>
    <InternalCommands>
    <Shortcut id="43009" Ctrl="no" Alt="no" Shift="no" Key="0" />
    </InternalCommands>

    <Macros>
    <Macro name="ASCII" Ctrl="yes" Alt="no" Shift="no" Key="66">

    <!-- U+2010 HYPHEN ? "-" -->
    <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="" />

    <!-- U+2011 NON-BREAKING 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="" />

    <!-- U+2012 FIGURE DASH ? "-" -->
    <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="" />

    <!-- U+2013 EN DASH ? "-" -->
    <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="" />

    <!-- U+2014 EM DASH ? "-" -->
    <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="" />

    <!-- U+2212 MINUS SIGN ? "-" -->
    <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="" />

    <!-- U+2018 LEFT SINGLE QUOTE ? "'" -->
    <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="" />

    <!-- U+2019 RIGHT SINGLE QUOTE ? "'" -->
    <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="" />

    <!-- U+201C LEFT 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="" />

    <!-- U+201D RIGHT 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="" />

    <!-- U+2026 HORIZONTAL ELLIPSIS ? "..." -->
    <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="" />

    <!-- U+2022 BULLET ? "*" -->
    <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="*" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- U+200B ZERO WIDTH SPACE ? "" -->
    <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="" />

    <!-- U+200C ZERO WIDTH NON-JOINER ? "'" -->
    <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="&apos;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- U+200D ZERO WIDTH JOINER ? "'" -->
    <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="&apos;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- U+2060 WORD JOINER ? "'" -->
    <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="&apos;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- U+FEFF BOM ? "" -->
    <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="" />

    <!-- U+00A0 NO-BREAK 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="" />

    <!-- U+2007 FIGURE 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="" />

    <!-- U+202F NARROW NO-BREAK 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="" />

    <!-- U+00B0 DEGREE SIGN ? "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="" />

    <!-- U+00A9 COPYRIGHT SIGN ? "(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="" />

    <!-- U+2122 TRADE MARK SIGN ? "(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="" />

    <!-- U+00AE REGISTERED SIGN ? "(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="" />

    <!-- U+2192 RIGHT ARROW ? "->" -->
    <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="" />

    <!-- BACKTICK ? "'" -->
    <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="" />

    <!-- Literal &zwnj; ? "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&zwnj;" />
    <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="" />

    <!-- Literal &amp;#151; ? "&" -->
    <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="&amp;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- U+011F LATIN SMALL LETTER G WITH BREVE ? "g" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x011F;" />
    <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="" />

    <!-- U+0161 LATIN SMALL LETTER S WITH CARON ? "s" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0161;" />
    <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="" />

    <!-- U+011B LATIN SMALL LETTER E WITH CARON ? "e" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x011B;" />
    <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="" />

    <!-- U+00E1 LATIN SMALL LETTER A WITH ACUTE ? "a" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x00E1;" />
    <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="" />

    <!-- U+0001 SOH ? "" -->
    <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="" />

    </Macro>
    </Macros>

    <UserDefinedCommands>
    <Command name="Get PHP help" Ctrl="no" Alt="yes" Shift="no" Key="112">https://www.php.net/$(CURRENT_WORD)</Command>
    <Command name="Wikipedia Search" Ctrl="no" Alt="yes" Shift="no" Key="114">https://en.wikipedia.org/wiki/Special:Search?search=$(CURRENT_WORD)</Command>
    <Command name="Open file in another instance" Ctrl="no" Alt="yes" Shift="no" Key="117">$(NPP_FULL_FILE_PATH) $(CURRENT_WORD) -nosession -multiInst</Command>
    </UserDefinedCommands>

    <PluginCommands />
    <ScintillaKeys />
    </NotepadPlus>
    --
    I invest energy in composing Usenet posts because I care greatly about people getting full & complete information so we move our tribal knowledge forward.

    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From R.Wieser@address@is.invalid to alt.comp.os.windows-10,alt.comp.os.windows-11,alt.comp.microsoft.windows on Thu Dec 11 19:46:53 2025
    From Newsgroup: alt.comp.os.windows-11

    Arlen,

    Currently every shortcuts.xml mapping is written out as a 6-line block:
    1700 -> start search
    Initialize.search engine

    1601 -> set search string (funky character)
    1625 -> clear replace buffer
    search type. lParam=0 -> standard

    1602 -> set replacement string (ASCII equivalent)
    1702 -> run replace all
    how to search. lParam=768 -> Search forward, wrap-around

    1701 -> end
    Execute the search. lParam=1609 -> Replace all

    The essential trio is:
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="BADCHAR" /> <Action type="3" message="1602" wParam="0" lParam="0" sParam="GOODCHAR" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    So each mapping shrinks from 6 lines > 3 lines.

    In the light of the above, not quite. Maybe the the below ?

    -- Initialize
    1700
    1625
    1702
    -- Repeated block
    1601
    1602
    1701

    Odd though : you have posted the standard macros, as if you have not tested your "the essential trio" conclusion yourself ...

    And a remark : When you replace something with something else, and than
    later replace that something else by something-yet-else you won't like the result (no occurence of "something else" will remain). You need the second replace come before the first one.

    Also, replacing something with itself doesn't really do much. :-)

    And a hint : make sure that all indentation is correct before hitting the "send" button. Seeing the "action" lines having four different indentations looks ugly. Same for wrapping replace-blocks (those 6 lines you spoke of) with empty lines. Either do it everywhere, or do it nowhere.

    And I almost forgot : You need to be carefull when replacing special chars with phrases. You might have better results when wrapping the phrases with spaces ( see "->" and "deg")

    And noticed while walking thru that list :
    "&#8201;" is a thin space, not an "x".
    "&amp;#151;" to "&amp;" ? Not a dash ?
    '&quot;' with single-quotes around it instead of double ones ? Any reason for that ?
    "apos;" ? Why not just a single quote thats available on you keyboard ? "&#x00A0;" is a hard space, not a quote.
    "&#x2018;" and "&#x2019;" are twice in there.
    "&#x2a;" is a standard ASCII char ("*"). Why not use it instead ?

    Regards,
    Rudy Wieser


    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Marian@marianjones@helpfulpeople.com to alt.comp.os.windows-10,alt.comp.os.windows-11,alt.comp.microsoft.windows on Thu Dec 11 19:38:52 2025
    From Newsgroup: alt.comp.os.windows-11

    R.Wieser wrote:
    Odd though : you have posted the standard macros, as if you have not tested your "the essential trio" conclusion yourself ...

    Thanks for looking at the code, which was designed to convert the most
    common "funky" characters found in web site copy pasted text to only the 95
    or so characters found on a typical US QWERTY keyboard.

    When I tested the "essential trio", I didn't realize it missed some (like copyright, trademark, degrees, etc.), so I posted an update replacing the
    trio with the half dozen.

    So I agree with you that the essential trio was posted before I was
    positive it worked in all cases - which it didn't - so I replaced it.

    Also, replacing something with itself doesn't really do much. :-)

    I'm not sure what you mean by that since the replacement is to change
    Unicode characters (for the most part) into 7-bit ASCII characters.

    So, in the sense that a curly quote is changed to a regular quote, you
    could argue it's replacing itself, but in reality it's a different
    character.

    If you're on the Android newsgroup, you'll see more clearly why it matters. We've had a discussion about charset Usenet headers in recent days.


    And a hint : make sure that all indentation is correct before hitting the "send" button. Seeing the "action" lines having four different indentations looks ugly. Same for wrapping replace-blocks (those 6 lines you spoke of) with empty lines. Either do it everywhere, or do it nowhere.

    Good point. That's my actual code so I didn't clean it up for presentation.

    And I almost forgot : You need to be carefull when replacing special chars with phrases. You might have better results when wrapping the phrases with spaces ( see "->" and "deg")

    Yeah. Thanks. The degree I struggled with bothering with since gVIM can
    handle the degree but I wanted to be consistent in removing all the common characters which are found in copy-pasted web sites that's not on the
    keyboard.

    There's no "arrow" or "degree" symbol on the keyboard.

    And I noticed while walking thru that list :
    "&#8201;" is a thin space, not an "x".
    "&amp;#151;" to "&amp;" ? Not a dash ?
    '&quot;' with single-quotes around it instead of double ones ? Any reason for that ?
    "apos;" ? Why not just a single quote thats available on you keyboard ? "&#x00A0;" is a hard space, not a quote.
    "&#x2018;" and "&#x2019;" are twice in there.
    "&#x2a;" is a standard ASCII char ("*"). Why not use it instead ?

    Thank you for making those wonderful suggestions.
    I'll take them each on their own merits in a moment, as I appreciate the
    help, not only for me, but for everyone as we all can use this sanitizer.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Marian@marianjones@helpfulpeople.com to alt.comp.os.windows-10,alt.comp.os.windows-11,alt.comp.microsoft.windows on Thu Dec 11 20:21:22 2025
    From Newsgroup: alt.comp.os.windows-11

    R.Wieser wrote:
    Currently every shortcuts.xml mapping is written out as a 6-line block:
    1700 -> start search
    Initialize.search engine

    1601 -> set search string (funky character)
    1625 -> clear replace buffer
    search type. lParam=0 -> standard

    1602 -> set replacement string (ASCII equivalent)
    1702 -> run replace all
    how to search. lParam=768 -> Search forward, wrap-around

    1701 -> end
    Execute the search. lParam=1609 -> Replace all

    The essential trio is:
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="BADCHAR" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="GOODCHAR" /> >> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    So each mapping shrinks from 6 lines > 3 lines.

    In the light of the above, not quite. Maybe the the below ?

    -- Initialize
    1700
    1625
    1702
    -- Repeated block
    1601
    1602
    1701

    I agree with anyone, no matter who they are, who makes a logically sensible argument, even if it's a choice between two essentially equivalent methods.

    <Action message="1700" ... /> <!-- start search -->
    <Action message="1601" ... /> <!-- set search string -->
    <Action message="1625" ... /> <!-- clear replace buffer -->
    <Action message="1602" ... /> <!-- set replacement string -->
    <Action message="1702" ... /> <!-- run replace all -->
    <Action message="1701" ... /> <!-- end -->

    Apparently you're saying we don't need to repeat the half dozen for each mapping but just repeat the essential trio after initializing at the start.

    <Action message="1601" sParam="BADCHAR" />
    <Action message="1602" sParam="GOODCHAR" />
    <Action message="1702" lParam="768" />

    I agree your organization is shorter & clearer.

    Initialization (done once at the top):
    1700
    1625
    1702
    Then for each mapping:
    1601 (set search string)
    1602 (set replacement string)
    1701 (end)

    I agree it "should" work and it would be clearer to others in many cases. Although repeating steps for each character accomplishes the same tasks.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Marian@marianjones@helpfulpeople.com to alt.comp.os.windows-10,alt.comp.os.windows-11,alt.comp.microsoft.windows on Thu Dec 11 20:23:19 2025
    From Newsgroup: alt.comp.os.windows-11

    And I noticed while walking thru that list :
    "&#8201;" is a thin space, not an "x".
    "&amp;#151;" to "&amp;" ? Not a dash ?
    '&quot;' with single-quotes around it instead of double ones ? Any reason
    for that ?
    "apos;" ? Why not just a single quote thats available on you keyboard ?
    "&#x00A0;" is a hard space, not a quote.
    "&#x2018;" and "&#x2019;" are twice in there.
    "&#x2a;" is a standard ASCII char ("*"). Why not use it instead ?


    Thank you for all those suggestions, where, as always, I easily agree
    with anyone who makes a logically sensible argument, no matter what.

    1. Regarding "&#8201;" is a thin space, not an "x".
    I don't see &#8201; (thin space) explicitly listed in the macro.
    &#x00A0; (NO-BREAK SPACE was replaced with " ")
    &#x2007; (FIGURE SPACE was replaced with " ")
    &#x202F; (NARROW NO-BREAK SPACE was replaced with " ")

    I haven't tested it thoroughly but this is what I'll test:
    <!-- U+2009 THIN 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="" />

    2. Regarding "&amp;#151;" to "&amp;" ? Not a dash ?
    &#151; is a legacy Windows-1252 code for an em dash.
    In proper Unicode, the em dash is &#x2014;
    Since &#151; represents a dash, the replacement should logically be a dash (-).
    Good catch. Here's the fixed block.

    <!-- Literal &amp;#151; ? "-" -->
    <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="" />

    3. &quot; is the XML entity for a double quote (").
    In XML, both single ' and double " quotes are valid for wrapping attribute values.
    Functionally, it works fine in that Notepad++ will interpret it correctly.
    Using single quotes around &quot; is just a stylistic choice.
    sParam="&quot;" will also work.

    For easier reading, I'll change it to these.
    <!-- U+201C LEFT 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="" />

    <!-- U+201D RIGHT 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="" />

    The change is:
    Before: sParam='&quot;' (single quotes around the entity).
    Now: sParam="&quot;" (double quotes around the entity).

    4. "apos;" ? Why not just a single quote that's available on your keyboard?
    The reason is that I was in syntax hell when I first tried it.
    So instead of a single quote, I used the XML entity for it.
    But you are correct that, in XML, you can safely put a literal ' inside
    an attribute value if the attribute itself is wrapped in double quotes.
    So sParam="'" is simpler and clearer than is sParam="&apos;"

    This is a rewritten block that takes advantage of that syntax:
    <!-- U+2018 LEFT SINGLE QUOTE ? "'" -->
    <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="'" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    Thanks for the advice, which I had taken the easy way out (syntactically)
    in the past, but your suggestion is much easier for others to read.

    I changed these six blocks (U+2018, U+2019, U+200C, U+200D, U+2060,
    and BACKTICK) to use a plain ' instead of &apos;.

    5. "&#x00A0;" is a hard space, not a quote.
    This hard space (aka a non-breaking space) is correct but I can see how
    it might have been mixed in with the quotes.

    6. "&#x2018;" and "&#x2019;" are twice in there.
    Later in the file, I also had zero-width joiner/non-joiner and
    word joiner sections where the replacement was also '.
    That makes it look like the single quote replacement appears multiple times.
    The Unicode single quotes (U+2018 and U+2019) were not repeated, AFAICT.
    Yes there are several other blocks where the replacement was also '
    (for zero-width joiner, non-joiner, word joiner, backtick) but those aren't
    duplicates of U+2018 or U+2019, but they look similar since the replacement
    is the same character.

    7. "&#x2a;" is a standard ASCII char ("*"). Why not use it instead?
    I'm replacing the Unicode bullet with an asterisk (*).
    But you're saying, I think, that * is already a plain ASCII character
    so we don't need to encode it.
    In the macro, I have it set as sParam="*", which will use the asterisk.
    I agree with you that encoding ASCII characters as entities is unnecessary

    Here is the new shortcuts.xml, version 1p2, with those specific fixes.

    <?xml version="1.0" encoding="UTF-8" ?>
    <!-- Notepad++ shortcuts.xml version 1p2 20251211 -->
    <!-- Use model: ctrl+A (select all), ctrl=B (convert) -->
    <!-- 1700 start search -->
    <!-- 1601 set search string (funky character) -->
    <!-- 1625 clear replace buffer -->
    <!-- 1602 set replacement string (ASCII equivalent) -->
    <!-- 1702 run replace all -->
    <!-- 1701 end -->

    <NotepadPlus>
    <InternalCommands>
    <Shortcut id="43009" Ctrl="no" Alt="no" Shift="no" Key="0" />
    </InternalCommands>

    <Macros>
    <Macro name="ASCII" Ctrl="yes" Alt="no" Shift="no" Key="66">

    <!-- U+2010 HYPHEN ? "-" -->
    <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="" />

    <!-- U+2011 NON-BREAKING 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="" />

    <!-- U+2012 FIGURE DASH ? "-" -->
    <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="" />

    <!-- U+2013 EN DASH ? "-" -->
    <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="" />

    <!-- U+2014 EM DASH ? "-" -->
    <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="" />

    <!-- U+2212 MINUS SIGN ? "-" -->
    <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="" />

    <!-- U+2018 LEFT SINGLE QUOTE ? "'" -->
    <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="'" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- U+2019 RIGHT SINGLE QUOTE ? "'" -->
    <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="'" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- U+201C LEFT 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="" />

    <!-- U+201D RIGHT 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="" />

    <!-- U+2026 HORIZONTAL ELLIPSIS ? "..." -->
    <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="" />

    <!-- U+2022 BULLET ? "*" -->
    <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="*" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- U+200B ZERO WIDTH SPACE ? "" -->
    <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="" />

    <!-- U+200C ZERO WIDTH NON-JOINER ? "'" -->
    <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="" />

    <!-- U+200D ZERO WIDTH JOINER ? "'" -->
    <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="&apos;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- U+2060 WORD JOINER ? "'" -->
    <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="" />

    <!-- U+FEFF BOM ? "" -->
    <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="" />

    <!-- U+00A0 NO-BREAK SPACE (aka a hard 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="" />

    <!-- U+2007 FIGURE 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="" />

    <!-- U+202F NARROW NO-BREAK 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="" />

    <!-- U+2009 THIN 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="" />

    <!-- U+00B0 DEGREE SIGN ? "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="" />

    <!-- U+00A9 COPYRIGHT SIGN ? "(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="" />

    <!-- U+2122 TRADE MARK SIGN ? "(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="" />

    <!-- U+00AE REGISTERED SIGN ? "(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="" />

    <!-- U+2192 RIGHT ARROW ? "->" -->
    <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="" />

    <!-- BACKTICK ? "'" -->
    <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="" />

    <!-- Literal &zwnj; ? "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&zwnj;" />
    <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="" />

    <!-- Literal &amp;#151; ? "-" -->
    <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="" />


    <!-- U+011F LATIN SMALL LETTER G WITH BREVE ? "g" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x011F;" />
    <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="" />

    <!-- U+0161 LATIN SMALL LETTER S WITH CARON ? "s" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0161;" />
    <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="" />

    <!-- U+011B LATIN SMALL LETTER E WITH CARON ? "e" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x011B;" />
    <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="" />

    <!-- U+00E1 LATIN SMALL LETTER A WITH ACUTE ? "a" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x00E1;" />
    <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="" />

    <!-- U+0001 SOH ? "" -->
    <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="" />

    </Macro>
    </Macros>

    <UserDefinedCommands>
    <Command name="Get PHP help" Ctrl="no" Alt="yes" Shift="no" Key="112">https://www.php.net/$(CURRENT_WORD)</Command>
    <Command name="Wikipedia Search" Ctrl="no" Alt="yes" Shift="no" Key="114">https://en.wikipedia.org/wiki/Special:Search?search=$(CURRENT_WORD)</Command>
    <Command name="Open file in another instance" Ctrl="no" Alt="yes" Shift="no" Key="117">$(NPP_FULL_FILE_PATH) $(CURRENT_WORD) -nosession -multiInst</Command>
    </UserDefinedCommands>

    <PluginCommands />
    <ScintillaKeys />
    </NotepadPlus>
    --
    I invest energy in responding to Usenet posts because I care about people getting full & complete information so we move tribal knowledge forward.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From R.Wieser@address@is.invalid to alt.comp.os.windows-10,alt.comp.os.windows-11,alt.comp.microsoft.windows on Fri Dec 12 09:36:00 2025
    From Newsgroup: alt.comp.os.windows-11

    Arlen,

    So I agree with you that the essential trio was posted before I
    was positive it worked in all cases - which it didn't - so I replaced
    it.

    Next time its a good idea to either leave such an "the essential trio" conclusion out until you make sure, or include an "has yet to be tested" remark. Now you have presented it as an "this is how it works" thing,
    which will only confuse the people who try to use it. :-|

    Also, replacing something with itself doesn't really do much. :-)

    I'm not sure what you mean by that since the replacement is to change
    Unicode characters (for the most part) into 7-bit ASCII characters.

    So, in the sense that a curly quote is changed to a regular quote, you
    could argue it's replacing itself, but in reality it's a different
    character.

    Nope, that isn't what I'm talking about : I see at least one replacement
    where the 1602 is the same as the 1601. Not really usefull.

    If you're on the Android newsgroup, you'll see more clearly why it
    matters.
    We've had a discussion about charset Usenet headers in recent days.

    I see that you are replacing slim double-quotes with single-quotes, but
    thats a matter of taste. No matter what you do, that choice can work for
    you as easily as against you (ask yourself how I know.. :-) ).

    Seeing the "action" lines having four different indentations looks ugly.
    Same for wrapping replace-blocks (those 6 lines you spoke of) with empty
    lines. Either do it everywhere, or do it nowhere.

    Good point. That's my actual code so I didn't clean it up for
    presentation.

    Yeah, I noticed. Next time do (clean up) though. You're posting a *tutorial*, which should be easy to read, and not include visual hurdles
    like that.

    There's no "arrow" or "degree" symbol on the keyboard.

    Feel free to quote where I said so or even just suggested as such.

    Besides that, for the degree symbol open notepad, press-and-hold the ALT
    key, type 0176 on the numeric keypad and than release the ALT key (°). For the arrow you might try 175 (no leading zero) (»).

    Warning : What the displayed char actually looks like depends on the active code-page.

    I'll take them each on their own merits in a moment, as I appreciate the help,

    Good. Everything that makes a tutorial concise and therefore easier to read (no "why is it different here?" distractions) is a win for the ones your aim
    it at - and by association yourself.

    not only for me, but for everyone as we all can use this sanitizer.

    :-) Most people do not use npp (me among them), so its of zero use to them. Other people will have zero need to flatten UTF-8 (html ?) documents into ASCII, so its of zero use to them either. Others will have theit own programs/scripts to do such flattening (me among them), so its of zero use
    to them either. That leaves a rather small audience, not much of an "all"
    at all, but more like a niche ...

    Regards,
    Rudy Wieser




    --- Synchronet 3.21a-Linux NewsLink 1.2