多字节 StrLen?(汉字的 StrLen)

多字节 StrLen?(汉字的 StrLen)

\StrLen{#1}我目前正在我的 中使用\newcommand。这对于用拉丁字母书写的任何常见字符串都完美无缺。

例如,“Hello”的字符串长度为 5。问题出在中文字符上。“容容”的字符串长度为 8,从技术上讲是正确的,但我找不到返回 2 的 StrLen 的多字节替代方案。

注意:我正在使用 pdflatex。

问候,Jan

答案1

你可以计算 utf-8 的起始字节数,例如

在此处输入图片描述

\documentclass{article}
\usepackage[utf8]{inputenc}

\makeatletter
\def\zz#1{\zzz0#1\relax}
\def\zzz#1#2{%
\ifx\relax#2 \the\numexpr#1\relax
\else
\expandafter\zzz\expandafter{%
  \the\numexpr(#1+\ifnum\expandafter`\string#2<"80 1\else \ifnum\expandafter`\string#2>"BF 1 \else 0 \fi\fi
  \expandafter)\expandafter\relax\expandafter}%
\fi}
\begin{document}

\zz{容容}

\zz{abc}

\zz{¢Àïα}

\end{document}

答案2

只是为了多样性,这里有一个基于 LuaLaTeX 的解决方案。

在此处输入图片描述

\documentclass{article}
\newcommand\zz[1]{\directlua{tex.sprint(utf8.len("#1"))}}
\begin{document}
\zz{Hello}, \zz{容容}, \zz{¢Àïα}
\end{document} 

如果您的 TeX 发行版相当旧(比如,截至 2020 年底至少已有 4 年历史),只需替换utf8.len即可unicode.utf8.len运行代码。

相关内容