ওএস এক্সে ফাইল এনকোডিং কীভাবে নির্ধারণ করব?


170

আমি টেক্সটমেটের একটি ল্যাটেক্স ফাইলে কিছু ইউটিএফ -8 অক্ষর প্রবেশ করানোর চেষ্টা করছি (যার মতে এটির ডিফল্ট এনকোডিংটি ইউটিএফ -8), তবে ল্যাটেক্স সেগুলি বুঝতে পারে বলে মনে হয় না।

cat my_file.texটার্মিনালে চলমান অক্ষরগুলি সঠিকভাবে দেখায়। রানিং ls -alএমন কিছু দেখায় যা আমি আগে কখনও দেখিনি: ফাইল তালিকার দ্বারা একটি "@":

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

(এবং, হ্যাঁ, আমি \usepackage[utf8]{inputenc}লটেক্সে ব্যবহার করছি ))

আমি খুঁজে পেয়েছি iconv, তবে এটি এনকোডিং কী তা আমাকে বলতে সক্ষম হতে পারে বলে মনে হচ্ছে না - এটি সনাক্ত করার পরে এটি কেবল রূপান্তরিত হবে।


আমার অভিজ্ঞতায় ফাইল (1) কমান্ড একটি ফাইলের এনকোডিং অনুমান করতে সর্বদা বেশ ভাল ছিল। ফাইলের com.apple.Txtxt এনকোডিং প্রসারিত বৈশিষ্ট্যটি ব্যবহার করার জন্য এটি যথেষ্ট স্মার্ট কিনা আমি জানি না।
এডওয়ার্ড ফালক

উত্তর:


33

এর @অর্থ ফাইলটির সাথে সম্পর্কিত ফাইলের বৈশিষ্ট্যগুলি প্রসারিত হয়েছে। আপনি getxattr()ফাংশনটি ব্যবহার করে তাদের জিজ্ঞাসা করতে পারেন ।

কোনও ফাইলের এনকোডিং সনাক্ত করার জন্য কোনও নির্দিষ্ট উপায় নেই। এই উত্তরটি পড়ুন , এটি কেন তা ব্যাখ্যা করে।

একটি কমান্ড লাইনের সরঞ্জাম আছে, এনকা , যা এনকোডিংটি অনুমান করার চেষ্টা করে। আপনি এটি পরীক্ষা করে দেখতে চাইবেন।


1
আমি ধরে নিচ্ছিলাম যে ওএসএক্স মেটা ডেটা হিসাবে এনকোডিংটি সঞ্চয় করেছে। আমি বুঝেছি ফাইলের বিষয়বস্তুগুলি কেবল বিটের ক্লাস্টার এবং কোনও সহজাত এনকোডিং নেই।
জেমস এ রোজেন

1
@ জেমসএ.রোজেন ওএস এক্স অ্যাপ্লিকেশন যেমন টেক্সটএডিট ফাইলের এনকোডিংকে একটি গুণ হিসাবে চিহ্নিত করে (নাম "com.apple.TextEncoding")। এটি সম্ভবত সম্ভবত এর দ্বারা নির্দেশিত বৈশিষ্ট্যগুলিতে @ফাইল এনকোডিং বৈশিষ্ট্য অন্তর্ভুক্ত। আপনি যদি কমান্ডটি xattr -p com.apple.TextEncoding <filename>এনকোডিং বৈশিষ্ট্যটি উপস্থিত থাকে তা দেখতে ব্যবহার করতে পারেন ।
bames53

1
আপনি কীভাবে getxattr ব্যবহার করবেন তা ব্যাখ্যা করতে পারেন? আমি এটি ব্যবহার করতে সক্ষম নই।
মেভি

1
আপনি যদি কোনও প্রোগ্রাম লিখতে চান তবে এটি একটি ফাংশন কল। কমান্ড লাইন থেকে, ls -l@ <filename>ফাইলের জন্য কী কী বৈশিষ্ট্য সেট করা আছে তা দেখতে কেবল টাইপ করুন। আসল বৈশিষ্ট্যটি দেখতে, টাইপ করুনxattr -p com.apple.TextEncoding <filename>
এডওয়ার্ড ফাল্ক

পেতে encaনা brew install encaএবং আপনি ভাষা নির্দিষ্ট করতে হবে কিন্তু কেউ কাজ করে, তাই:enca FILENAME -L __
শেন

433

ব্যবহার -I(ক হাতের I যে) ফাইল কমান্ড বিকল্পটি ফাইল এনকোডিং দেন বলে মনে হয়।

file -I {filename}

58
আমার -আই ব্যবহার করতে হবে
কেসব্যাশ

7
এই ফাংশনটি ASCII এবং UTF-8 এর মধ্যে পার্থক্য বলতে অক্ষম বলে মনে হয়েছে (বেশিরভাগ মার্কিন অক্ষরের জন্য তারা একই রকম মনে হয় তবে সমস্ত নয়, সম্ভবত এমন কিছু যা ইউনিকোড বিট সনাক্ত করতে পারে)
BadPirate

