Programing

OS X에서 파일 인코딩을 어떻게 확인합니까?

lottogame 2020. 5. 31. 09:55
반응형

OS X에서 파일 인코딩을 어떻게 확인합니까?


TextMate 의 LaTeX 파일에 UTF-8 문자를 입력하려고하는데 (기본 인코딩은 UTF-8이라고 함) LaTeX는 이해하지 못하는 것 같습니다.

Running cat my_file.tex은 터미널에서 문자를 올바르게 표시합니다. Running ls -al은 이전에 본 적이없는 파일 목록의 "@"을 보여줍니다.

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

(그리고, \usepackage[utf8]{inputenc}LaTeX에서 사용 하고 있습니다.)

나는 찾았 iconv지만 인코딩이 무엇인지 말해 줄 수없는 것 같습니다. 내가 알아 낸 후에 만 ​​변환됩니다.


@파일에 확장 된 파일 속성 있음을 의미합니다. getxattr()함수를 사용하여 쿼리 할 수 ​​있습니다 .

파일의 인코딩을 감지하는 확실한 방법은 없습니다. 답변을 읽고 이유를 설명하십시오.

인코딩을 추측하려는 명령 행 도구 enca가 있습니다. 확인하고 싶을 수도 있습니다.


은 Using -I파일 명령에 (자본 내가에게의) 옵션을 사용하면 파일 인코딩을 보여줄 것으로 보인다.

file -I {filename}

Mac OS X에서 file -I테스트중인 파일에 기본 ASCII 범위를 벗어난 문자가 포함되어 있으면 명령 (대문자 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}

내 바닐라 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 옵션 대신 옵션 (예 :) file과 함께 명령을 사용하면 OS X에서 작동하며 "text / plain"이라는 MIME 유형을 생략 할 수 있다는 이점이 있습니다.--mime-encodingfile --mime-encoding some_file.txt


클래식 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]과 비교할 때 약간의 특이점이 있음을 약간 경고합니다 (내가 기억하는 한, 오래 전에 보았습니다). 그러나 그것이 속임수라면, 그것이 당신에게 중요한 전부입니다.


The @ sign means the file has extended attributes. xattr file shows what attributes it has, xattr -l file shows the attribute values too (which can be large sometimes — try e.g. xattr /System/Library/Fonts/HelveLTMM to see an old-style font that exists in the resource fork).


Typing file myfile.tex in a terminal can sometimes tell you the encoding and type of file using a series of algorithms and magic numbers. It's fairly useful but don't rely on it providing concrete or reliable information.

A Localizable.strings file (found in localised Mac OS X applications) is typically reported to be a UTF-16 C source file.


Synalyze It! allows to compare text or bytes in all encodings the ICU library offers. Using that feature you usually see immediately which code page makes sense for your data.


You can try loading the file into a firefox window then go to View - Character Encoding. There should be a check mark next to the file's encoding type.


Which LaTeX are you using? When I was using teTeX, I had to manually download the unicode package and add this to my .tex files:

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

Now, I've switched over to XeTeX from the TeXlive 2008 package (here), it is even more simple:

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

As for detection of a file's encoding, you could play with file(1) (but it is rather limited) but like someone else said, it is difficult.


A brute-force way to check the encoding might just be to check the file in a hex editor or similar. (or write a program to check) Look at the binary data in the file. The UTF-8 format is fairly easy to recognize. All ASCII characters are single bytes with values below 128 (0x80) Multibyte sequences follow the pattern shown in the wiki article

If you can find a simpler way to get a program to verify the encoding for you, that's obviously a shortcut, but if all else fails, this would do the trick.


I implemented the bash script below, it works for me.

It first tries to iconv from the encoding returned by file --mime-encoding to utf-8.

If that fails, it goes through all encodings and shows the diff between the original and re-encoded file. It skips over encodings that produce a large diff output ("large" as defined by the MAX_DIFF_LINES variable or the second input argument), since those are most likely the wrong encoding.

If "bad things" happen as a result of using this script, don't blame me. There's a rm -f in there, so there be monsters. I tried to prevent adverse effects by using it on files with a random suffix, but I'm not making any promises.

Tested on 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

참고URL : https://stackoverflow.com/questions/539294/how-do-i-determine-file-encoding-in-os-x

반응형