拡張ASCII値を入力してください。

拡張ASCII値を入力してください。

こんにちは、私はこれについて精神を失っています。端末から直接入力としていくつかの文字列を取得し、文字列に入力された各バイトのascii値を印刷するcで書かれたプログラムがあります。入力拡張子asciiを試してみてください。値(127より大きい値)を使用しましたが、そうしませんでした。特にASCII値を入力する必要があります。137文字列として入力 - >その値を持つ文字を入力して、ほぼすべてを試しました。

  • キーを作成して次のように入力します。e+"
  • Unicode値ctrl++の後にASCIIコードの16進値が続きます。これはUnicodeとして入力されるため、値shift137uには1バイトではなく2バイトが必要です。
  • ctrl+ d- 拡張ASCII値はサポートされていません。

とにかく、この問題を解決する方法を知っている人がいれば役に立ちます。

答え1

使用できるluit、これによりcp850アプリケーションを実行できます(ロケールUTF-8ターミナルでそれを見つけてluitUTF-8に変換したり、UTF-8で変換したりできます。

それだけの価値があるだけに、スクリーンショットLuitを含むcp850:

ここに画像の説明を入力してください。

スクリーンショットは、各ロケールエンコーディングのテスト画面を表示するスクリプトセットに設定されます。すべてのエンコーディングが対応するロケール情報で構成されるわけではありません。 761ロケール私のDebian 7システムにはlocale -a32のエンコーディングのみがリストされています。

  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(verbose) オプションはいくつかの詳細を表示します。

$ 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ロケールでは、文字は2バイト(10進数194および137)&#137;で表されます。この値(10進数137)を持つ生のバイトは無効です。キーボードに表示されない文字を入力する方法は、端末やデスクトップ環境によって異なります。\xC2\x89\x89

必要なものがプログラムにランダムなバイトを送ることであれば、パイプを使うことができます。たとえば、次のようになります。

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

答え3

ASCIIコード7ビット文字エンコーディング。 0から127の範囲の整数値を文字セットにマップします(すべて印刷できるわけではありません)。範囲には 137 は含まれません。 「ascii値137」のようなものはありません。

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

任意のバイト値を入力して送信するには、シングルバイトエンコーディングを使用する必要があります。 cp850など、印刷できない文字(128から159までの範囲はlatin-1エンコーディングでは印刷できません)を含まない文字を選択してください。バラよりトーマスディキの答えこれを達成するためにluitを使用する方法を学びます。

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

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

関連情報