14
ASCII এবং UTF8 একরকম না হয় যদি না ফাইলে অক্সএফএফের বাইরে কোনও অক্ষর বা কোনও বিওএম থাকে।
ডেভিডটবার্নাল

3
file -I *আমার জন্য (ওএসএক্স) পুরোপুরি কাজ করে বলে মনে হচ্ছে। একটি সিস্টেম অনেকগুলি ফাইলের এনকোডিং সম্পর্কে অভিযোগ করেছে, কোনটি নির্দিষ্ট না করে। সমস্ত ফাইল অ্যাসিই ছিল, এক ব্যতীত যা utf-8 ছিল। সম্ভবত অপরাধী।
এমসিভি

1
@ নোটজিম এটি ভুল। ASCII কেবল 0x7F এর মাধ্যমে সংজ্ঞায়িত করা হয় সুতরাং যে বিন্দু অতিক্রম কিছু স্পষ্টভাবে ASCII নয়। ইউনিকোড এবং ল্যাটিন -১ এর 0x80-0xFF তে একই কোড পয়েন্ট রয়েছে তবে ইউনিকোডের কোনও সাধারণ এনকোডিং নেই যা লাতিন -1 এর অনুরূপ (কারণ এটি অন্তর্নিহিতভাবে 8 বিটের মধ্যে সীমাবদ্ধ থাকবে, যা ইউনিকোডের তুলনায় খুব কম)।
ট্রিপলি

56

ম্যাক ওএস এক্স-এ কমান্ড file -I(মূলধন i) আপনাকে যথাযথ চরিত্র সেট দেবে যতক্ষণ আপনি পরীক্ষা করছেন যে ফাইলটিতে বেসিক ASCII ব্যাপ্তির বাইরে অক্ষর রয়েছে।

উদাহরণস্বরূপ আপনি যদি টার্মিনালে যান এবং কোনও ফাইল তৈরি করতে vi ব্যবহার করেন। vi test.txt তারপরে কিছু অক্ষর sertোকান এবং একটি উচ্চারণকৃত অক্ষর অন্তর্ভুক্ত করুন (ALT-e এর পরে e অনুসরণ করুন) তারপরে ফাইলটি সংরক্ষণ করুন।

এগুলি টাইপ করে file -I text.txtএবং আপনার ফলাফলটি এমনভাবে পাওয়া উচিত:

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


3
আমি ফাইলের সামগ্রীর উপর নির্ভর করে ওএস এক্স কেস, চরসেট = ইউএস-এসকি বা চারসেট = উত্স -8 নিশ্চিত করতে পারি
বেন

তবে এটি কেবলমাত্র ফাইলটির প্রথম কয়েক কেবি তাকান বলে মনে হচ্ছে। আমার ক্ষেত্রে এ তেজ কমান্ড stackoverflow.com/a/33644535/161022 সঠিকভাবে UTF-8 হিসাবে ফাইল চিহ্নিত যেহেতু fileকমান্ড তার দাবিus-ascii
lmsurprenant

প্রকৃতপক্ষে, এটি প্রদর্শিত হয় যে ফাইলটি কার্যকারিতার কারণে চিট করে। আমি কেবল উবুন্টুতে একটি 3 এমবি এএসসিআইআই ফাইল তৈরি করেছি এবং শেষ পর্যন্ত কয়েকটি ইউটিএফ -8 অক্ষর যুক্ত করেছি এবং এটি এখনও ASCII কে ইউটিএফ -8 নয় বলে প্রতিবেদন করেছে। আমি-কে বিকল্পটি চেষ্টা করে দেখছি (চালিয়ে যেতে হবে) তবে তারপরে এটি "ইউটিএফ -8" নয় "ডেটা" প্রতিবেদন করে তবে এখনও কোনও ভাল হয় না।
ক্লাউডরঞ্জার

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

আমার বাশ কনফিগারেশনে কোথাও অ্যালাইজড

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

সুতরাং আমি শুধু টাইপ

vic {filename}

আমার ভ্যানিলা ওএসএক্স ইয়োসেমাইটে এটি "ফাইল -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" দিয়েছিল। যদিও, আমাকে ব্যাকস্ল্যাশগুলি সরিয়ে ফেলতে হয়েছিল।
কেটি লাভাল্লি

অনেক ধন্যবাদ, আমি ব্যাকস্ল্যাশগুলি সরিয়েছি।
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 বলছেন বিষয়গুলি যদি নিয়মিত ফাইল হয় তবে শ্রেণিবদ্ধ করবেন না। -আমি - মাইমের সমতুল্য যা মাইম টাইপের স্ট্রিংগুলিকে আউটপুট করে। অসক্স সরঞ্জামগুলি স্ট্যান্ডার্ড লিনাক্স সরঞ্জামগুলির থেকে পৃথকভাবে আচরণ করে।
বোকা মুনকি

