我使用 Ubuntu Studio 20.04.2 LTS。
我想知道是否有一种方法可以使用像 LibreOffice 这样的今天的应用程序,旧的代码页字符集,比如旧的 Atari ST 字符集:
和旧的 437 字符集。
如何?
简而言之:如何向终端显示未以 UTF-8 编码的文件?
目前,我有一个以 ISO-8859-9 编码并包含以下 12 个字符的测试文件:
ğüşıöçĞÜŞİÖÇ
文件的十六进制内容如下:
\F0\FC\FE\FD\F6\E7\D0\DC\DE\DD\D6\C7
当我尝试将此文件显示到终端时,我得到:
������������
我想这是因为,我当前的语言环境是这样定义的:
$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=en_GB.UTF-8
LC_TIME=en_GB.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=en_GB.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=en_GB.UTF-8
LC_NAME=en_GB.UTF-8
LC_ADDRESS=en_GB.UTF-8
LC_TELEPHONE=en_GB.UTF-8
LC_MEASUREMENT=en_GB.UTF-8
LC_IDENTIFICATION=en_GB.UTF-8
LC_ALL=
但是,我在系统中安装了土耳其语语言环境:
$ locale -a
C
C.UTF-8
en_GB
en_GB.iso88591
en_GB.iso885915
en_GB.utf8
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
POSIX
tr_TR
tr_TR.iso88599
tr_TR.utf8
turkish
所以,我想用以下方式临时更改显示语言:
$ export LC_ALL=tr_TR.iso88599
$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="tr_TR.iso88599"
LC_NUMERIC="tr_TR.iso88599"
LC_TIME="tr_TR.iso88599"
LC_COLLATE="tr_TR.iso88599"
LC_MONETARY="tr_TR.iso88599"
LC_MESSAGES="tr_TR.iso88599"
LC_PAPER="tr_TR.iso88599"
LC_NAME="tr_TR.iso88599"
LC_ADDRESS="tr_TR.iso88599"
LC_TELEPHONE="tr_TR.iso88599"
LC_MEASUREMENT="tr_TR.iso88599"
LC_IDENTIFICATION="tr_TR.iso88599"
LC_ALL=tr_TR.iso88599
$ cat a.txt
������������
但是,我仍然得到问号。
我尝试在 Ubuntu 18.04.1 LTS 中设置自定义键盘布局,以便能够为科学目的编写阿拉伯语音译(请参阅:https ://en.wikipedia.org/wiki/Romanization_of_Arabic ;https ://en.wikipedia.org /wiki/DIN_31635)因此我需要能够输入特殊字符。
我或多或少地遵循了这些说明:
我做了什么:
当我说德语时,我使用 gedit 和 root 权限在 /usr/share/X11/xkb/symbols/ 中打开了“de”。
在这个文件中,我在最后插入了以下内容并保存(之前做了原件的备份):
// Deutsch mit orientalistischer Umschrift
partial alphanumeric_keys
xkb_symbols "german_orient" {
include "de(basic)"
name[Group1]="Deutsch (Orientalistische Umschrift)";
key <BKSL> { [numbersign, apostrophe, U+02BE, dead_breve ] };
key <AE12> { [dead_acute, dead_grave, U+02BF, dead_ogonek ] };
key <AC11> { [adiaeresis, Adiaeresis, U+0304, dead_caron ] };
key <AB10> { [minus, underscore, U+0331, emdash ] };
key <AC10> { [odiaeresis, Odiaeresis, U+0307, dead_belowdot ] };
key <AB09> { [period, colon, U+0323, division ] };
key <AB08> { [comma, semicolon, U+030C, multiply ] };
key <AC06> { [h, H, U+032E, NoSymbol ] };
};
与此处列出的每个键的德语标准键盘布局相比,第三个条目(= 与 AltGr 一起按下键)根据我的需要进行了更改。顺便说一句,我通过在互联网上查找特殊字符获得了 Unicode 代码。
然后我evdev.xml
以/usr/share/X11/xkb/rules/
同样的方式打开
在这个文件中,我搜索了德语(de)布局条目并在其末尾(意思是 before </layout>
)插入以下内容并保存文件:
<variant>
<configItem>
<name>german_orient</name>
<description>Deutsch (Orientalistische Umschrift)</description>
</configItem>
</variant>
然后我在终端中输入以下命令并按下回车键,sudo dpkg-reconfigure xkb-data
因为在许多关于该主题的教程中建议这样做
然后我重新启动了。
然后我在 Ubuntu Preferences 中添加了新的键盘布局“Deutsch (Orientalistische Umschrift)”(意思是:德语(东方音译)
结果并不如我所愿:
我不仅不能用我分配的键写特殊字符。我想我以某种方式“破坏”了“de”键盘布局,因为无论我激活标准德语布局还是通过 super+space 激活“Deutsch (Orientalistische Umschrift)”布局,系统似乎都回落到了默认的英文键盘布局。因此,即使激活了其中一种德语布局,我写的字母也是根据英语布局(例如字母“z”和“y”被切换)。
所以,最后,我使用我所做的两个文件的备份撤消了我的更改,现在一切都恢复正常了。
但是由于我需要能够出于专业目的快速编写阿拉伯语音译,并且至少据我所知,没有可供下载的用于此目的的键盘布局(因为该领域使用 Linux 的学者数量非常少) 我需要这里有人的帮助来告诉我要更改哪些内容才能使我的自定义键盘布局正常工作。
我仍然是 Linux 的菜鸟,如果我错过了一些明显的东西,我很抱歉。无论如何,提前感谢您的帮助!
我自己找到了一个解决方案,我会把它贴在这里,因为其他人可能会从中获利
我从https://github.com/simos/keyboardlayouteditor下载并安装了 KeyboardLayoutEditor
运行 KeyboardLayoutEditor 并加载合适的语言布局文件(在我的情况下为 de)
然后单击将加载 Gucharmap 的“开始字符映射”按钮(我必须先通过 Ubuntu 软件中心安装它才能工作)
现在选择要添加到某个键的字符(您也可以通过输入 Unicode-Codes 在 Gucharmap 中搜索符号)
并将其拖放到 KeyboardLayoutEditor 中合适键的 4 个位置之一(最终代码见下文)
插入所需的所有字符后,您可以保存文件
然后我sudo dpkg-reconfigure xkb-data
在控制台中使用了命令
最后我重新启动了
结果:现在一切都像魅力一样!:)
我不知道为什么这次使用 KeyboardLayoutEditor 会起作用。
我的第一个猜测是它起作用了,因为我没有尝试向键盘布局文件(de)添加新变体,而是编辑了现有变体,从而避免了编辑 de-file 和 evdev-xml 时可能出现的一些错误
我的第二个猜测是它起作用了,因为 KeyboardLayout 编辑器编写的 Unicode 代码与我第一次手动编辑 de-file 时不同。
(这是最终版本,应用程序所犯的错误已由我手动纠正)
////////////////////////////////////////////////////////////////////////////// ///
//
// Generated keyboard layout file with the Keyboard Layout Editor.
// For more about the software, see http://code.google.com /p/keyboardlayouteditor
//
xkb_symbols "basic"
{
name[Group1] = "German";
include "latin(type4)"
include "level3(ralt_switch)"
include "kpdl(comma)"
key <AB01> { [ y, Y, guillemotright, U203A ] }; // y Y » ›
key <AB02> { [ x, X, guillemotleft, U2039 ] }; // x X « ‹
key <AB04> { [ v, V, doublelowquotemark, singlelowquotemark ] }; // v V „ ‚
key <AB05> { [ b, B, leftdoublequotemark, leftsinglequotemark ] }; // b B “ ‘
key <AB06> { [ n, N, rightdoublequotemark, rightsinglequotemark ] }; // n N ” ’
key <AB08> { [ comma, semicolon, U030C, multiply ] }; // , ; Dˇ ×
key <AB09> { [ period, colon, U0323, division ] }; // . : D? ÷
key <AB10> { [ minus, underscore, U0331, emdash ] }; // - _ ̱ —
key <AC02> { [ s, S, U017F, U1E9E ] }; // s S ſ ẞ
key <AC06> { [ h, H, U032E ] }; // ̮
key <AC07> { [ j, J, dead_belowdot, dead_abovedot ] }; // j J D? D˙
key <AC10> { [ odiaeresis, Odiaeresis, U0307, dead_belowdot ] }; // ö Ö D˙ D?
key <AC11> { [ adiaeresis, Adiaeresis, U0304, dead_caron ] }; // ä Ä Dˉ Dˇ
key <AD03> { [ e, E, EuroSign, EuroSign ] }; // e E € €
key <AD06> { [ z, Z, leftarrow, yen ] }; // z Z ← ¥
key <AD11> { [ udiaeresis, Udiaeresis, dead_diaeresis, dead_abovering ] }; // ü D¨ D˚
key <AD12> { [ plus, asterisk, asciitilde, macron ] }; // + * ~ ¯
key <AE02> { [ KP_2, quotedbl, twosuperior, oneeighth ] }; // 2 " ² ⅛
key <AE03> { [ KP_3, section, threesuperior, sterling ] }; // 3 § ³ £
key <AE04> { [ KP_4, dollar, onequarter, currency ] }; // 4 $ ¼ ¤
key <AE11> { [ ssharp, question, backslash, questiondown ] }; // ß ? \ ¿
key <AE12> { [ dead_acute, dead_grave, U02BF, dead_ogonek ] }; // D´ D` ʿ D˛
key <BKSL> { [ numbersign, apostrophe, U02BE, dead_breve ] }; // # ' ʾ D˘
key <LSGT> { [ less, greater, bar, dead_belowmacron ] }; // < > | Dˍ
key <TLDE> { [ dead_circumflex, degree, U2032, U2033 ] }; // D^ ° ′ ″
};
在我的公司中,当进入其他系统时,我们使用expect
自动化任务。ssh
我们所有的旧系统都运行 ISO-8859-1 字符编码,而我们的桌面系统运行 UTF-8 编码。ssh
当从我们的一个桌面进入我们的遗留系统时,这当然会带来某些挑战。
这很容易解决,方法是在开始会话之前删除SendEnv
行并将 Gnome 终端字符编码设置为 ISO-8859-1。从命令提示符或脚本手动执行此操作时效果很好。但是,当从脚本内部执行此操作时,它会失败。看起来字符编码要么根本没有处理,要么从内部处理不正确,这会导致我们在输入特殊字符时出现错误的字符。/etc/ssh/ssh_config
ssh
bash
expect
expect
有效的裸骨bash
脚本:
#!/bin/bash
ssh user@server
产生错误的基本expect
脚本:
#!/usr/bin/expect --
spawn ssh user@server
interact
在执行这两个脚本之前,已经手动正确设置了 Gnome 终端字符编码。这两个脚本应该工作相同,通过ssh
进入服务器并让用户输入密码。但是bash
脚本正确处理字符编码,而expect
脚本会产生损坏的特殊字符。
我假设我遗漏了一些明显的东西,但我无法弄清楚我遗漏了什么。
编辑:我们已经尝试过luit
,但没有帮助。它只会导致不同的错位字符。
Ubuntu 预装了一个名为“Character Map”的应用程序。在终端中,它可以作为“charmap”启动。
该应用程序通常用于什么?它为 Ubuntu 认为必须默认包含在其发行版中的人们提供了什么功能?