OS Xでファイルエンコーディングを確認するにはどうすればよいですか?


170

TextMateの LaTeXファイルにUTF-8文字を入力しようとしています(デフォルトのエンコードはUTF-8と表示されています)が、LaTeXはそれらを理解していないようです。

実行cat my_file.texすると、ターミナルで文字が正しく表示されます。実行ls -alすると、今まで見たことのないものが表示されます。ファイルリストの「@」:

-rw-r--r--@  1 me      users      2021 Feb 11 18:05 my_file.tex

(そして、はい、私は\usepackage[utf8]{inputenc}LaTeXで使用しています。)

私は見つけましたがiconv、それはエンコーディングが何であるかを私に伝えることができないようです-それは私がそれを理解するまで変換されません。


私の経験では、file(1)コマンドは常にファイルのエンコーディングの推測に優れています。ファイルのcom.apple.TextEncoding拡張属性を使用するのに十分賢いかどうかはわかりません。
エドワードフォーク2016

回答:


33

これ@は、ファイルに関連付けられた拡張ファイル属性があることを意味します。getxattr()関数を使用してそれらを照会できます。

ファイルのエンコーディングを検出する明確な方法はありません。この答えを読んでください、それは理由を説明しています。

エンコーディングを推測するコマンドラインツールencaがあります。ぜひチェックしてみてください。


1
OSXがエンコードをメタデータとして保存していると想定していました。ファイルの内容は単なるビットの集まりであり、固有のエンコーディングがないことを理解しました。
ジェームズA.ローゼン

1
TextEditのような@ JamesA.Rosen OS Xアプリは、ファイルエンコーディングを属性(「com.apple.TextEncoding」という名前)として保存します。それによって示される属性に@は、ファイルエンコーディング属性が含まれている可能性が高いです。コマンドxattr -p com.apple.TextEncoding <filename>を使用して、エンコード属性が存在する場合はそれを調べることができます。
bames53 2014年

1
getxattrの使用方法を説明していただけますか?使用できません。
MeV 2015

1
これは、プログラムを作成する場合に使用する関数呼び出しです。コマンドラインから入力ls -l@ <filename>するだけで、ファイルに設定されている属性を確認できます。実際の属性を表示するには、次のように入力しますxattr -p com.apple.TextEncoding <filename>
Edward Falk

取得するにencaやるbrew install encaとは、言語を指定する必要がありますが、どれもそう、働かない:enca FILENAME -L __
シェーン

433

-Ifileコマンドで(これは大文字のiです)オプションを使用すると、ファイルのエンコードが表示されるようです。

file -I {filename}

58
-Iを使用する必要がありました
Casebash

7
この関数は、ASCIIとUTF-8の違いを識別できないようです(ほとんどのUS文字で同じであるようですが、すべてではなく、おそらくunicodeビットを検出するものです)
BadPirate

14
ASCIIとUTF8は、ファイル内のOxFF以外の文字またはBOMがない限り同じです。
davidtbernal 2011

3
file -I *私にとっては完全に動作するようです(OSX上)。システムは、多くのファイルの1つを指定せずに、そのエンコードについて不平を言いました。1つを除いて、すべてのファイルはasciiでした。utf-8でした。おそらく犯人。
mcv

1
@notJim 不正解です。ASCIIは0x7Fを介してのみ定義されているため、そのポイントを超えるものは明らかにASCIIではありません。UnicodeとLatin-1のコードポイントは0x80-0xFF で同じですが、Latin-1と同じUnicode の一般的なエンコードはありません(これは本質的に8ビットに制限され、Unicodeには小さすぎるため)。
tripleee 2015

56

Mac OS Xでは、コマンドfile -I(大文字のi)は、テストしているファイルに基本的なASCII範囲外の文字が含まれている限り、適切な文字セットを提供します。

たとえば、ターミナルに移動してviを使用してファイルを作成するとします。vi test.txt 次に、いくつかの文字を挿入し、アクセント付き文字を含め(ALT-eの後にeを入力してみてください)、ファイルを保存します。

彼らはタイプしfile -I text.txt、あなたはこのような結果を得るはずです:

test.txt: text/plain; charset=utf-8


3
ファイルの内容に応じて、OS Xのケース、charset = us-asciiまたはcharset = utf-8を確認できます
Ben

