答案1
我假设,Unicode 字符以四位十六进制数字给出(或代理对的八位十六进制数字)。然后宏\uni
执行以下步骤:
- 首先将十六进制字符串扩展为八个十六进制数字,以获得编码中 Unicode 字符的完整十六进制表示
UTF-32BE
。 \pdfunescapehex
将十六进制数字转换为编码中的四个字节UTF-32BE
。- 包
stringenc
从 转换UTF-32BE
为UTF-8
。 \scantokens
用于将非活动字符(类别代码 12/其他)的字符串转换为utf8
包编码所需的活动字符inputenc
。- 由于定义很脆弱,因此通过 使宏变得健壮
\DeclareRobustCommand
。 - 此外,还添加了支持
hyperref
,以便\uni
可以在书签中使用定义的宏。
完整示例:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{textcomp}
\usepackage[utf8]{inputenc}
\usepackage{stringenc}
\newcommand*{\uni}{}
\DeclareRobustCommand*{\uni}[1]{%
\begingroup
\StringEncodingConvert\x{%
\pdfunescapehex{%
00%
\ifnum"#1<"100000 0\fi
\ifnum"#1<"10000 0\fi
\ifnum"#1<"1000 0\fi
\ifnum"#1<"100 0\fi
\ifnum"#1<"10 0\fi
#1%
}%
}{utf32be}{utf8}%
\everyeof{\noexpand}%
\endlinechar=-1 %
\edef\x{%
\endgroup
\scantokens\expandafter{%
\expandafter\unexpanded\expandafter{\x}%
}%
}\x
}
% hyperref support
\usepackage[pdfencoding=auto]{hyperref}
\pdfstringdefDisableCommands{%
\def\uni#1{\unichar{"#1}}%
}
\begin{document}
\section{Musical note \uni{266A} in title}
Symbols: \uni{266A}, \uni{B1}, \uni{20AC}, \uni{DF}.
\end{document}