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
を見つけましたが、それはエンコードが何であるかを教えてくれるようには見えません-理解したら変換するだけです。
ファイルコマンドで-I
(大文字のi)オプションを使用すると、ファイルエンコーディングが表示されるようです。
file -I {filename}
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
次のコマンドを使用して、あるファイルタイプから別のファイルタイプに変換することもできます。
iconv -f original_charset -t new_charset originalfile > newfile
例えば.
iconv -f utf-16le -t utf-8 file1.txt > file2.txt
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
ただ使用する:
file -I <filename>
それでおしまい。
-Iオプションの代わりに--mime-encoding
オプション(file --mime-encoding some_file.txt
など)を指定したfile
コマンドを使用すると、OS Xで動作し、MIMEタイプ "text/plain"を省略できるという追加の利点があります。
従来の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]に比べてサポートされておらず、いくつかの特異性があることを少し警告します(覚えている限り、私はそれを見てからしばらく経ちました)。しかし、それがうまく行けば、それはあなたにとって重要なことです。
@記号は、ファイルに 拡張属性 があることを意味します。 xattr file
は属性を示し、xattr -l file
は属性値も表示します(場合によっては大きくなる可能性があります。たとえば、リソースフォークに存在する古いスタイルのフォントを確認するにはxattr /System/Library/Fonts/HelveLTMM
を試してください)。
ターミナルでfile myfile.tex
を入力すると、一連のアルゴリズムとマジックナンバーを使用して、ファイルのエンコードとタイプを伝えることができます。これはかなり便利ですが、具体的または信頼できる情報を提供することに依存しないでください。
Localizable.strings
ファイル(ローカライズされたMac OS Xアプリケーションにあります)は通常、UTF-16 Cソースファイルであると報告されています。
ファイルをfirefoxウィンドウにロードしてから、[表示]-[文字エンコーディング]に移動してください。ファイルのエンコードタイプの横にチェックマークが必要です。
Synalyze It! は、 ICUライブラリ が提供するすべてのエンコーディングのテキストまたはバイトを比較できます。この機能を使用すると、通常、どのコードページがデータにとって意味があるかがすぐにわかります。
以下にbashスクリプトを実装しましたが、うまくいきます。
最初にfile --mime-encoding
によって返されたエンコードからutf-8
にiconv
を試みます。
それが失敗した場合、すべてのエンコーディングを通過し、元のファイルと再エンコードされたファイルの差分を表示します。大きな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
どの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)
で遊ぶことができます(しかし、それはかなり制限されています)が、他の誰かが言ったように、それは難しいです。
エンコードを確認する総当たり的な方法は、16進エディタなどでファイルを確認することです。 (またはチェックするプログラムを作成します)ファイル内のバイナリデータを確認します。 UTF-8形式はかなり簡単に認識できます。すべてのASCII文字は、128(0x80)未満の値を持つ単一バイトです。マルチバイトシーケンスは、 wiki記事 に示されているパターンに従います。
エンコードを検証するプログラムを取得するためのより簡単な方法を見つけることができる場合、それは明らかにショートカットですが、他のすべてが失敗した場合、これはトリックを行います。