मैं ओएस एक्स में फ़ाइल एन्कोडिंग कैसे निर्धारित करूं?


170

मैं TextMate में लाटेक्स फ़ाइल में कुछ 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

(और, हां, मैं \usepackage[utf8]{inputenc}LaTeX में उपयोग कर रहा हूं ।)

मैंने पाया है iconv, लेकिन यह मुझे नहीं बता पा रहा है कि एन्कोडिंग क्या है - यह केवल एक बार जब मैं इसका पता लगा लूंगा, तो इसे बदल दूंगा।


मेरे अनुभव में, फ़ाइल की एन्कोडिंग का अनुमान लगाने में फ़ाइल (1) कमांड हमेशा बहुत अच्छा रहा है। मुझे नहीं पता कि यह फ़ाइल के com.apple.TextEncoding विस्तारित विशेषता का उपयोग करने के लिए पर्याप्त स्मार्ट है या नहीं।
एडवर्ड फॉक

जवाबों:


33

इसका @मतलब यह है कि फ़ाइल ने इसके साथ जुड़े फ़ाइल विशेषताओं को बढ़ाया है। आप getxattr()फ़ंक्शन का उपयोग करके उन्हें क्वेरी कर सकते हैं ।

किसी फ़ाइल के एन्कोडिंग का पता लगाने का कोई निश्चित तरीका नहीं है। इस उत्तर को पढ़ें , यह बताता है कि क्यों।

एक कमांड लाइन उपकरण है, एन्का , जो एन्कोडिंग का अनुमान लगाने का प्रयास करता है। शायद आप इस पर एक नजर डालना चाहें।


1
मैं मान रहा था कि OSX ने मेटा-डेटा के रूप में एन्कोडिंग को संग्रहीत किया है। मैं समझता था कि फ़ाइल सामग्री केवल बिट्स का एक समूह थी और इसमें कोई अंतर्निहित एन्कोडिंग नहीं थी।
जेम्स ए। रोसेन

1
@ JamesA.Rosen OS X ऐप जैसे TextEdit फाइल एन्कोडिंग को एक विशेषता के रूप में संग्रहीत करते हैं (जिसका नाम "com.apple.TextEncoding") है। यह काफी संभावना है कि इसके द्वारा बताई गई विशेषताओं @में फ़ाइल एन्कोडिंग विशेषता शामिल है। xattr -p com.apple.TextEncoding <filename>यदि यह मौजूद है तो एन्कोडिंग विशेषता को देखने के लिए आप कमांड का उपयोग कर सकते हैं ।
bames53

1
क्या आप समझा सकते हैं कि गेटएक्सट्रा का उपयोग कैसे करें? मैं इसका उपयोग नहीं कर पा रहा हूं।
MeV

1
यदि आप कोई प्रोग्राम लिखना चाहते हैं, तो यह एक फ़ंक्शन कॉल है जिसका आप उपयोग करेंगे। कमांड लाइन से, बस ls -l@ <filename>यह देखने के लिए टाइप करें कि फ़ाइल के लिए कौन सी विशेषताएँ निर्धारित हैं। वास्तविक विशेषता को देखने के लिए, टाइप करेंxattr -p com.apple.TextEncoding <filename>
एडवर्ड फॉक

प्राप्त करने के लिए encaकरते हैं brew install encaऔर आप भाषा निर्दिष्ट करने के लिए है, लेकिन कोई भी काम करता है, तो:enca FILENAME -L __
शेन

433

-Iफ़ाइल कमांड पर (वह पूंजी i) विकल्प का उपयोग करके फ़ाइल एन्कोडिंग दिखाती है।

file -I {filename}

58
मैं का उपयोग करने की जरूरत है -I
Casebash

7
यह फ़ंक्शन ASCII और UTF-8 के बीच का अंतर बताने में असमर्थ प्रतीत होता है (ऐसा लगता है कि वे ज्यादातर अमेरिकी पात्रों के लिए समान हैं, लेकिन सभी नहीं, शायद कुछ ऐसा है जो यूनिकोड बिट का पता लगाता है)
BadPirate

14
ASCII और UTF8 एक ही हैं, जब तक कि फ़ाइल में ऑक्सीफ़ से परे कोई वर्ण या BOM नहीं है।
डेविडेटबरनल

3
file -I *मेरे लिए पूरी तरह से काम करने लगता है (OSX पर)। एक प्रणाली ने कई फ़ाइलों में से एक के एन्कोडिंग के बारे में शिकायत की, जो निर्दिष्ट किए बिना। सभी फाइलें एससीआई थीं, केवल एक को छोड़कर, जो यूटीएफ -8 थी। सबसे अधिक संभावना अपराधी।
एमसीवी

