OS X'te dosya kodlamasını nasıl belirlerim?


171

TextMate (varsayılan kodlaması UTF-8 olduğunu söylüyor) LaTeX dosyasına bazı UTF-8 karakterleri girmeye çalışıyorum , ama LaTeX onları anlamak gibi görünmüyor.

Çalışıyor cat my_file.texise, Terminal'deki karakterleri düzgün bir şekilde gösterir. Running ls -al, daha önce hiç görmediğim bir şeyi gösteriyor: dosya listesinin yanında bir "@":

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

(Ve evet, \usepackage[utf8]{inputenc}LaTeX'te kullanıyorum .)

Buldum iconv, ama bu bana kodlamanın ne olduğunu söyleyemiyor gibi görünüyor - sadece anladıktan sonra dönüşecek.


Deneyimlerime göre, file (1) komutu her zaman bir dosyanın kodlamasını tahmin etmede oldukça iyi olmuştur. Dosyanın com.apple.TextEncoding genişletilmiş özniteliğini kullanmak için yeterince akıllı olup olmadığını bilmiyorum.
Edward Falk

Yanıtlar:


33

@Dosya uzatılmış dosyası vardır vasıta onunla ilişkili bağlıyor. Bunları getxattr()işlevi kullanarak sorgulayabilirsiniz .

Bir dosyanın kodlamasını tespit etmenin kesin bir yolu yoktur. Bu cevabı okuyun , nedenini açıklar.

Kodlamayı tahmin etmeye çalışan bir komut satırı aracı var: enca . Kontrol etmek isteyebilirsiniz.


1
OSX'in kodlamayı meta veri olarak depoladığını varsayıyordum. Dosya içeriğinin sadece bir bit kümesi olduğunu ve doğal bir kodlaması olmadığını anladım.
James A. Rosen

1
@ JamesA.Rosen OS X uygulamaları, TextEdit gibi dosya kodlamasını bir öznitelik olarak ("com.apple.TextEncoding" olarak adlandırılır) depolar. Bununla gösterilen @özniteliklerin dosya kodlama özniteliğini içermesi olasıdır . xattr -p com.apple.TextEncoding <filename>Varsa kodlama özelliğine bakmak için komutu kullanabilirsiniz .
15:14

1
getxattr nasıl kullanıldığını açıklayabilir misiniz? Kullanamıyorum.
MeV

1
Bu, bir program yazmak istiyorsanız kullanacağınız bir işlev çağrısıdır. Komut satırından, ls -l@ <filename>dosya için hangi özniteliklerin ayarlandığını görmek için yazın. Gerçek özelliği görmek için şunu yazın:xattr -p com.apple.TextEncoding <filename>
Edward Falk

Almak için encayapmak brew install encave dili belirtmek zorunda ama hiçbiri bu yüzden, çalışır:enca FILENAME -L __
Shane

435

Kullanılması -Idosya komuta (sermaye i var) seçeneğini dosya kodlamasını göstermek gibi görünüyor.

file -I {filename}

58
-I
Casebash

7
Bu işlev ASCII ve UTF-8 arasındaki farkı söyleyemiyor gibi görünüyordu (çoğu ABD karakteri için aynı görünüyorlar, ancak hepsi değil, belki de unicode biti algılayacak bir şey)
BadPirate

14
ASCII ve UTF8, dosyada OxFF veya bir BOM dışında bir karakter olmadığı sürece aynıdır.
davidtbernal

3
file -I *(OSX'te) benim için mükemmel çalışıyor gibi görünüyor. Bir sistem, hangisi olduğunu belirtmeden birçok dosyadan birinin kodlanmasından şikayet etti. Utf-8 olan biri hariç tüm dosyalar ascii idi. Büyük olasılıkla suçlu.
mcv

1
@notJim Bu yanlış. ASCII yalnızca 0x7F ile tanımlanır , bu nedenle bu noktanın ötesindeki herhangi bir şey açıkça ASCII değildir. Unicode ve Latin-1, 0x80-0xFF'de aynı kod noktalarına sahiptir, ancak Unicode'un Latin-1 ile özdeş olan ortak bir kodlaması yoktur (çünkü bu, doğal olarak 8 bitle sınırlandırılacaktır, bu da Unicode için çok azdır).
üçlü

56

Mac OS X'te, file -Itest ettiğiniz dosya temel ASCII aralığının dışındaki karakterleri içerdiği sürece (büyük harf i) komutu size uygun karakter setini verecektir.

Örneğin, Terminal'e gidip bir dosya oluşturmak için vi kullanıyorsanız örn. vi test.txt ardından bazı karakterler ekleyin ve aksanlı bir karakter ekleyin (ALT-e'yi ve ardından e'yi deneyin) ve ardından dosyayı kaydedin.

Onlar yazıyor file -I text.txtve böyle bir sonuç almalısınız:

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


3
OS X vakasını, charset = us-ascii veya charset = utf-8 dosyasının içeriğine bağlı olarak onaylayabilirim
Ben

ancak dosyanın ilk birkaç KB'sine bakılıyor gibi görünüyor. benim durumumda, stackoverflow.com/a/33644535/161022 adresindeki vim komutu dosyayı doğru utf-8 olarak tanımlarken, filekomut onun hak talebinde bulunurus-ascii
lmsurprenant

Gerçekten de, dosya performans nedenleriyle hile yapıyor gibi görünüyor. Sadece Ubuntu'da 3MB ASCII dosyası oluşturdum ve sonuna birkaç UTF-8 karakteri ekledim ve hala ASCII'yi UTF-8 değil bildiriyor. -K seçeneğini denedim (devam et) ama sonra "veri" rapor değil "UTF-8" çok iyi değil.
Cloudranger

24
vim -c 'execute "silent !echo " . &fileencoding | q' {filename}

bash yapılandırmamda bir yere takma olarak

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

bu yüzden sadece yazıyorum

vic {filename}

Benim vanilya OSX Yosemite, "dosya-I" den daha kesin sonuçlar verir:

$ 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
Bana ihtiyacım olan tek cevap bu - "us-ascii" nin aksine "latin1". Rağmen, ters eğik çizgiler kaldırmak zorunda kaldı.
katy lavallee

Çok teşekkürler, ters eğik çizgileri çıkardım.
jmettraux

21

Aşağıdaki komutu kullanarak bir dosya türünden diğerine de dönüştürebilirsiniz:

iconv -f original_charset -t new_charset originalfile > newfile

Örneğin

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

13

Sadece kullan:

file -I <filename>

Bu kadar.


2
Oy vermekten rahatsız edilemem ama bu cevap tamamen yanlış. Küçük -i, normal bir dosyaysa içeriği sınıflandırmadığını söylüyor. -I, mime tipi dizgiler veren --mime eşdeğeridir. Osx takımları standart linux takımlarından farklı davranır.
sillyMunky

Peki, bir Windows 1252 kodlu dosya için file -Ibeni alır text/plain; charset=unknown-8bit. Bir utf8 dosyası için daha iyi çalışır rağmen: text/plain; charset=utf-8.
MiB

8

-I seçeneği yerine (örn. ) Seçeneğiyle filekomut kullanmak OS X üzerinde çalışır ve muhtemelen umursamadığınız "text / plain" mime türünü atlamanın ek avantajına sahiptir.--mime-encodingfile --mime-encoding some_file.txt


ls -l @ a genişletilmiş öznitelikleri gösterir . Yosemite'de ls için man sayfasına baktığımda --mime kodlama seçeneği görmüyorum.
rstackhouse

Komuttan bahsediyordun file. Birinin var olduğunu bilmiyordum. Çaylak. Neyse. Downvot için üzgünüm. SO, birisi bu yanıtı düzenlemedikçe geri almama izin vermiyor.
rstackhouse

4

Klasik 8 bit LaTeX, UTF8 karakterlerini kullanabileceği çok kısıtlıdır; büyük ölçüde kullandığınız yazı tipinin kodlamasına ve bu yazı tipinin hangi gliflere sahip olduğuna bağlıdır.

Belirli bir örnek vermediğiniz için, sorunun tam olarak nerede olduğunu bilmek zor - yazı tipinizin sahip olmadığı bir glif kullanmaya çalışıp çalışmadığınızı veya ilkinde doğru yazı tipi kodlamasını kullanmıyorsanız yer.

LaTeX belgesinde birkaç UTF8 karakterinin nasıl kullanılabileceğini gösteren minimal bir örnek:

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

[Utf8x] kodlamasıyla daha fazla şansınız olabilir, ancak artık [utf8] ile karşılaştırıldığında artık desteklenmediği ve bazı özdeyişlere sahip olduğu konusunda uyarıda bulunun (hatırladığım kadarıyla, baktığımdan beri bir süredir). Ama eğer hile yaparsa, sizin için önemli olan tek şey budur.


3

@ İşareti, dosyanın genişletilmiş özniteliklere sahip olduğu anlamına gelir . xattr filesahip xattr -l fileolduğu özellikleri gösterir, özellik değerlerini de gösterir (bu bazen büyük olabilir - örneğin xattr /System/Library/Fonts/HelveLTMMkaynak çatalı var olan eski stil yazı tipini görmeyi deneyin ).


2

file myfile.texBir terminale yazmak bazen bir dizi algoritma ve sihirli sayı kullanarak kodlama ve dosya türünü söyleyebilir. Oldukça faydalıdır, ancak somut veya güvenilir bilgi sağladığına güvenmeyin.

Bir Localizable.stringsdosyanın (yerelleştirilmiş Mac OS X uygulamalarında bulunur) genellikle UTF-16 C kaynak dosyası olduğu bildirilir.


1

Senkronize Et! YBÜ kütüphanesinin sunduğu tüm kodlamalarda metin veya bayt karşılaştırmasını sağlar . Bu özelliği kullanarak genellikle hangi kod sayfasının verileriniz için anlamlı olduğunu hemen görürsünüz.


1

Dosyayı bir firefox penceresine yüklemeyi deneyebilir ve ardından Görünüm - Karakter Kodlaması'na gidebilirsiniz. Dosyanın kodlama türünün yanında bir onay işareti bulunmalıdır.


0

Hangi LaTeX kullanıyorsunuz? TeTeX kullanırken, unicode paketini manuel olarak indirip bunu .tex dosyalarıma eklemek zorunda kaldım:

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

Şimdi, TeXlive 2008 paketinden ( burada ) XeTeX'e geçtim , daha da basit:

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

Bir dosyanın kodlamasını algılamaya gelince, oynatabilirsiniz file(1)(ancak oldukça sınırlıdır), ancak başka birinin söylediği gibi, zordur.


0

Kodlamayı kontrol etmenin kaba bir yolu, dosyayı bir onaltılı düzenleyicide veya benzer bir şekilde kontrol etmek olabilir. (veya kontrol etmek için bir program yazın) Dosyadaki ikili verilere bakın. UTF-8 formatının tanınması oldukça kolaydır. Tüm ASCII karakterleri 128 (0x80) altında değerler içeren tek bayttır. Çok baytlı diziler wiki makalesinde gösterilen modeli izler

Kodlamayı sizin için doğrulamak için bir program almanın daha basit bir yolunu bulabilirseniz, bu bir kısayol, ancak her şey başarısız olursa, bu hile yapar.


0

Aşağıdaki bash betiğini uyguladım, benim için çalışıyor.

Bu ilk çalışır iconvkodlama tarafından döndürülen gelen file --mime-encodingetmek utf-8.

Bu başarısız olursa, tüm kodlamalardan geçer ve orijinal ve yeniden kodlanmış dosya arasındaki farkı gösterir. Büyük bir fark çıkışı ( MAX_DIFF_LINESdeğişken veya ikinci girdi bağımsız değişkeni tarafından tanımlandığı şekliyle "büyük") üreten kodlamaları atlar , çünkü bunlar büyük olasılıkla yanlış kodlamadır.

Bu senaryoyu kullanmanın bir sonucu olarak "kötü şeyler" olursa beni suçlama. Orada bir tane rm -fvar, bu yüzden canavarlar var. Rastgele bir sonek içeren dosyalarda olumsuz etkileri önlemeye çalıştım, ancak herhangi bir söz vermiyorum.

Darwin'de test edildi 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.