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


170

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지만 인코딩이 무엇인지 말해 줄 수없는 것 같습니다. 내가 알아 낸 후에 만 ​​변환됩니다.


필자의 경험에 따르면, file (1) 명령은 항상 파일 인코딩을 추측하는 데 능숙했습니다. 파일의 com.apple.TextEncoding 확장 속성을 사용하기에 충분히 똑똑한 지 모르겠습니다.
Edward Falk

답변:


33

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

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

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


1
OSX가 인코딩을 메타 데이터로 저장했다고 가정했습니다. 파일 내용이 단지 비트 클러스터이며 고유 인코딩이 없다는 것을 이해했습니다.
James A. Rosen

1
TextEdit와 같은 @ JamesA.Rosen OS X 앱은 파일 인코딩을 속성 ( "com.apple.TextEncoding")으로 저장합니다. 해당 속성 @에 파일 인코딩 속성 이 포함 되어있을 가능성이 높습니다 . xattr -p com.apple.TextEncoding <filename>인코딩 속성이있는 경우 명령 을 사용하여 인코딩 속성을 볼 수 있습니다.
bames53

1
getxattr 사용법을 설명해 주시겠습니까? 사용할 수 없습니다.
MeV

1
프로그램을 작성하려는 경우 사용할 함수 호출입니다. 명령 행에서 입력 ls -l@ <filename>하여 파일에 설정된 속성을 확인하십시오. 실제 속성을 보려면xattr -p com.apple.TextEncoding <filename>
Edward Falk

enca그렇게 하려면 brew install enca언어를 지정해야하지만 아무 것도 작동 하지 않습니다 .enca FILENAME -L __
Shane

433

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

file -I {filename}

58
-I
Casebash

7
이 함수는 ASCII와 UTF-8의 차이점을 알 수없는 것처럼 보였습니다 (유니 코드 비트를 감지 할 수있는 문자는 아니지만 대부분의 미국 문자는 동일하지만 모든 문자가 동일하지 않은 것 같습니다)
BadPirate

14
파일에 OxFF 이외의 문자 나 BOM이 없으면 ASCII와 UTF8은 동일합니다.
davidtbernal

3
file -I *OSX에서 완벽하게 작동하는 것 같습니다. 시스템은 어떤 파일을 지정하지 않고 많은 파일 중 하나의 인코딩에 대해 불평했습니다. utf-8 인 파일을 제외한 모든 파일은 ASCII입니다. 범인 일 가능성이 높습니다.
mcv

1
@notJim 맞지 않습니다. ASCII는 0x7F를 통해서만 정의 되므로 해당 지점 이외의 것은 분명히 ASCII가 아닙니다. 유니 코드와 라틴 -1은 0x80-0xFF에서 동일한 코드 포인트를 갖지만 라틴 -1과 동일한 유니 코드의 공통 인코딩 은 없습니다 .
tripleee

56

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


3
파일 내용에 따라 OS X 사례, charset = us-ascii 또는 charset = utf-8을 확인할 수 있습니다
Ben

그러나 파일의 처음 몇 KB 만 보는 것 같습니다. 필자의 경우 stackoverflow.com/a/33644535/161022 의 vim 명령 은 파일을 utf-8로 올바르게 식별했지만 명령 은 파일을 file주장합니다.us-ascii
lmsurprenant

실제로 성능상의 이유로 파일이 부정 행위하는 것으로 보입니다. 방금 우분투에서 3MB ASCII 파일을 만들고 끝에 UTF-8 문자를 몇 개 추가했으며 여전히 UTF-8이 아닌 ASCII를보고합니다. -k 옵션 (계속 진행)을 시도했지만 "UTF-8"이 아닌 "data"를보고하므로 여전히 좋지 않습니다.
Cloudranger

24
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

1
이것은 "us-ascii"와 달리 "latin1"을 필요로하는 유일한 대답입니다. 그러나 백 슬래시를 제거해야했습니다.
katy lavallee

