これがどの16進ASCII文字であるかをどのように識別しますか?

これがどの16進ASCII文字であるかをどのように識別しますか?

テキストファイルがあり、「間違った」文字を整理したいと思います。 vimで開く場合(「:set number」を使用):

57000044 zo¥<9a>¥ge¥o¥graph¥i¥cal¥ly
39999999 pariá¹<83>Å<9b>a

たとえば、「<9a>」、「<83>」、「<9b>」はvimで青色で表示され、これら2行はvimの外側で次のようになります。

$ sed '57000044,57000044!d' toclean.txt
zo���ge�o�graph�i�cal�ly
$ sed '57000044,57000044!d' toclean.txt | cat -vte -
zoM-%M-^ZM-%geM-%oM-%graphM-%iM-%calM-%ly$
$ 

そして

$ sed '39999999,39999999!d' toclean.txt
pariṃśa
$ sed '39999999,39999999!d' toclean.txt | cat -vte -
pariM-aM-9M-^CM-EM-^[a$
$ 

質問:上記の「<9a>」、「<83>」、および「<9b>」の16進ASCII文字が何であるかをどうやって知ることができますか?または「1」または「¥」...

ファイルをすべて削除してよりきれいにするには、16進コードが必要です。たとえば、このコードは16進ASCII "x09"を削除するため、「水平タブ」になります。

sed -i 's/[\x09]//g' toclean.txt

16進数で「9A」または「A5」を試してみましたが、役に立ちませんでした。

$ sed '57000044,57000044!d' toclean.txt | sed 's/[\x9A]//g; s/[\xA5]//g'
zo���ge�o�graph�i�cal�ly
zo���ge�o�graph�i�cal�ly
$ 

答え1

hex:<9a>およびhex:<83>コードはASCIIコードではありません(ASCIIコードは<00>から<7F>までのみ可能です)。また、どの文字(ASCIIより大きい文字セットから)がこれらのコードに関連付けられているかを「見つける」ことはできません。これは、デフォルトの文字セット(「コードページ」)エンコーディングによって異なります。したがって、データを作成した人にどの文字エンコーディングを使用したかを尋ねる必要があります。 (しばしば見つけることができる一般的なエンコーディングは、ISO 8859-1、ISO 8859-15、UTF-8、UCS-2です。あります。)

削除したいコード値がわかったら(オプション)オプション(8進引数)trでコマンドを使用できます。-d

答え2

ASCIIコード7ビット文字セット。 128より大きい値を持つ文字は、ASCII以外の文字です。

使用する場合Unicode、文字は複数のバイトで表されます(256個の異なるバイト値しかありませんが、Unicode文字は100,000個以上です)。 Unicodeの事実上の標準表現は次のとおりです。UTF-8各文字は可変数のバイトを使用します。 ASCII文字はシングルバイトで表され、他の文字は2〜4バイトで表されます。

Vimは一部の文字を青いプレースホルダとして表示します。たとえば、<9a>このバイトは現在指定されている文字セットの有効な文字表現に属していないためです。ロケール

バイトを処理するには、ロケールをLC_CTYPEに設定しますC

LC_CTYPE=C vim toclean.txt

UTF-8を使用するには、Unicode端末でVimを実行してください。

以下を使用してファイルのバイトを表示できます。od(POSIX)またはhexdump(BSD、Linuxでは一般的です)。

od -t x1 toclean.txt
hexdump -C toclean.txt
hd toclean.txt

特定のバイト値を削除するには、次を使用できます。tr

LC_CTYPE=C tr -d '\x83\xa5' toclean.txt >clean.txt

一部のUTF-8文字を確実に削除するには、trUTF-8エンコーディングを含むロケールで次のように使用します。

LC_CTYPE=en_US.utf8 tr -d '¥' toclean.txt >clean.txt

答え3

テキストファイルから「非ASCII」文字を削除するために見つけることができる最も簡単な解決策は次のとおりです。このスレッド

$ tr -cd '\000-\777' <ダーティファイル>クリーンファイル

'\000-\777' は 8 進 ASCII セットを定義します。 「-c」は「non-ASCII」とも呼ばれる与えられたセットを補完し、「-d」は文字を削除します。

答え4

ただ使用できますluit。目的はきれい端末テキストはシステムのエンコーディングに合わせて調整され、Unicodeを正しく処理しないアプリケーションと端末間の透明度フィルタとして機能します。またはその逆の場合も同様です。

ほぼ確実に設置されています。ホストでエンコードの問題を検出すると、自動的に呼び出されるXため、標準として提供されます。xterm

このmanページでは、次の操作を行う例について説明しますEmacs

  • luitまた、システムで一般的に使用されるエンコーディングとは異なるエンコーディングが組み込まれている場合や、多言語出力にレガシーエスケープシーケンスを使用したいアプリケーションにも役立ちます。特に、EmacsUTF-8で正しく動作しないバージョンは、luit多言語出力に使用できます。

    $ luit -encoding 'ISO 8859-1' emacs -nw
    
  • その後Emacs

     M-x      set-terminal-coding-system      RET
     iso-2022-8bit-ss2 RET
    

ただし、直接端末アプリケーションに加えて、以下をサポートします。

-c     Function as a simple converter from standard
       input to standard output.

それでは、このように使用することもできます。

luit -c <infile >outfile

関連情報