Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
% This file:
%   http://angg.twu.net/LATEX/mynewunicodechar.sty.html
%   http://angg.twu.net/LATEX/mynewunicodechar.sty
%           (find-angg "LATEX/mynewunicodechar.sty")
% Author: Eduardo Ochs <eduardoochs@gmail.com>
%
% Based on: (find-es "tex" "newunicodechar")
% (find-fline "/usr/local/texlive/2019/texmf-dist/tex/latex/newunicodechar/newunicodechar.sty")
%
% This is a modified version of Enrico Gregorio's newunicodechar.sty
% that allows calling the main macro from anywhere - even outside the
% preamble.
%
% Usage: put this in the preamble:
%   \usepackage{mynewunicodechar}   % (find-LATEX "mynewunicodechar.sty")
%
\def\defunicodechar#1#2{\newunicodechar{#1}{#2}}
%
%\NeedsTeXFormat{LaTeX2e}[2018/04/01]
%\ProvidesPackage{mynewunicodechar}
%    [2018/04/08 v1.2 Defining Unicode characters]
%\@ifundefined{eTeXversion}
%  {\PackageError{mynewunicodechar}{LaTeX engine too old, aborting}
%   {Please upgrade your TeX system}\@@end}{}
\DeclareOption{verbose}{\let\nuc@verbose=T}
\ProcessOptions\relax
\def\nuc@onebyteerr{\PackageError{mynewunicodechar}
  {ASCII character requested}
  {Only characters above U+007F may be defined; you asked
   for\MessageBreak a plain ASCII character and your definition
   has been ignored.}}
\def\nuc@emptyargerr{\PackageError{mynewunicodechar}
  {Empty argument}
  {You shouldn't write \protect\newunicodechar{}{...}}}
\def\nuc@invalidargerr{\PackageError{mynewunicodechar}
  {Invalid argument}
  {The first argument to \protect\newunicodechar\space is
   either\MessageBreak too long or an invalid sequence of bytes}}
\begingroup
\catcode`\^=7 \catcode30=12 \catcode`\!=12 % for safety
\edef\next{\@gobble^^^^0021}
\expandafter\endgroup
\ifx\next\@empty % Start of code for Unicode engines
\chardef\nuc@atcode=\catcode`\~
\catcode`\~=\active
\def\newunicodechar#1#2{%
  \if\relax\detokenize{#1}\relax
    \nuc@emptyargerr
  \else
    \if\relax\detokenize\expandafter{\@cdr#1\@nil}\relax
      \ifnum`#1>\string"7F
        \catcode`#1=\active
        \begingroup\lccode`\~=`#1
        \lowercase{\endgroup\protected\def~}{#2}%
      \else
        \nuc@onebyteerr
      \fi
    \else
      \nuc@invalidargerr
    \fi
  \fi}
\catcode`\~=\nuc@atcode
% \@onlypreamble\newunicodechar
\expandafter\endinput
\fi % End of code for Unicode engines
\def\nuc@stop{\PackageWarningNoLine{mynewunicodechar}
  {This package only works if the document\MessageBreak
   encoding is `utf8'}%
  \let\newunicodechar\@gobbletwo\endinput}
\edef\@tempa{\detokenize{utf8}}
\edef\@tempb{\detokenize\expandafter{\inputencodingname}}
\ifx\@tempb\@tempa\else
  \nuc@stop
\fi
\def\newunicodechar#1#2{%
  \@tempswafalse
  \edef\nuc@tempa{\detokenize{#1}}%
  \if\relax\nuc@tempa\relax
    \nuc@emptyargerr
  \else
    \edef\@tempb{\expandafter\@car\nuc@tempa\@nil}%
    \nuc@check
    \if@tempswa
      \@ifundefined{u8:\nuc@tempa}{}
        {\PackageWarning{mynewunicodechar}
          {Redefining Unicode character\ifdefined\nuc@verbose;
           it meant\MessageBreak
           ***\space\space\nuc@meaning\space\space***\MessageBreak
           before your redefinition\fi}}%
      \@namedef{u8:\nuc@tempa}{#2}%
    \fi
  \fi
}
\def\nuc@getlength#1{%
  \ifx#1\@nil
    \expandafter\relax
  \else
    +1\expandafter\nuc@getlength
  \fi}
\ifdefined\nuc@verbose
  \def\nuc@meaning{\expandafter\expandafter\expandafter
    \strip@prefix\expandafter\meaning\csname u8:\nuc@tempa\endcsname}
\fi
\def\nuc@check{%
  \ifcase\numexpr0\expandafter\nuc@getlength\nuc@tempa\@nil
    \or %0
    \nuc@onebyteerr\or %1
    \nuc@ch@ck{192}\or %2
    \nuc@ch@ck{224}\or %3
    \nuc@ch@ck{240}\else %4
    \nuc@invalidargerr
  \fi}
\def\nuc@ch@ck#1{%
  \expandafter\ifnum\expandafter`\@tempb<#1\relax
    \nuc@invalidargerr
  \else
    \@tempswatrue
  \fi
}
% \@onlypreamble\newunicodechar
\endinput