由于某种原因,我的 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-modules
和gconv-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-modules
和gconv-modules.cache
文件以及在哪里查找它们。之后,您可以创建指向实际文件的符号链接。
在阅读更新 #1 后,我猜测GCONV_PATH
环境变量已正确设置为 root 帐户,但未正确设置为您的帐户。设置GCONV_PATH
应该是创建符号链接的替代方法(我还没有尝试过)。在这种情况下,符号链接的优势在于它适用于所有用户(如果您正确创建了符号链接)。