web-dev-qa-db-ja.com

拡張ASCII値の入力

ねえ、私はこれについて気が狂っています、私は端末から直接入力として文字列を取得し、文字列内に入力された各バイトのASCII値を出力するcで書かれたプログラムを持っています、私は拡張ASCII値を入力しようとしています(値は127より大きい)そして私はそうすることに失敗しています。具体的には、文字列の入力として137のASCII値を入力する必要があります->したがって、ほぼすべてを試したその値の文字を入力します。

  • キーを作成して次のように入力します:e + "
  • Unicode値ctrl + shift + uの後にASCIIコードの16進値-ユニコードとして入力するため、137の値で1バイトではなく2バイトを使用します
  • ctrl + d-拡張ASCII値をサポートしていません

とにかく、誰かがこれを解決する方法を知っているなら、それは私にとって役に立ちます

1
DrPrItay

luit を使用すると、UTFの(このために見つけることができるロケール)でcp850アプリケーションを実行できます。 -8ターミナル、およびluitにUTF-8との間の変換を実行させます。

それが価値があるものについては、luitを使用したcp850の スクリーンショット

enter image description here

スクリーンショットは、ロケールエンコーディングごとにテスト画面を表示する一連のスクリプトによって設定されました。すべてのエンコーディングに対応するロケール情報が構成されているわけではありません。 locale -aを使用してDebian7システムにリストされている761ロケールは、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

これは、アプリケーションがコードページ850を使用するシェルを実行しますが、選択/貼り付け(およびキーボード)は、外側のシェルのロケールエンコーディングとの間で変換されます(POSIXだけでは機能しないため、UTF-8と想定されます)。ロケール)。

-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の使用は、不完全なロケール情報に依存しているため、同様に機能しません。 luit1.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
Thomas Dickey

バイトは文字ではなく、文字はバイトではありません。文字とバイトの対応は、ロケールによって異なります。 UTF-8ロケールでは、文字&#137;は2バイト\xC2\x89(10進数で194と137)で表されます。値が\x89(10進数で137)のベアバイトは無効になります。キーボードに表示されない文字の入力方法は、端末やデスクトップの環境によって異なります。

プログラムに任意のバイトを送信するだけの場合は、次のようにパイプを使用できます。

$ echo -ne '\x89' | hexdump -C
00000000  89                                                |.|
00000001
1
AlexP

[〜#〜] ascii [〜#〜] は7ビットの文字エンコードです。 0〜127の範囲の整数値と、一連の文字(すべてが印刷可能というわけではありません)を対応させます。この範囲には137は含まれていません。「ASCII値137」などはありません。

数値が137のバイトを入力したいようで、プログラムはその数値を16進数で出力します。これはASCIIとは何の関係もありませんが、端末で使用されるエンコーディングとは関係があります。バイト137を入力するには、このバイトでエンコードされている文字を入力する必要があります。最近のシステムでは TF-8 を使用しており、ほとんどの文字は複数のバイトでエンコードされています。 UTF-8エンコーディングがバイトシーケンス{137}である文字はなく、エンコーディングがこのバイト値で始まる文字もありません(すべてのマルチバイトエンコーディングは192を超える値で始まります)。エンコードが2バイトシーケンスで2バイトが137の文字がありますが、É= U + 00C9のように、UTF-8で{195、137}としてエンコードされます。

入力して任意のバイト値を送信できるようにする場合は、ユニバイトエンコーディングを使用する必要があります。 cp850など、印刷できない文字がないものを選択します(たとえば、128〜159の範囲はlatin-1エンコーディングでは印刷できません)。そのためのluitの使用方法については、 Thomas Dickeyの回答 を参照してください。

または、任意のバイト値を入力するには、それらを含むファイルからプログラムを読み取るか、それらを生成するプログラムからそれらをパイプします。たとえば、bashでは次のように書くことができます

printf \\211 | ./myprogram            # works in any Shell
printf $'\x89' | ./myprogram
./myprogram <<<$'\x89'