1
@ नहीं यह गलत है। ASCII को केवल 0x7F के माध्यम से परिभाषित किया गया है, इसलिए उस बिंदु से परे कुछ भी स्पष्ट रूप से ASCII नहीं है। यूनिकोड और लैटिन -1 में 0x80-0xFF में समान कोड अंक हैं, लेकिन यूनिकोड का कोई सामान्य एन्कोडिंग नहीं है जो लैटिन -1 के समान है (क्योंकि यह स्वाभाविक रूप से 8 बिट्स तक सीमित होगा, जो यूनिकोड के लिए बहुत कम है)।
ट्रिपल डी

56

Mac OS X में कमांड file -I(कैपिटल i) आपको उचित वर्ण सेट देगा जब तक कि आपके द्वारा परीक्षण की जा रही फ़ाइल में मूल ASCII रेंज के बाहर के वर्ण शामिल हों।

उदाहरण के लिए यदि आप टर्मिनल में जाते हैं और फ़ाइल बनाने के लिए 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
बेन

लेकिन यह केवल फ़ाइल के पहले कुछ KB को देखता है। मेरे मामले में, stackoverflow.com/a/33644535/161022 पर vim कमांड ने फ़ाइल को सही ढंग से utf-8 के रूप में पहचाना जबकि fileकमांड का दावा हैus-ascii
lmsurprenant

दरअसल, ऐसा लगता है कि प्रदर्शन के कारणों के लिए फ़ाइल धोखा देती है। मैंने सिर्फ Ubuntu पर 3MB ASCII फ़ाइल बनाई और अंत में कुछ UTF-8 वर्ण जोड़े और यह अभी भी ASCII को UTF-8 नहीं बताता है। मैंने -k विकल्प की कोशिश की (चलते रहें) लेकिन फिर यह "डेटा" को "यूटीएफ -8" नहीं बताता है, फिर भी अच्छा नहीं है।
11

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

मेरे बैश कॉन्फ़िगरेशन में कहीं और उपनाम है

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

इसलिए मैं सिर्फ टाइप करता हूं

vic {filename}

मेरे वेनिला OSX Yosemite पर, यह "फ़ाइल -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
यह एकमात्र उत्तर है जिसने मुझे वह दिया, जिसकी मुझे ज़रूरत थी - "लैटिन 1", जैसा कि "us-ascii" के विपरीत है। हालांकि, मुझे बैकस्लैश को हटाना पड़ा।
कात्या लवले

बहुत बहुत धन्यवाद, मैंने बैकस्लैश को हटा दिया।
जेटमेट्रा

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
मुझे वोट देने के लिए परेशान नहीं किया जा सकता है, लेकिन यह जवाब पूरी तरह से गलत है। लघु-आई का कहना है कि यदि यह एक नियमित फ़ाइल है तो सामग्री को वर्गीकृत न करें। -मैं समतुल्य है - माइम जो माइम प्रकार के तारों का उत्पादन करता है। ओएक्सएक्स उपकरण मानक लिनक्स उपकरण से अलग व्यवहार करते हैं।
मूर्ख

खैर, विंडोज के लिए 1252 एनकोडेड फाइल file -Iमुझे मिलती है text/plain; charset=unknown-8bit। हालांकि यह utf8 फ़ाइल के लिए बेहतर काम करता है text/plain; charset=utf-8:।
MiB

8

विकल्प के fileसाथ कमांड का उपयोग करना --mime-encoding(जैसे file --mime-encoding some_file.txt) के बजाय -I विकल्प OS X पर काम करता है और इसमें माइम प्रकार, "टेक्स्ट / प्लेन" को छोड़ने का अतिरिक्त लाभ होता है, जिसकी आपको शायद परवाह नहीं है।


ls -l @ एक विस्तारित विशेषताएँ दिखाएंगे । Yosemite पर ls के लिए मैन पेज को देखते हुए, मुझे --mime- एन्कोडिंग विकल्प दिखाई नहीं देता है।
रैस्टहाउस हाउस

आप fileकमांड के बारे में बात कर रहे थे । पता नहीं था कि एक अस्तित्व में है। अनाडी। वैसे भी। डाउनवोट के बारे में क्षमा करें। जब तक कोई इस उत्तर को संपादित नहीं करता, तब तक मैं इसे पूर्ववत नहीं करने दूंगा।
rstackhouse

4

क्लासिक 8-बिट LaTeX बहुत प्रतिबंधित है जिसमें UTF8 वर्ण इसका उपयोग कर सकते हैं; यह आपके द्वारा उपयोग किए जा रहे फ़ॉन्ट के एन्कोडिंग पर अत्यधिक निर्भर है और जो फ़ॉन्ट उपलब्ध है, उसे ग्लिफ़ करता है।

चूंकि आप एक विशिष्ट उदाहरण नहीं देते हैं, इसलिए यह जानना कठिन है कि समस्या कहां है - क्या आप ग्लिफ़ का उपयोग करने का प्रयास कर रहे हैं, जो आपके फ़ॉन्ट में नहीं है या आप पहले में सही फ़ॉन्ट एन्कोडिंग का उपयोग नहीं कर रहे हैं जगह।

