输入扩展 ascii 值

输入扩展 ascii 值

嘿,所以我对此失去了理智,我有一些用 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 语言环境下,字符&#137;将由两个字节表示\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'

相关内容