Unicode端末にバイナリデータを貼り付ける

Unicode端末にバイナリデータを貼り付ける

端末にバイナリデータを貼り付けることができる必要があります。何らかの理由でASCII範囲(0x80- )を0xff超えたすべてのバイトは、同じ3バイトシーケンスで貼り付けられます0xef 0xbf 0xbd

たとえば、

$ echo -en "\x80" | xclip
$ hd
<paste><EOF>
00000000  ef bf bd                                       |...|
00000004

UTF-8からISO 8859またはそれに似たものに変更すると、拡張範囲内のすべての文字が0x3f

任意のバイナリデータを端末に貼り付ける方法を知っている人はいますか?

編集する:これは非常に端末依存のようです。上記の例はKonsoleにあります。 xtermで目的の動作を取得しますが、Gnome Terminalは拡張範囲に文字を貼り付けることをまったく許可しません。 Konsole関連のソリューションは依然として高く評価されます。

答え1

ef bf bdUTF-8エンコーディングですか?文字を置き換える(�)、「値が不明な場合やUnicodeで表現できない着信文字を置き換えるために使用されます。」

あなたが説明するのは「拡張ASCII」ではなくバイナリデータです。その範囲の一部のバイトは0x80有効な0xffISO 8859ではないため、一部のプログラムではこれを未知の文字として扱うことが理解されています。

IBMコード・ページ850のように、255のすべての場所を使用する8ビット文字エンコーディングを試すことができます。

ただし、コピーしたプログラムがデータを解釈することもできます。ヌルバイトまたはターミナルエスケープシーケンスを貼り付けるとどうなりますか?全体的なアプローチは失敗する運命のように見えました。

答え2

端子は通常、バイナリ入力を許可するように設計されていません。制御文字がアプリケーション内で特別な意味を持つと予想し、制御文字自体をいくつか処理します(主にいくつかの信号で)。

term例外は、貼り付けたデータをアプリケーションに渡された生のテキストとして処理するEmacsモード(またはその変形の1つ)です。

アプリケーションにバイナリ入力を提供する一般的な方法は、ファイルまたはパイプから入力をリダイレクトすることです。データがXクリップボードにある場合は、xclip次のものを使用できますxsel

xclip -o | myapp
xsel -o | myapp

答え3

ここで予想される動作は次のとおりです。やあき端末。私はそうし、echo -en "\x5" | xclipスクリーンセッションで中央ボタンをクリックしてシリアルポートを開きました。期待どおりにデバイスが鳴った。

答え4

一部のコメントには適切な回答がありませんでした。以下はいくつかの重要なポイントです。

  • xtermは「任意のバイナリデータ」を許可しません。 (ロケールに応じて)UTF-8またはISO-8859-1を許可します。後者はICCMに従い、前者はXFree86の拡張です。どのエンコーディングでも、xtermはこれらの文字を解釈して選択項目にデータを提供できます。選択項目のUTF-8テキストをISO-8859-1エンコーディングに貼り付けると、最も一般的に使用される文字(線画を含む)に似ています。

  • 選択(および貼り付け)は、ソース(選択した場所)とターゲット(テキストを貼り付けた場所)によって異なります。どちらも選択/貼り付けたデータの形式に同意する必要があります。 xtermはさまざまな形式を提供して受け入れます(参照:button.cソースから)Konsoleとgnome-terminalはより少ないフォーマットを使用します。

  • たとえば、Konsole は X11 の選択を後で検討します。それを使うQClipboard::Selection方法。 QtのページコメントセクションX11ユーザーのための注意事項これに関して興味深い内容を読んだ。しかし、コードを読むそしてそれを参照してくださいただサポートするCOMPOUND_TEXT

    if (*format == 8 && *type == ATOM(COMPOUND_TEXT)) {
        // convert COMPOUND_TEXT to a multibyte string
        XTextProperty textprop;
        textprop.encoding = *type;
        textprop.format = *format;
        textprop.nitems = buffer_offset;
        textprop.value = (unsigned char *) buffer->data();
    
        char **list_ret = 0;
        int count;
        if (XmbTextPropertyToTextList(display, &textprop, &list_ret,
                     &count) == Success && count && list_ret) {
            offset = buffer_offset = strlen(list_ret[0]);
            buffer->resize(offset);
            memcpy(buffer->data(), list_ret[0], offset);
        }
        if (list_ret) XFreeStringList(list_ret);
    }
    
  • 同様に、GNOMEのVTEは以下を使用します。gtk_clipboard_get_for_display、一般的にQtの指示に従います。

  • IBM 850は8ビットエンコーディング(ISO-8859-1など)であり、UTF-8代替文字を表すことはできません。したがって、端末では?基本キャラクター)。

追加資料:

関連情報