iconv 缺少编码

iconv 缺少编码

由于某种原因,我的 iconv 缺少我在 R 中需要的“latin1”编码类型。事实上,使用该iconv -l命令,我发现缺少 latin1 编码类型,如下所示

========================================

(第一台机器)

  10646-1:1993, 10646-1:1993/UCS4, ANSI_X3.4-1968, ANSI_X3.4-1986, ANSI_X3.4,
  ASCII, CP367, CSASCII, CSUCS4, IBM367, ISO-10646, ISO-10646/UCS2,
  ISO-10646/UCS4, ISO-10646/UTF-8, ISO-10646/UTF8, ISO-IR-6, ISO-IR-193,
  ISO646-US, ISO_646.IRV:1991, OSF00010020, OSF00010100, OSF00010101,
  OSF00010102, OSF00010104, OSF00010105, OSF00010106, OSF05010001, UCS-2,
  UCS-2BE, UCS-2LE, UCS-4, UCS-4BE, UCS-4LE, UCS2, UCS4, UNICODEBIG,
  UNICODELITTLE, US-ASCII, US, UTF-8, UTF8, WCHAR_T

=========================================

(第二台机器)

$ iconv -l | grep LATIN

CSISO19LATINGREEK//
CSISO27LATINGREEK1//
CSISOLATIN1//
CSISOLATIN2//
CSISOLATIN3//
CSISOLATIN4//
CSISOLATIN5//
CSISOLATIN6//
CSISOLATINARABIC//
CSISOLATINCYRILLIC//
CSISOLATINGREEK//
CSISOLATINHEBREW//
CSPC862LATINHEBREW//
LATIN-9//
LATIN-GREEK-1//
LATIN-GREEK//
LATIN1//
LATIN2//
LATIN3//
LATIN4//
LATIN5//
LATIN6//
LATIN7//
LATIN8//
LATIN9//
LATIN10//
LATINGREEK//
LATINGREEK1//
OS2LATIN1//

=========================================

但是 latin1 编码类型在具有相同操作系统的第二台机器上可用。(我iconv在两台机器上使用了完全相同的程序副本,因此这不是iconv问题)有人能告诉我如何在第一个系统中安装“latin1”编码类型以供使用吗iconv

=========================================

更新 #1

上面的机器 2 的测试结果是在我自己的帐户上完成的。如果我使用 root 帐户,我可以获得 latin1 字体。但是使用其他非 root 帐户也无法使用 latin1 字体。所以我猜系统没有问题,但每个用户帐户的配置方式存在问题?

答案1

使用 GLIBC 提供的 iconv 例如:

$ iconv --version
iconv (Ubuntu GLIBC 2.31-0ubuntu9.2) 2.31
Copyright © 2020 Free Software Foundation, Inc.
Ce logiciel est libre; voir les sources pour les conditions de
reproduction. AUCUNE garantie n'est donnée; tant pour des raisons
COMMERCIALES que pour RÉPONDRE À UN BESOIN PARTICULIER.
Écrit par Ulrich Drepper.

如果使用 iconv 作为 C/C++ 库,则不能精确使用 iconv 库,例如:

$ gcc -o exec code.c -liconv   #NOOOOOOOO

不稳定地这样做:

代码.c:

#include <stdio.h>
#include <iconv.h>
 
int main(int argc, char *argv[])
{
    (...)
    iconv_t conv = iconv_open("UTF-8","IBM500");
    iconv(conv, &pIn, &srclen, &pOut, &dstlen);
    iconv_close(conv);
    (...)
}

使用标准 glibc 编译代码:

$ gcc -o exec code.c

答案2

有点晚了,但看起来iconv无法找到转换器插件,这可能是由于没有找到gconv-modulesgconv-modules.cache

插件通常位于/usr/lib/x86_64-linux-gnu/gconv/AMD64 机器或类似/usr/lib/arm-linux-gnueabihf/gconv/ARM 机器上。这也是您可以找到gconv-modules和 的地方gconv-modules.cache

运行strace iconv -l应该会告诉您是否无法打开gconv-modulesgconv-modules.cache文件以及在哪里查找它们。之后,您可以创建指向实际文件的符号链接。

在阅读更新 #1 后,我猜测GCONV_PATH环境变量已正确设置为 root 帐户,但未正确设置为您的帐户。设置GCONV_PATH应该是创建符号链接的替代方法(我还没有尝试过)。在这种情况下,符号链接的优势在于它适用于所有用户(如果您正确创建了符号链接)。

相关内容