しかし、それはファイルの最初の数KBだけを見ているようです。私の場合、stackoverflow.comfileus-ascii
a / 33644535/161022

実際、ファイルはパフォーマンス上の理由でだまされているようです。Ubuntuで3MBのASCIIファイルを作成し、最後にいくつかのUTF-8文字を追加しても、UTF-8ではなくASCIIが報告されます。私は-kオプション(続行)を試しましたが、「UTF-8」ではなく「データ」を報告するので、まだ良くありません。
Cloudranger

24
vim -c 'execute "silent !echo " . &fileencoding | q' {filename}

私のbash構成のどこかにエイリアスとして

alias vic="vim -c 'execute \"silent !echo \" . &fileencoding | q'"

だから私はただタイプする

vic {filename}

私のバニラOSXヨセミテでは、「file -I」よりも正確な結果が得られます。

$ file -I pdfs/udocument0.pdf
pdfs/udocument0.pdf: application/pdf; charset=binary
$ vic pdfs/udocument0.pdf
latin1
$
$ file -I pdfs/t0.pdf
pdfs/t0.pdf: application/pdf; charset=us-ascii
$ vic pdfs/t0.pdf
utf-8

1
これが私に必要なものを与えた唯一の答えです。「us-ascii」ではなく「latin1」です。ただし、バックスラッシュを削除する必要がありました。
katy lavallee 16年

おかげで、バックスラッシュを削除しました。
jmettraux 2016年

21

次のコマンドを使用して、ファイルタイプを別のファイルタイプに変換することもできます。

iconv -f original_charset -t new_charset originalfile > newfile

例えば

iconv -f utf-16le -t utf-8 file1.txt > file2.txt

13

ただ使用する:

file -I <filename>

それでおしまい。


2
私は投票に迷惑を掛けることはできませんが、その答えは完全に間違っています。小-iは、通常のファイルの場合、コンテンツを分類しないことを示します。-Iは、mimeタイプの文字列を出力する--mimeと同等です。osxツールの動作は、標準のLinuxツールとは異なります。
sillyMunky 2011

さて、Windowsの1252エンコードされたファイルのためfile -Iに私を取得しますtext/plain; charset=unknown-8bit。それはUTF8ファイルのためのより良い作品けれども:text/plain; charset=utf-8
MiB、2015

8

-Iオプションの代わりにオプション(例:)を指定してfileコマンドを使用すると、OS Xで機能し、おそらく気にしないMIMEタイプ「text / plain」を省略するという追加の利点があります。--mime-encodingfile --mime-encoding some_file.txt


ls -l @ aは拡張属性を表示します。Yosemiteのlsのmanページを見ると、-mime-encodingオプションがありません。
rstackhouse、2015

あなたはfileコマンドについて話していました。存在することを知りませんでした。新入り。とにかく。反対票について申し訳ありません。SOは、誰かがこの回答を編集しない限り、元に戻すことはできません。
rstackhouse、2015

4

クラシック8ビットLaTeXは、使用できるUTF8文字が非常に制限されています。これは、使用しているフォントのエンコーディングと、そのフォントで使用可能なグリフに大きく依存しています。

特定の例を挙げていないため、問題がどこにあるのかを正確に知ることは困難です。つまり、フォントにないグリフを使用しようとしているのか、最初のフォントエンコーディングを正しく使用していないのか、などです。場所。

以下は、いくつかのUTF8文字をLaTeXドキュメントで使用する方法を示す最小限の例です。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\begin{document}
‘Héllø—thêrè.’
\end{document}

[utf8x]エンコーディングの方が運がいいかもしれませんが、[utf8]と比較して、サポートされなくなっていくつかの特異性があることを少し警告します(私が覚えている限り、久しぶりです)。しかし、それがうまくいくなら、それはあなたにとって重要なことのすべてです。


3

@記号は、ファイルに拡張属性があることを意味します。xattr fileそれが持っている属性をxattr -l file示し、属性値も示します(これは時々大きくなる可能性があります。たとえばxattr /System/Library/Fonts/HelveLTMM、リソースフォークに存在する古いスタイルのフォントを確認してください)。


2

