嘿,所以我对此失去了理智,我有一些用 c 编写的程序,它直接从终端获取一些字符串作为输入,然后打印字符串中输入的每个字节的 ascii 值,我正在尝试输入扩展的 ascii 值(值大于 127)但我没有这样做。具体来说,我需要输入 ascii 值137作为字符串的输入 -> 因此输入具有该值的字符我几乎尝试了所有方法:
- 撰写键并输入:
e
+"
- Unicode 值
ctrl
+shift
+u
后跟 ascii 代码的十六进制值 - 将其输入为 unicode,因此需要两个字节而不是值 137 的一个字节 ctrl
+d
- 不支持扩展 ascii 值
无论如何,如果有人知道如何解决这个问题,这对我会有帮助
答案1
你可以使用luit
,这将让您运行您的 cp850 应用程序(无论语言环境你可以在 UTF-8 终端中找到它,然后让其luit
与 UTF-8 进行相互转换。
就其价值而言,截屏带 luit 的 cp850:
屏幕截图是由一组脚本设置的,这些脚本显示每个区域设置编码的测试屏幕。并非所有编码都配置了相应的区域设置信息。 761语言环境在我的 Debian 7 系统上列出的locale -a
仅对应 32 种编码:
ANSI_X3.4-1968 EUC-TW ISO-8859-14 ISO-8859-9
ARMSCII-8 GB18030 ISO-8859-15 KOI8-R
BIG5 GB2312 ISO-8859-2 KOI8-T
BIG5-HKSCS GBK ISO-8859-3 KOI8-U
CP1251 GEORGIAN-PS ISO-8859-5 RK1048
CP1255 ISO-8859-1 ISO-8859-6 TCVN5712-1
EUC-JP ISO-8859-10 ISO-8859-7 TIS-620
EUC-KR ISO-8859-13 ISO-8859-8 UTF-8
如果您有 luit 的最新版本(例如 2013 年的 2.0),并且安装了语言环境信息,则运行它很简单:
luit -encoding cp850
它运行一个 shell,其中应用程序使用代码页 850,但是您的选择/粘贴(和键盘)会被转换为外壳中的区域设置编码(假设为 UTF-8,因为它不能仅与 POSIX 一起使用)语言环境)。
这-v
(详细)选项显示了一些细节:
$ luit -encoding cp850 -v -v
getCharsetByName(ASCII)
cachedCharset 'ASCII'
getCharsetByName(<null>)
using unknown 94-charset
getCharsetByName(CP 850)
cachedCharset 'CP 850'
getCharsetByName(<null>)
using unknown 94-charset
Input: G0 is ASCII, G1 is Unknown (94), G2 is CP 850, G3 is Unknown (94).
GL is G0, GR is G2.
Output: G0 is ASCII, G1 is Unknown (94), G2 is CP 850, G3 is Unknown (94).
GL is G0, GR is G2.
使用旧的 luit 效果不太好,因为它依赖于不完整的区域设置信息。 luit 1.1.1 的作用如下:
$ luit -encoding cp850 -v -v
Warning: couldn't find charset data for locale cp850; using ISO 8859-1.
G0 is ASCII, G1 is Unknown (94), G2 is ISO 8859-1, G3 is Unknown (94).
GL is G0, GR is G2.
如果您碰巧正在运行 OpenSuSE,则会提供一个包。在另一个极端(例如,Ubuntu),配置语言环境很麻烦,但从luit
源代码编译相对简单。
答案2
字节不是字符,字符也不是字节。字符和字节之间的对应关系取决于区域设置。在 UTF-8 语言环境下,字符‰
将由两个字节表示\xC2\x89
(十进制的 194 和 137);具有该值(十进制 137)的裸字节\x89
将是无效的。如何输入键盘上没有出现的字符取决于终端和桌面环境。
如果您想要的只是将任意字节发送到程序,您可以使用管道,例如:
$ echo -ne '\x89' | hexdump -C
00000000 89 |.|
00000001
答案3
ASCII码是7位字符编码。它在 0-127 范围内的整数值和一堆字符(并非所有字符都可打印)之间建立对应关系。该范围不包括 137:不存在“ascii 值 137”之类的东西。
看起来你想输入数值为137的字节,程序以十六进制打印该数值。这与 ASCII 无关,但与终端中使用的编码有关。要输入字节137,您需要输入由该字节编码的字符。现代系统使用UTF-8,其中大多数字符由多个字节编码。没有任何字符的 UTF-8 编码是字节序列 {137},甚至没有任何字符的编码以此字节值开头(所有多字节编码都以大于 192 的值开头)。然而,有些字符的编码是双字节序列,其中第二个字节是 137,例如 É = U+00C9,在 UTF-8 中编码为 {195, 137}。
如果您希望能够通过键入来发送任意字节值,则需要使用单字节编码。选择一个不包含不可打印字符的字符(例如,128–159 范围在 latin-1 编码中是不可打印的),例如 cp850。看托马斯·迪基的回答了解如何使用 luit 来实现这一点。
或者,您可以通过让程序从包含它们的文件中读取它们,或者通过从生成它们的程序中通过管道传输它们来输入任意字节值。例如,在 bash 中,您可以编写
printf \\211 | ./myprogram # works in any shell
printf $'\x89' | ./myprogram
./myprogram <<<$'\x89'