【问题标题】:Where are characters stored for display?字符存储在哪里以供显示?
【发布时间】:2017-02-23 21:44:25
【问题描述】:

打开一个终端。输入一些东西。一些字符出现在屏幕上。您看到的字符存储在磁盘的什么位置?它们以什么格式存储?

我梦想着一个愚蠢的小项目来教我的学生有关 unicode 和文本编码的知识。我想表明 \x24 并不意味着“$” - 它只是以这种方式打印,因为当您告诉计算机它们是编码为 utf8 时,计算机被告知表示这些字节的方式。

我不想在我的应用程序中使用地图或任何东西来处理这个问题,我想知道在我的 ubuntu 安装的深处我可以找到一个文件来指示 os/application/whatever 呈现字符 00100100作为$。

有人知道吗?我想知道解决方案是否简单或真的很麻烦。

【问题讨论】:

  • 搜索“Ubuntu 字体”。
  • 谢谢 我怀疑是字体,但不确定。我想作为一个实验,我将进入虚拟机上的所有字体目录并将它们全部删除,然后看看会发生什么混乱。很快就会回来报告。
  • 出发前:做好备份!
  • 另外,这里有一个非常有趣的帖子unix.stackexchange.com/questions/14027/…
  • 如果你教 CS,你可能会对新的 CS Teacher's Stack Exchange 感兴趣(尽管它仍处于私人测试阶段,所以最容易进入 through here

标签: linux ubuntu unicode terminal ascii


【解决方案1】:

感谢 Kirill,我发现它们在我的字体目录中。我去了以下地点

/usr/share/fonts /usr/local/share/fonts

字体似乎是某种二进制格式。 vi font.ttf 只是显示一堆垃圾。接下来我

rm -rf *

现在我所有的程序都生我的气并抛出这些错误消息,但我不明白他们在抱怨什么。

我是在虚拟盒子里做的,没有人晕倒。

【讨论】:

    【解决方案2】:

    不同的终端使用不同的字体渲染机制,从不同的地方获取不同格式的字体数据。

    VGA 控制台默认使用存储在 VGA BIOS 中的字体。可以从/usr/share/consolefonts/usr/lib/kbd/consolefonts 或类似setfont 加载新字体并将其写入VRAM。在磁盘上,它们存储在一个古老的 DOS .psf format 中。字符不是由操作系统呈现,而是由 VGA 适配器本身呈现。

    FB 控制台使用编译到内核中的位图字体。它们在内核树中的 C 文件中声明,例如 lib/fonts/font_8x16.c 像这样(稍微眯眼看看 1 形成了一个美元符号):

    /* 36 0x24 '$' */
    0x18, /* 00011000 */
    0x18, /* 00011000 */
    0x7c, /* 01111100 */
    0xc6, /* 11000110 */
    0xc2, /* 11000010 */
    0xc0, /* 11000000 */
    0x7c, /* 01111100 */
    0x06, /* 00000110 */
    0x06, /* 00000110 */
    0x86, /* 10000110 */
    0xc6, /* 11000110 */
    0x7c, /* 01111100 */
    0x18, /* 00011000 */
    0x18, /* 00011000 */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    

    字符由drivers/video/console/newport_con.c putc 中的FBcon 驱动程序呈现。

    xterm 这样的旧X11 终端将使用X11 核心字体,存储为PCF bitmap fonts 或(后来)PostScript fonts,这些天通常在/usr/share/fonts/X11 中找到。字符由 X11 服务器渲染。

    gnome-terminalkonsole 等现代 X11 终端将使用 XFT 字体,以 TrueType 或 OpenType 格式存储在 /usr/share/fonts。它们由 X11 客户端通过 FreeType 库呈现。


    对于低级 OS 类,更改 VGA 字体可能是一个好技巧。对于高级 IT 课程,您可以编辑 TrueType 字体以显示不同的内容并在文本处理器中切换字体。

    PS:WingDings 已经证明了这一点,例如将J画成笑脸:

    【讨论】:

    • 很好的答案。回复:WingDings,我不确定那是一样的。即使wingdings被接受为一种以古怪方式表示unicode的有效字体(这是荒谬的,对吗??J!=笑脸),如果您想在使用标准字体的文档中谈论wingdings,您需要备用显示机翼的代码点。这个网上有答案,我会找到的。
    • WingDings 早于 Unicode 并且奇怪地呈现 ASCII 范围。它与使用标准化代码点作为符号的 Unicode 表情符号不同。
    • 酷!所以,现在一些wingdings有unicode编码[你可能已经知道了]。 alanwood.net/demos/wingdings.html。我认为,在 word 2016 中,wingding 字体是 unicode。我从单词中复制了一个“a”并在 python 中执行了 ord("a"),得到了预期的 (base10) 97。但是,当我复制笑脸时,ord(smiley) = 61514。
    • Word 2016 在您当前的字体中插入笑脸作为 Unicode 微笑。 Word 1995 将插入一个大写字母 J 并将该字母的字体设置为 Wingdings(有时使用 funny results)。 Microsoft 也意识到了这个问题:Office 将尝试将复制/粘贴自动翻译成 Unicode,以避免出现杂散的“J”,因此复制粘贴的数据可能会产生误导。在记事本或其他非常愚蠢的非 WordProcessor 编辑器中尝试以避免这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    相关资源
    最近更新 更多