ওয়েল, একটি উইন্ডোজের জন্য 1252 এনকোডযুক্ত ফাইলটি file -Iআমাকে পেয়ে যায় text/plain; charset=unknown-8bit। যদিও এটা একটি UTF8 ফাইলের জন্য ভাল কাজ করে: text/plain; charset=utf-8
MiB

8

-I বিকল্পের পরিবর্তে বিকল্প (উদাহরণস্বরূপ ) fileদিয়ে কমান্ড ব্যবহার করা ওএস এক্সে কাজ করে এবং মাইম টাইপ "টেক্সট / প্লেইন" বাদ দেওয়ার অতিরিক্ত সুবিধা রয়েছে যা আপনি সম্ভবত জানেন না।--mime-encodingfile --mime-encoding some_file.txt


ls -l @ a বর্ধিত বৈশিষ্ট্য প্রদর্শন করবে । ইয়োসেমাইটে এলএসের জন্য ম্যান পৃষ্ঠাটি দেখছি, আমি কোনও - মাইম-এনকোডিং বিকল্প দেখতে পাচ্ছি না।
স্টারহাউস

আপনি fileআদেশ সম্পর্কে কথা বলছিলেন । জানতেন না যে একজনের অস্তিত্ব আছে। অনভিজ্ঞ. যাই হোক। ডাউনভোট সম্পর্কে দুঃখিত কেউ যদি এই উত্তরটি সম্পাদনা না করে তবে আমাকে এটিকে পূর্বাবস্থায় ফেরাতে দেবে না।
স্টারহাউস 18

4

ক্লাসিক 8-বিট ল্যাটেক্স অত্যন্ত সীমাবদ্ধ যা এতে ইউটিএফ 8 অক্ষর ব্যবহার করতে পারে; এটি আপনি যে ফন্টটি ব্যবহার করছেন তা এনকোডিং এবং যে ফন্টের ফন্টটি উপলব্ধ রয়েছে তা নির্ভর করে।

যেহেতু আপনি কোনও নির্দিষ্ট উদাহরণ দেন না, সমস্যাটি ঠিক কোথায় তা জানা শক্ত - আপনি যদি আপনার ফন্টের কোনও গ্লিফ ব্যবহার করার চেষ্টা করছেন বা আপনি প্রথমে সঠিক ফন্ট এনকোডিং ব্যবহার করছেন না কিনা জায়গা।

একটি ল্যাটেক্স ডকুমেন্টে কয়েকটি ইউটিএফ 8 অক্ষর কীভাবে ব্যবহার করা যেতে পারে তা দেখানোর জন্য এখানে একটি নূন্যতম উদাহরণ রয়েছে:

\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ফাইল (স্থানীয়ীকৃত ম্যাক ওএস এক্স অ্যাপ্লিকেশনগুলিতে পাওয়া যায়) সাধারণত একটি ইউটিএফ -16 সি উত্স ফাইল হিসাবে রিপোর্ট করা হয়।


1

সিনলেজ! আইসিইউ লাইব্রেরী অফার করে সমস্ত এনকোডিংগুলিতে পাঠ্য বা বাইটগুলি তুলনা করতে দেয় । এই বৈশিষ্ট্যটি ব্যবহার করে আপনি সাধারণত তাত্ক্ষণিকভাবে দেখতে পাবেন কোন কোড পৃষ্ঠাটি আপনার ডেটার জন্য অর্থবোধ করে।


1

আপনি ফায়ারফক্স উইন্ডোতে ফাইলটি লোড করার চেষ্টা করতে পারেন তারপরে দেখুন - চরিত্রের এনকোডিংয়ে। ফাইলের এনকোডিং ধরণের পাশে একটি চেক চিহ্ন থাকা উচিত।


0

আপনি কোন ল্যাটেক্স ব্যবহার করছেন? আমি যখন টেটেক্স ব্যবহার করছিলাম তখন আমাকে ইউনিকোড প্যাকেজটি ম্যানুয়ালি ডাউনলোড করতে হয়েছিল এবং এটি আমার .tex ফাইলগুলিতে যুক্ত করতে হয়েছিল:

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

এখন, আমি টেক্সলাইভ ২০০৮ প্যাকেজ ( এখানে ) থেকে জেটেক্সে স্যুইচ করেছি , এটি আরও সহজ:

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

কোনও ফাইলের এনকোডিং সনাক্তকরণের জন্য, আপনি খেলতে পারেন file(1)(তবে এটি বরং সীমাবদ্ধ) তবে অন্য কেউ যেমন বলেছেন, এটি কঠিন।


0

এনকোডিং যাচাই করার জন্য একটি শক্তিশালী উপায় হ্যাক্স সম্পাদক বা অনুরূপ ফাইলটিতে ফাইল পরীক্ষা করা হতে পারে। (বা পরীক্ষা করার জন্য একটি প্রোগ্রাম লিখুন) ফাইলের বাইনারি ডেটা দেখুন। ইউটিএফ -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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.