यह दिखाने के लिए एक न्यूनतम उदाहरण है कि कैसे कुछ UTF8 वर्णों को एक LaTeX दस्तावेज़ में उपयोग किया जा सकता है:

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

[Utf8x] एन्कोडिंग के साथ आपके पास अधिक भाग्य हो सकता है, लेकिन थोड़ा चेतावनी दें कि यह अब समर्थित नहीं है और कुछ idiosyncrasies की तुलना में [utf8] (जहाँ तक मुझे याद है; यह थोड़ी देर से है क्योंकि मैंने इसे देखा है)। लेकिन अगर यह चाल है, तो यह सब आपके लिए मायने रखता है।


3

@ चिह्न का अर्थ है कि फ़ाइल में विशेषताएँ विस्तारित हैंxattr fileयह दिखाता है कि इसमें क्या विशेषताएँ हैं, xattr -l fileविशेषता मान भी दिखाता है (जो कभी-कभी बड़े हो सकते हैं - उदाहरण के xattr /System/Library/Fonts/HelveLTMMलिए संसाधन-फोर्क में मौजूद पुरानी शैली का फ़ॉन्ट देखने की कोशिश करें )।


2

file myfile.texएक टर्मिनल में टाइपिंग कभी-कभी एल्गोरिदम और मैजिक नंबरों की एक श्रृंखला का उपयोग करके आपको एन्कोडिंग और प्रकार की फ़ाइल बता सकती है। यह काफी उपयोगी है, लेकिन ठोस या विश्वसनीय जानकारी प्रदान करने पर निर्भर नहीं है।

एक Localizable.stringsफ़ाइल (स्थानीय मैक ओएस एक्स अनुप्रयोगों में पाया जाता है) आमतौर पर एक यूटीएफ -16 सी स्रोत फ़ाइल होने की सूचना है।


1

इसे संक्षिप्त करें! ICU लाइब्रेरी ऑफ़र के सभी एन्कोडिंग में पाठ या बाइट्स की तुलना करने की अनुमति देता है । उस सुविधा का उपयोग करके आप आमतौर पर तुरंत देखते हैं कि कौन सा कोड पृष्ठ आपके डेटा के लिए समझ में आता है।


1

आप फ़ाइल को फ़ायरफ़ॉक्स विंडो में लोड करने का प्रयास कर सकते हैं, फिर व्यू - कैरेक्टर एन्कोडिंग पर जाएं। फ़ाइल के एन्कोडिंग प्रकार के बगल में एक चेक मार्क होना चाहिए।


0

आप किस लाटेकस का उपयोग कर रहे हैं? जब मैं टीटीईएक्स का उपयोग कर रहा था, तो मुझे मैन्युअल रूप से यूनीकोड पैकेज डाउनलोड करना होगा और इसे अपनी। नेट फ़ाइलों में जोड़ना होगा:

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

अब, मैंने TeXlive 2008 पैकेज ( यहां ) से XeTeX पर स्विच किया है , यह और भी सरल है:

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

फ़ाइल के एन्कोडिंग का पता लगाने के लिए, आप file(1)(लेकिन यह सीमित है) के साथ खेल सकते हैं, लेकिन जैसा कि किसी और ने कहा, यह मुश्किल है।


0

एन्कोडिंग की जांच करने का एक जानवर-बल तरीका सिर्फ हेक्स संपादक या इसी तरह की फ़ाइल की जांच करना हो सकता है। (या जांचने के लिए एक कार्यक्रम लिखें) फ़ाइल में बाइनरी डेटा को देखें। UTF-8 प्रारूप को पहचानना काफी आसान है। सभी ASCII वर्ण 128 (0x80) से नीचे के मूल्यों के साथ एकल बाइट्स हैं। मल्टीबायट अनुक्रम विकि लेख में दिखाए गए पैटर्न का पालन करते हैं।

यदि आप अपने लिए एन्कोडिंग को सत्यापित करने के लिए एक प्रोग्राम प्राप्त करने के लिए एक सरल तरीका पा सकते हैं, तो यह स्पष्ट रूप से एक शॉर्टकट है, लेकिन यदि बाकी सभी विफल हो जाते हैं, तो यह चाल चलेगा।


0

मैंने नीचे बैश स्क्रिप्ट को लागू किया, यह मेरे लिए काम करता है।

यह पहले iconvएन्कोडिंग से वापस आने की कोशिश करता file --mime-encodingहै utf-8

यदि वह विफल हो जाता है, तो यह सभी एन्कोडिंग के माध्यम से जाता है और मूल और पुनः एन्कोडेड फ़ाइल के बीच के अंतर को दिखाता है। यह उन एन्कोडिंग्स पर छोड़ देता है जो एक बड़े अंतर वाले आउटपुट ("बड़े" को 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.