我试图在TextMate中输入一些UTF-8字符到LaTeX文件(它说它的默认编码是UTF-8),但LaTeX似乎不理解它们。

运行cat my_file.tex可以在Terminal中正确显示字符。运行ls -al会显示一些我以前从未见过的东西:文件列表旁边的“@”:

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

(并且,是的,我在LaTeX中使用\usepackage[utf8]{inputenc}。)

我找到了iconv,但这似乎不能告诉我编码是什么-它只会转换一旦我弄清楚。


当前回答

@符号表示文件具有扩展属性。xattr文件显示了它拥有的属性,xattr -l文件也显示了属性值(有时可能很大-尝试例如xattr /System/Library/Fonts/HelveLTMM来查看存在于资源分叉中的旧式字体)。

其他回答

您可以尝试将文件加载到firefox窗口中,然后转到“查看-字符编码”。在文件的编码类型旁边应该有一个复选标记。

你用的是哪种乳胶?当我使用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)(但它相当有限),但就像其他人所说的那样,这很困难。

我实现了下面的bash脚本,它为我工作。

它首先尝试将file——mime-encoding返回的encoding中的iconv转换为utf-8。

如果失败,它将遍历所有编码,并显示原始文件和重新编码的文件之间的差异。它跳过了产生较大diff输出的编码(“大”由MAX_DIFF_LINES变量或第二个输入参数定义),因为这些编码很可能是错误的。

如果使用这个脚本导致了“不好的事情”,不要责怪我。这里有一个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

你也可以使用下面的命令从一个文件类型转换到另一个文件类型:

iconv -f original_charset -t new_charset originalfile > newfile

如。

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

在终端中输入文件myfile.tex有时可以使用一系列算法和神奇数字告诉您文件的编码和类型。它相当有用,但不要依赖它提供具体或可靠的信息。

可以定位的。字符串文件(在本地化的Mac OS X应用程序中找到)通常报告为utf - 16c源文件。