! 程序包 inputenc 错误:Unicode 字符 ​ (U+200B)?

! 程序包 inputenc 错误:Unicode 字符 ​ (U+200B)?
\begin{description}

 \item[Public : ] Dans les clouds ​​publics,
 \item[Privé : ] Dans les clouds ​​privés,

\end{description}

我不知道为什么我以前使用过这种语法,但还是会出现问题中提到的错误。

我该如何解决这个问题?

答案1

cloudspublics/之间有四个 U+200B 字符(零宽度空格)privés。一个简单的解决方法是删除带有 的空格p并重新输入。也许这些字符是由编辑器或某些复制/粘贴操作引入的。

答案2

这是 U+200B 和 LaTeX 的热门问题之一,因此我将在这里发布解决方案。

请看以下示例:

\tracinglostchars=2
\documentclass{article}
\pagestyle{empty}
\begin{document}f​l f‌l fl\end{document}

在 LuaLaTeX 中,它编译为:

拉丁现代字体示例

第一个 fl 没有连字符,因为我插入了 U+200B,一个零宽度空格。第二个没有连字符,因为我插入了 U+200C,一个零宽度非连接符。这些可能是你故意复制的原始来源:零宽度空格可能意味着潜在的换行符,例如在斜线之后,而零宽度非连接符会禁用连字符。例如,Elfin 中的 fi 或 Halfling 中的 fl(根据像我这样的学究的说法)不应该连字符,因为它们属于复合词的不同部分,但这在其他一些语言中更常见。

如果您尝试在 PDFLaTeX 中编译它,您将收到以下错误消息:

! Package inputenc Error: Unicode character ​ (U+200B)
(inputenc)                not set up for use with LaTeX.

有几种方法可以解决这个问题。

手动清理来源

这是本网站大多数人推荐的。您的编辑器可能有办法显示特殊字符,以便您可以删除它们。但说真的,这不是计算机的工作吗?

使用 Perl 清理源代码

以下单行 Perl 脚本将创建一个新的源文件,其中所有零宽度空格均被删除:

perl -CSD -pe "s/\N{U+200B}//gu" < U200B.tex > noU200B.tex

如果更容易记住,你也可以将其写成

perl -CSD -pe "s/\N{ZERO WIDTH SPACE}//gu" < U200B.tex > noU200B.tex

-CSD选项无条件选择 UTF-8,即使您没有将 UTF-8 作为默认语言环境。此-pe选项在输入文件上运行给定的 Perl 脚本并打印到输出文件。该s命令执行替换,是\N{...}匹配零宽度空格的正则表达式,之间的空字段//表示用任何内容替换,和gu表示全局替换 unicode 字符串中的所有实例。然后,<>运算符选择输入和输出文件。

其中任何一个都会生成一个编译为以下内容的文件:

计算机现代字体示例

也可以自动删除给定子集之外的所有字符。脚本

perl -CSD -pe "s/[^\p{Word}\p{Punct}\p{Symbol}\p{Mark}\p{PerlSpace}]//gu"

仅允许以下字符:Unicode“单词”字符、标点符号、符号、重音符号和几种空格。它会删除大多数不可见的字符。更严格的版本是

perl -CSD -pe "s/[^\p{ASCII}]//gu"

这将清除所有字符,但 TeX 中最初允许的 ASCII 除外(包括双反引号)。

是的,我们可以用一些东西来代替零宽度空格,而不是什么都不用。脚本

perl -CSD -pe "s/\N{ZERO WIDTH SPACE}/{\\\\hskip 0pt}/gu; s/\N{ZERO WIDTH NON-JOINER}/{}/gu"

给定上述 MWE 作为输入,产生以下输出:

\tracinglostchars=2
\documentclass{article}
\pagestyle{empty}
\begin{document}f{\hskip 0pt}l f{}l fl\end{document}

教 LaTeX 理解零宽度空格

如果问题是 U+200B“未设置为用于 LaTeX”,但它相当于 TeX 命令 -\hskip 0pt或者\hspace{0pt}是阻止连字并导致潜在换行的零宽度空格 - 我们可以设置字符以使用该命令。

\tracinglostchars=2
\documentclass{article}
\usepackage{iftex}
\pagestyle{empty}

\ifTUTeX
  \usepackage{fontspec}
\else
  \usepackage[T1]{fontenc}
  \usepackage[utf8]{inputenc} % The default since 2018
  \DeclareUnicodeCharacter{200B}{{\hskip 0pt}}
\fi

\begin{document}f​l f‌l fl\end{document}

虽然该\DeclareUnicodeCharacter命令在中inputenc,但自 2018 年起,LaTeX 内核已默认加载它。因此,我们可以跳过声明它。

答案3

这些错误很难调试,因为如果您有一个很长的文档,然后向具有非unicode字符的bibtex条目添加引用,那么很难知道哪个引用是问题所在以及在哪里查找。

我的解决方案如下:

pdflatex在命令行中运行或执行其他任何命令。这将以“控制台”格式显示错误,如下所示:

Package inputenc Error: Unicode char ́ (U+301) not set up for use with LaTeX 

然后我可以复制/粘贴有问题的字符(在我的情况下,是一些西班牙语文本上的奇怪重音)并将其粘贴到以下命令中:

rgrep  ́ 

这使我能够在我的其中一个 .bib 文件中找到有问题的项目,然后我可以进行修复并继续我的生活。

相关内容