web-dev-qa-db-ja.com

OSXでのファイルエンコーディングの決定方法

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

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

iconvを見つけましたが、それはエンコードが何であるかを教えてくれるようには見えません-理解したら変換するだけです。

161
James A. Rosen

@は、ファイルに関連する拡張ファイル属性があることを意味します。 getxattr()関数を使用してクエリできます。

ファイルのエンコーディングを検出する明確な方法はありません。 this answerを読んで、理由を説明します。

エンコードを推測しようとするコマンドラインツール enca があります。あなたはそれをチェックアウトしたいかもしれません。

33
codelogic

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

file -I {filename}
418
Tim

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

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

file -I text.txtと入力すると、次のような結果が得られます。

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

55
Cloudranger

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

iconv -f original_charset -t new_charset originalfile > newfile

例えば.

iconv -f utf-16le -t utf-8 file1.txt > file2.txt
20
RPM
vim -c 'execute "silent !echo " . &fileencoding | q' {filename}

私のbash設定のどこかに別名として

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

だから私はタイプするだけです

vic {filename}

私のVanilla OSX Yosemiteでは、「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
19
jmettraux

ただ使用する:

file -I <filename>

それでおしまい。

13
bx2

-Iオプションの代わりに--mime-encodingオプション(file --mime-encoding some_file.txtなど)を指定したfileコマンドを使用すると、OS Xで動作し、MIMEタイプ "text/plain"を省略できるという追加の利点があります。

8
Adam

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

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

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

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

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

4
Will Robertson

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

3

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

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

2
dreamlax

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

1
jmdeamer

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

1
pi3

以下にbashスクリプトを実装しましたが、うまくいきます。

最初にfile --mime-encodingによって返されたエンコードからutf-8iconvを試みます。

それが失敗した場合、すべてのエンコーディングを通過し、元のファイルと再エンコードされたファイルの差分を表示します。大きな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
0
Joao Encarnacao

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

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

さて、TeXlive 2008パッケージからXeTeXに切り替えました( here )、さらに簡単です:

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

ファイルのエンコーディングの検出に関しては、file(1)で遊ぶことができます(しかし、それはかなり制限されています)が、他の誰かが言ったように、それは難しいです。

0
Keltia

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

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

0
jalf