作業中のファイルで見つかった奇妙な文字を識別しようとしています。
$ cat file
�
$ od file
0000000 005353
0000002
$ od -c file
0000000 353 \n
0000002
$ od -x file
0000000 0aeb
0000002
ファイルはISO-8859エンコーディングを使用し、UTF-8に変換できません。
$ iconv -f ISO-8859 -t UTF-8 file
iconv: conversion from `ISO-8859' is not supported
Try `iconv --help' or `iconv --usage' for more information.
$ iconv -t UTF-8 file
iconv: illegal input sequence at position 0
$ file file
file: ISO-8859 text
od
私の主な質問はここで出力を解釈する方法です。使ってみようこのページ005353
それは異なる文字表現の間を翻訳することができますが、「16進コードポイント」が正しくないようで、卓
「0aeb
16進コードポイント」が૫
間違っているようです。
それでは、3つのオプション(355
、005353
または)0aeb
のいずれかを使用してどの文字を表すべきかを調べるにはどうすればよいですか?
はい、Unicodeツールを試してみましたが、有効なUTF文字ではないようです。
$ uniprops $(cat file)
U+FFFD ‹�› \N{REPLACEMENT CHARACTER}
\pS \p{So}
All Any Assigned Common Zyyy So S Gr_Base Grapheme_Base Graph X_POSIX_Graph
GrBase Other_Symbol Print X_POSIX_Print Symbol Specials Unicode
Unicode U + FFFD文字の説明を理解すると、これは実際の文字ではなく、破損した文字のプレースホルダーです。ファイルが実際にUTF-8でエンコードされていないため、これは意味があります。
ベストアンサー1
ファイルには、16進数のEBと0Aという2バイトが含まれています。ファイルは文字ごとに1バイトの文字セットを使用できます。ISO-8859-1; この文字セットでは、EB は ë です。
$ printf "\353\n" | iconv -f ISO-8859-1
ë
他の候補はδコードページ437, Ù inコードページ850...
od -x
この場合、エンディアンによって出力が混乱します。より良いオプションは、-t x1
シングルバイトを使用することです。
$ printf "\353\n" | od -t x1
0000000 eb 0a
0000002
od -x
od -t x2
一度に2バイトを読み取り、リトルエンディアンシステムからバイトを逆順に出力するようにマッピングされます。
このように有効なUTF-8ではない(またはUTF-8ファイルとして解釈するときに意味のない)ファイルを見つけた場合、そのエンコード(および文字セット)を自動的に決定するための明確な方法はありません。コンテキストが役に立ちます。過去数十年にわたって西部のPCで生成されたファイルは、ISO-8859-1、-15(ヨーロッパのバリエーション)、またはWindows-1252でエンコードされている可能性があります。それより古い場合はCPです。 -437とCP-850が可能な候補だ。東ヨーロッパ、ロシア、アジアのファイルは、私が理解できない他の文字セットを使用します。その後、EBCDIC...はiconv -l
すべての既知の文字セットを一覧表示し、iconv
そこでいくつかの試行錯誤を実行できます。
(かつてCP-437とATASCIIを大部分覚えました。その時がそうでした。)