これが16進数のどのASCII文字であるかを認識する方法は?

「悪い」文字を取り除きたいテキストファイルがあります。 vimで( ":set number"で)開くと:

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

The ex.: "<9a>" そして "<83>" そして "<9b>" is marked blue in vim そして these two lines looks like this outside 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$
$ 

Question: How do we find out that what is the HEX ASCII char for the mentioned "<9a>" そして "<83>" そして "<9b>"? Or "¹" or "¥"...

それをきれいにするためにファイルからそれをすべて削除するために16進コードが必要です。このコードの例では、HEX ASCIIの "x09"を削除して、 "Horizo​​ntal Tab"を削除しています。

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

4 答え

ASCII is a 7-bit character set. Characters with values above 128 are non-ASCII characters.

Unicode を使用している場合、文字は複数のバイトで表されることに注意してください(256バイトの異なるバイトしかありません)。値は100000を超えるUnicode文字)。 Unicodeの事実上の標準表現は UTF-8 です。文字ごとに可変バイト数を使用します; ASCII文字は1バイト、それ以外は2から4バイトで表されます。

Vim displays some characters with blue placeholders such as <9a> because these are bytes that are not part of a valid character representation in the character set specified by the current locale.

バイトで作業したい場合は、ロケール設定 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文字を削除することを決定した場合は、UTF-8エンコーディングのロケールで tr を使用します。

LC_CTYPE=en_US.utf8 tr -d '¥' toclean.txt >clean.txt
1
追加された

The codes hex:<9a> and hex:<83> are not ASCII codes (ASCII codes go only from <00> to <7F>). You also cannot "find out" what characters (from any larger character set than ASCII) are associated with those codes since that depends on the underlying character set ("code page") encoding. So you have to ask the one who created that data what character encoding he used. (Typical encodings that you often find are ISO 8859-1, ISO 8859-15, UTF-8, UCS-2. You can also inspect the code tables you find on the net what characters with those indices makes most sense in your data context.)

削除したいコードの値がわかれば(たとえば) tr コマンドをオプション -d (8進数の引数)を付けて使用できます。

1
追加された

テキストファイルから "non-ascii"文字を削除するために私が見つけられた最も簡単な解決策はこのスレッド

$ tr -cd '\000-\777' < dirtyfile > cleanfile

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

1
追加された
つまり、 \ 177 (decimal 127)です。 \ 777 は最大バイト数をはるかに超えています。
追加された 著者 alexis,

あなたは単に luit を使うことができます。その目的は、システムのエンコーディングに合うように端末のテキストをきれいし、Unicodeと端末を不適切に処理するアプリケーション間の透明なフィルタとして機能することです。

ほぼ間違いなくすでにインストールされています - xterm がホスト上でエンコードの問題を検出すると自動的にそれを呼び出すので、 X が標準で出荷されます。

その man ページには、 Emacs との対話のためのこの例が説明されています。

  • luit is also useful with applications that hardwire an encoding that is different from the one normally used on the system or want to use legacy escape sequences for multilingual output. In particular, versions of Emacs that do not speak UTF-8 well can use luit for multilingual output:

    $ luit -encoding 'ISO 8859-1' emacs -nw
    
  • And then, in 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 outfile
0
追加された