file myfile.tex端末に入力すると、一連のアルゴリズムとマジックナンバーを使用して、エンコーディングとファイルのタイプがわかる場合があります。それはかなり便利ですが、具体的または信頼できる情報を提供することに依存しないでください。

Localizable.strings(ローカライズされたMac OS Xアプリケーションで見つかった)ファイルは、典型的には、UTF-16 Cソースファイルであると報告されています。


1

Synalyze It!ICUライブラリが提供するすべてのエンコーディングのテキストまたはバイトを比較できます。この機能を使用すると、通常、どのコードページがデータにとって意味があるかがすぐにわかります。


1

ファイルをFirefoxウィンドウにロードしてから、[表示]-[文字エンコーディング]に移動してください。ファイルのエンコードタイプの横にチェックマークがあるはずです。


0

どのLaTeXを使用していますか?teTeXを使用していたとき、手動でunicodeパッケージをダウンロードし、これを.texファイルに追加する必要がありました。

% UTF-8 stuff
\usepackage[notipa]{ucs}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}

今、私はTeXlive 2008パッケージ(ここ)からXeTeXに切り替えました、それはさらに簡単です:

% UTF-8 stuff
\usepackage{fontspec}
\usepackage{xunicode}

ファイルのエンコーディングの検出については、試してみることができますfile(1)(ただし、制限はあります)が、他の人が言ったように、それは困難です。


0

エンコーディングをチェックする力ずくの方法は、16進エディタなどでファイルをチェックすることだけかもしれません。(またはチェックするプログラムを作成)ファイル内のバイナリデータを確認します。UTF-8形式は、かなり簡単に認識できます。すべてのASCII文字はシングルバイトであり、値は128(0x80)未満です。マルチバイトシーケンスは、wiki記事に示されているパターンに従います

プログラムでエンコードを確認するためのより簡単な方法を見つけることができれば、それは明らかにショートカットですが、他のすべてが失敗した場合、これでうまくいきます。


0

以下のbashスクリプトを実装しました。

それへの最初の試みiconvで返されるエンコーディングからfile --mime-encodingutf-8

それが失敗した場合、すべてのエンコードを実行し、元のファイルと再エンコードされたファイルとの差分を表示します。大きなdiff出力(MAX_DIFF_LINES変数または2番目の入力引数で定義された「大」)を生成するエンコーディングはスキップします。これは、これらのエンコーディングが誤っている可能性が高いためです。

このスクリプトを使用した結果「悪いこと」が発生した場合、私を責めないでください。ありますrm -f怪物ことはそうあり、そこに。ランダムなサフィックスの付いたファイルに使用して悪影響を防止しようとしましたが、約束はしていません。

Darwin 15.6.0でテスト済み。

#!/bin/bash

if [[ $# -lt 1 ]]
then
  echo "ERROR: need one input argument: file of which the enconding is to be detected."
  exit 3
fi

if [ ! -e "$1" ]
then
  echo "ERROR: cannot find file '$1'"
  exit 3
fi

if [[ $# -ge 2 ]]
then
  MAX_DIFF_LINES=$2
else
  MAX_DIFF_LINES=10
fi


#try the easy way
ENCOD=$(file --mime-encoding $1 | awk '{print $2}')
#check if this enconding is valid
iconv -f $ENCOD -t utf-8 $1 &> /dev/null
if [ $? -eq 0 ]
then
  echo $ENCOD
  exit 0
fi

#hard way, need the user to visually check the difference between the original and re-encoded files
for i in $(iconv -l | awk '{print $1}')
do
  SINK=$1.$i.$RANDOM
  iconv -f $i -t utf-8 $1 2> /dev/null > $SINK
  if [ $? -eq 0 ]
  then
    DIFF=$(diff $1 $SINK)
    if [ ! -z "$DIFF" ] && [ $(echo "$DIFF" | wc -l) -le $MAX_DIFF_LINES ]
    then
      echo "===== $i ====="
      echo "$DIFF"
      echo "Does that make sense [N/y]"
      read $ANSWER
      if [ "$ANSWER" == "y" ] || [ "$ANSWER" == "Y" ]
      then
        echo $i
        exit 0
      fi
    fi
  fi
  #clean up re-encoded file
  rm -f $SINK
done

echo "None of the encondings worked. You're stuck."
exit 3
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.