고마워 백 슬래시를 제거했습니다.
jmettraux

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

글쎄, Windows 1252 인코딩 파일의 경우 file -I나를 얻습니다 text/plain; charset=unknown-8bit. utf8 파일에서 더 잘 작동하지만 : text/plain; charset=utf-8.
MiB December

8

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


ls -l @ a는 확장 된 속성 을 보여줍니다 . Yosemite의 ls 매뉴얼 페이지를 보면 --mime-encoding 옵션이 표시되지 않습니다.
rstackhouse

당신은 그 file명령 에 대해 이야기하고있었습니다 . 존재한다는 것을 몰랐다. 멍청한 놈. 어쨌든. 공감에 대해 죄송합니다. 누군가 가이 답변을 편집하지 않으면 취소하지 않을 것입니다.
rstackhouse

4

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


3

@ 기호는 파일에 확장 된 속성 이 있음을 의미 합니다 . xattr file속성이 무엇인지 xattr -l file, 속성 값도 표시합니다 (때로는 클 수 있음). 예 xattr /System/Library/Fonts/HelveLTMM를 들어 리소스 포크에 존재하는 구식 글꼴을 확인하십시오.


2

file myfile.tex터미널에 입력 하면 일련의 알고리즘과 마법 번호를 사용하여 파일의 인코딩 및 유형을 알 수 있습니다. 상당히 유용하지만 구체적이거나 신뢰할 수있는 정보를 제공하는 데 의존하지 않습니다.

Localizable.strings현지화 된 Mac OS X 응용 프로그램에 있는 파일은 일반적으로 UTF-16 C 소스 파일로보고됩니다.



1

파일을 파이어 폭스 창에로드 한 다음보기-문자 인코딩으로 이동하십시오. 파일의 인코딩 유형 옆에 확인 표시가 있어야합니다.


0

어떤 LaTeX를 사용하고 있습니까? teTeX를 사용할 때 유니 코드 패키지 를 수동으로 다운로드하여 .tex 파일에 추가해야했습니다.

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

이제 TeXlive 2008 패키지 ( here ) 에서 XeTeX로 전환 했습니다. 훨씬 간단합니다.

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

파일의 인코딩을 감지하는 경우에는 재생할 수 file(1)있지만 다소 제한적이지만 다른 사람이 말한 것처럼 어렵습니다.


0

인코딩을 확인하는 무차별 방식은 16 진 편집기 또는 이와 유사한 파일을 확인하는 것입니다. (또는 점검 할 프로그램 작성) 파일에서 이진 데이터를보십시오. UTF-8 형식은 인식하기 매우 쉽습니다. 모든 ASCII 문자는 128 (0x80) 이하의 값을 갖는 단일 바이트입니다. 멀티 바이트 시퀀스는 위키 기사에 표시된 패턴을 따릅니다.

인코딩을 확인하는 프로그램을 얻는 간단한 방법을 찾으면 바로 가기이지만 다른 모든 방법이 실패하면 속임수가됩니다.


0

아래 bash 스크립트를 구현했는데 저에게 효과적입니다.

먼저 iconv에서 반환 한 인코딩을 시도 file --mime-encoding합니다 utf-8.

실패하면 모든 인코딩을 거치고 원본 파일과 다시 인코딩 된 파일 간의 차이를 보여줍니다. 큰 diff 출력 ( MAX_DIFF_LINES변수 또는 두 번째 입력 인수에 의해 정의 된 "큰")을 생성하는 인코딩을 건너 뜁니다 . 대부분 잘못된 인코딩 일 수 있습니다.

이 스크립트를 사용한 결과로 "나쁜 일"이 발생하더라도 나를 비난하지 마십시오. 거기에 rm -f몬스터가 있습니다. 임의의 접미사가있는 파일에 사용하여 부작용을 방지하려고 노력했지만 약속하지는 않습니다.

다윈 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.