AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1531413
Accepted
einpoklum
einpoklum
Asked: 2020-03-10 04:44:59 +0800 CST2020-03-10 04:44:59 +0800 CST 2020-03-10 04:44:59 +0800 CST

获取“警告:字符串到 FontSet 转换中缺少字符集”

  • 772

我正在使用 X 应用程序通过 SSH 连接到某台机器。当我运行一个 X 应用程序时,比如说,xclock为了简单起见,我会收到一条控制台消息:

Warning: Missing charsets in String to FontSet conversion

...但应用程序运行。我的语言环境是:

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

现在,我发现这个旧建议只是 set export LC_ALL=C。并且-有效,错误消息消失了。但是,我真的不想那样改变我的语言环境!

我可以做些什么来避免错误并保留我的语言环境吗?

附加信息:

  • X 服务器是 MobaXterm 在 Windows 上的集成 X 服务器。
  • 远程机器是 SLES GNU/Linux 11(由 SUSE)。
utf-8 locale
  • 1 1 个回答
  • 3965 Views

1 个回答

  • Voted
  1. Best Answer
    mr.spuratic
    2020-10-22T11:11:36+08:002020-10-22T11:11:36+08:00

    你是对的,你不想那样改变你的语言环境!我找到了类似的建议,并选择了兔子洞。

    您可以更改的单个语言环境变量是LC_CTYPE=C(这是字符分类设置,有关详细信息,请参阅POSIX第 7 节,语言环境)。

    我认为,这里的主要问题是旧的 X 程序在当代多字节/多语言环境系统中存在与字体相关的小问题。

    我自己的语言环境,在桌面 X Org(Mobaterm 在后台使用 X Org)是(通过en_IE.utf映射到文件)。在那个 XLC_LOCALE 文件中有字体集和字符集定义,并且其中一些(倾向于)触发警告(特别是对于我不使用的西里尔文和亚洲编码,并且没有很好的字体覆盖率) )。en_US.UTF-8/XLC_LOCALE/usr/share/X11/locale/locale.dir

    我从一些程序中得到了几个错误,例如xfig:

    Warning: Missing charsets in String to FontSet conversion
    Warning: Missing charsets in String to FontSet conversion
    Warning: Unable to load any usable fontset
    

    注释掉各种不需要的fsN条目csN将解决这个问题(每个索引 N 定义一个匹配的字体集/字符集对,保持这种配对,注意每对相隔约 200 行)。这可能会影响某些文本的呈现。或者,LC_CTYPE=C在开始之前设置xfig会删除所有警告。

    由于报告缺少字符集(即语言环境使用/要求的字符集,但在与请求的规范匹配的字体中未找到),因此从XtCvtStringToFontSet()(libXt)发出警告。XCreateFontSet()

    XCreateFontSet()返回丢失字符集的列表,但 libXt 不输出请求的详细信息或丢失的字符集以帮助您跟踪它。LD_PRELOAD(我使用和包装器.so作弊以XCreateFontSet()找到罪魁祸首,见下文。)

    那么真正的问题是字体规范(例如“ --helvetica-medium-r-normal--16- - - - - - - ”)检查文件中设置的所有编码,XLC_LOCALE如果有些不能被发现然后你会看到这些警告。如果根本找不到,您也会看到“警告:无法加载任何可用的字体集”。

    然后进行一些修复:

    1. 为错误程序设置LC_CTYPE=C(或其他“简单”编码,例如)en_US
    2. 从有效的 XLC_LOCALE 文件中删除不需要的字体集/字符集对(区域设置),这无需重新启动 X 或桌面即可生效
    3. 安装更多字体和编码(有点像打地鼠游戏)
    4. 设置更慷慨的应用程序字体规范(通过 xrdb 或命令行)
    5. 设置更慷慨的默认字体规范(通过 xrdb)

    您可能需要最后两个修复程序,因为如果任何默认字体在检查时与编码不匹配,即使后续字体就足够了,也会发出警告。

    最后一个问题是一些后备字体规范可能会继续引发问题。具体来说,硬编码的 Xt 默认为:

    -*-*-*-R-*-*-*-120-*-*-*-*,*
    

    可能无法完全触发相同的警告。一些快速测试表明,不包含系列(仅包括单个“*”)的字体规范可能不匹配任何内容,即使预期匹配,即:

    xlsfonts -fn "*-*-*-R-*-*-*-120-*-*-*-*"
    

    并且添加尾随“,*”作为完整的通配符可能会破坏原本可以工作的字体规范。在 X Org 1.18.3 上观察到。

    我在我的.Xdefaults:

    XtDefaultFontSet: -*-fixed-medium-r-normal--16-*-*-*-*-*-*-*,-*-fixed-*-*-*--16-*,-*-*-medium-*-*--16-*
    

    这对我来说似乎让大多数事情保持安静,不需要XLC_LOCALE改变。这个后备设法匹配我以某种方式增加的字体混杂中的每个请求的编码......


    这是我用来帮助跟踪请求的内容(因为它通常只在应用程序源中定义)和未找到的内容的非常简单的包装器(具有最少的错误检查)。在 x86_64 Slackware 上测试,其他发行版/系统可能需要微调。

    gcc -fPIC -shared -Wl,-soname,xfontset.so -ldl -o xfontset.so xfontset.c
    

    然后

    LD_PRELOAD=$PWD/xfontset.so xfig
    

    从编译它的目录运行它。

    #define _GNU_SOURCE
    #include <stdio.h>
    #include <dlfcn.h>
    #include <link.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdlib.h>
    
    #include <X11/Xlib.h>
    
    #define DEBUG 1
    #define dfprintf(fmt, ...) \
        do { if (DEBUG) fprintf(stderr, "[%14s#%04d:%8s()] " fmt, \
              __FILE__, __LINE__, __func__,##__VA_ARGS__); } while (0)
    
    // gcc -fPIC -shared -Wl,-soname,xfontset.so -ldl -o xfontset.so xfontset.c
    
    // see X11/Xlib.h
    typedef XFontSet XCreateFontSet_fp(
      Display *display,
      _Xconst char *base_font_name_list, 
      char ***missing_charset_list_return, 
      int *missing_charset_count_return, 
      char **def_string_return
    );
    
    static XCreateFontSet_fp *real_XCreateFontSet;
    
    void myinit(void) __attribute__((constructor));
    
    void myinit(void)
    {
        void *dl;
        if ((dl=dlopen(NULL,RTLD_NOW))) {
            dfprintf("found dl at %p ()\n", dl);
    
            real_XCreateFontSet=dlsym(RTLD_NEXT,"XCreateFontSet");
            if (!real_XCreateFontSet) dfprintf("error: %s\n",dlerror());
            dfprintf("found fn() at %p\n", (void *)real_XCreateFontSet);
        } else {
            dfprintf("dlopen() failed...\n");
        }
    }
    
    // https://www.debian.org/doc/manuals/intro-i18n/ch-examples.en.html
    // https://invisible-island.net/xterm/xtoolkit/intrinsics.html
    
    XFontSet XCreateFontSet(Display *display, _Xconst char *base_font_name_list, char ***missing_charset_list_return, int *missing_charset_count_return, char **def_string_return)
    {
         XFontSet rc;
         int fnum,ii;
         XFontStruct **xfonts;
         char **font_names;
    
         dfprintf("wrapped XCreateFontSet()\n");
         dfprintf(" base_font_name_list: <%s>\n",base_font_name_list);
    
         rc=real_XCreateFontSet(display, base_font_name_list, missing_charset_list_return,missing_charset_count_return, def_string_return);
    
        if (*missing_charset_count_return) {
            int ii=0;
            dfprintf(" #missing charsets: %i\n",*missing_charset_count_return);
    
            for (ii=0; ii<*missing_charset_count_return; ii++) {
                dfprintf(" %2i: <%s>\n",ii, (*missing_charset_list_return)[ii]);
            }
        }
        if (rc) {
            fnum=XFontsOfFontSet(rc,&xfonts,&font_names);
            for (ii=0; ii<fnum; ii++) {
                dfprintf(" XFontSet[%2i]=<%s>\n",ii,font_names[ii]);  
            }
        } else {
            dfprintf("no FontSet found...\n");
        }
        return rc;
    }
    
    • 3

相关问题

  • 使用记事本时,我的 HTML 中出现的这些未知符号是什么?

  • 流行的 FTP 客户端无法自动检测到 VSFTPD 提供 UTF-8 文件名

  • 使用 Microsoft Word 保存不带 BOM 的 UTF-8 文件

  • 是否可以使用文本创建二维码?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve