चरित्र सेट के बीच पाठ फ़ाइलों को परिवर्तित करने का सबसे अच्छा तरीका?


526

चरित्र सेट के बीच पाठ फ़ाइलों को परिवर्तित करने के लिए सबसे तेज़, सबसे आसान उपकरण या विधि क्या है?

विशेष रूप से, मुझे UTF-8 से ISO-8859-15 में बदलना होगा और इसके विपरीत।

सब कुछ चला जाता है: आपकी पसंदीदा स्क्रिप्टिंग भाषा, ओएस, वेब साइटों, आदि के लिए कमांड-लाइन टूल या अन्य उपयोगिताओं में एक-लाइनर।

अब तक के सर्वश्रेष्ठ समाधान:

लिनक्स / यूनिक्स / ओएस एक्स / साइबर पर:

  • ट्रून्स अरविन द्वारा सुझाए गए ग्नू आइकनव को एक फिल्टर के रूप में सबसे अच्छा उपयोग किया जाता है । यह सार्वभौमिक रूप से उपलब्ध लगता है। उदाहरण:

    $ iconv -f UTF-8 -t ISO-8859-15 in.txt > out.txt
    

    जैसा कि बेन ने कहा है , आइकॉन का उपयोग करने वाला एक ऑनलाइन कनवर्टर है

  • Gnu recode ( मैनुअल ) ने सुझाव दिया Cheekysoft में परिवर्तित कर देंगे यथा-स्थान एक या कई फ़ाइलें । उदाहरण:

    $ recode UTF8..ISO-8859-15 in.txt
    

    यह एक छोटे उपनाम का उपयोग करता है:

    $ recode utf8..l9 in.txt
    

    Recode उन सतहों का भी समर्थन करता है जिनका उपयोग विभिन्न प्रकार के अंत प्रकारों और एन्कोडिंगों के बीच परिवर्तित करने के लिए किया जा सकता है:

    LF (यूनिक्स) से CR-LF (DOS) में नई रूपरेखाएँ बदलें:

    $ recode ../CR-LF in.txt
    

    बेस 64 एनकोड फाइल:

    $ recode ../Base64 in.txt
    

    आप उन्हें भी जोड़ सकते हैं।

    बेस 64 एनकोडेड UTF8 फाइल को यूनिक्स लाइन एंडिंग के साथ बेस 64 में इनकोडेड लैटिन 1 फाइल के साथ डॉस लाइन एंडिंग्स में कनवर्ट करें:

    $ recode utf8/Base64..l1/CR-LF/Base64 file.txt
    

Powershell ( Jay Bazuzi ) के साथ विंडोज पर :

  • PS C:\> gc -en utf8 in.txt | Out-File -en ascii out.txt

    (हालांकि, कोई आईएसओ-8859-15 समर्थन नहीं करता है; यह कहता है कि समर्थित चार्ट्स यूनिकोड, यूटीएफ 7, यूटीएफ 8, यूटीएफ 32, एससीआई, बिगेंडियन्यूनिकोड, डिफॉल्ट और ओईएम हैं।)

संपादित करें

क्या आपका मतलब iso-8859-1 का समर्थन है? "स्ट्रिंग" का उपयोग यह इसके विपरीत के लिए करता है

gc -en string in.txt | Out-File -en utf8 out.txt

नोट: संभावित गणना मूल्य "अज्ञात, स्ट्रिंग, यूनिकोड, बाइट, बिगइंडियन यूनिकोड, यूटीएफ 8, यूटीएफ 7, एससीआई" हैं।


मैंने कोशिश की, gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlलेकिन यह फ़ाइल को utf-8 में कनवर्ट करता है, लेकिन फिर यह खाली है! नोटपैड ++ का कहना है कि फ़ाइल Ansi- प्रारूप है, लेकिन पढ़ने के रूप में मैं समझता हूँ कि यह भी एक वैध charset नहीं है ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE

2
बस इससे संबंधित प्रश्न के उत्तर की तलाश में आओ - महान सारांश! बस यह सोचा गया था कि यह recodeएक फिल्टर के रूप में काम करेगा साथ ही अगर आप इसे किसी भी फाइलनाम से नहीं पास करते हैं, जैसे:recode utf8..l9 < in.txt > out.txt
Jez

iconv.com/iconv.htm मेरे लिए जानलेवा लगता है? (टाइमआउट)
एंड्रयू न्यूबी

2
यदि आप उपयोग करते हैं enca, तो आपको इनपुट एन्कोडिंग निर्दिष्ट करने की आवश्यकता नहीं है। यह अक्सर भाषा को निर्दिष्ट करने के लिए पर्याप्त है enca -L ru -x utf8 FILE.TXT:।
अलेक्जेंडर पॉज़्नव जूल

1
दरअसल, iconv एक फिल्टर के बजाय इन-प्लेस कनवर्टर के रूप में बहुत बेहतर काम करता था। iconv -f UTF-32 -t UTF-8 input.csv > output.csvकेवल एक तिहाई, केवल सात सौ हजार लाइनों को बचाने के लिए 2 मिलियन से अधिक लाइनों के साथ एक फ़ाइल परिवर्तित करना । इन-प्लेस संस्करण का उपयोग करके iconv -f UTF-32 -t UTF-8 file.csvसभी 2 मिलियन से अधिक लाइनों को सफलतापूर्वक परिवर्तित किया गया।
निकोलेय Nic

जवाबों:


246

स्टैंड-अलोन यूटिलिटी अप्रोच

iconv -f ISO-8859-1 -t UTF-8 in.txt > out.txt
-f ENCODING  the encoding of the input
-t ENCODING  the encoding of the output

आपको इनमें से किसी भी तर्क को निर्दिष्ट करने की आवश्यकता नहीं है। वे आपके वर्तमान स्थान के लिए डिफ़ॉल्ट होंगे, जो आमतौर पर UTF-8 है।


4
किसी अन्य व्यक्ति के लिए जो गैर-डैश संस्करणों के अनुपलब्ध होने की कोशिश कर रहा है, यह OSX की तरह दिखता है (और संभवतः सभी BSD) iconv के संस्करण विभिन्न UTF- * एन्कोडिंग के लिए गैर-डैश उपनामों का समर्थन नहीं करते हैं। iconv -l | grep UTFआपको यूटीएफ से संबंधित सभी एन्कोडिंग बताएंगे कि आपके प्रतीक की प्रति समर्थन करती है।
coredumperror

14
आपकी इनपुट फ़ाइल के एन्कोडिंग को नहीं जानते? chardet in.txtएक सर्वश्रेष्ठ अनुमान उत्पन्न करने के लिए उपयोग करें । परिणाम को ENCODING के रूप में उपयोग किया जा सकता है iconv -f ENCODING
स्टू

4
अमान्य वर्णों ( illegal input sequence at positionसंदेशों से बचने ) पर बाहर निकलने से रोकें , और "अजीब" वर्णों को "समान" वर्णों से बदलें iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt:।
11

मुझे यह पसंद है क्योंकि यह अधिकांश NIX प्लेटफार्मों पर मानक है। लेकिन नीचे VIM कमांड विकल्प (अन्य नाम ex) भी देखें । अतिरिक्त जानकारी: (1) आप (शायद) के -fसाथ (से) विकल्प निर्दिष्ट करने की आवश्यकता नहीं है iconv। (2) file --mime-encoding <file/s>कमांड आपको पहले स्थान पर एन्कोडिंग का पता लगाने में मदद कर सकता है।
fr13d

1
FWIW fileकमांड ने UTF-16 लिटिल एंडियन के रूप में मेरे स्रोत की सूचना दी; रनिंग ने iconv -f UTF-16 -t UTF-8...इसे गलत तरीके से ASCII में बदल दिया, मुझे स्पष्ट रूप iconv -f UTF-16LE...से UTF-8
प्लेटो

90

VIM आज़माएं

यदि आपके पास है तो vimआप इसका उपयोग कर सकते हैं:

हर एन्कोडिंग के लिए परीक्षण नहीं किया गया।

इस बारे में अच्छा हिस्सा यह है कि आपको स्रोत एन्कोडिंग का पता नहीं है

vim +"set nobomb | set fenc=utf8 | x" filename.txt

ज्ञात हो कि यह कमांड सीधे फाइल को संशोधित करता है


स्पष्टीकरण भाग!

  1. +: फ़ाइल खोलते समय सीधे कमांड दर्ज करने के लिए vim द्वारा उपयोग किया जाता है। Usualy एक विशिष्ट लाइन पर एक फ़ाइल खोलने के लिए उपयोग किया जाता है:vim +14 file.txt
  2. |: कई कमांडों का विभाजक (जैसे ;बैश में)
  3. set nobomb : कोई utf-8 BOM नहीं
  4. set fenc=utf8: Utf-8 doc लिंक पर नई एन्कोडिंग सेट करें
  5. x : फ़ाइल सहेजें और बंद करें
  6. filename.txt : फ़ाइल का पथ
  7. ": क्यू पाइप के कारण यहां हैं। (अन्यथा बैश उन्हें बश पाइप के रूप में उपयोग करेगा)

शांत, लेकिन कुछ हद तक धीमा। क्या एक बार में कई फ़ाइलों को परिवर्तित करने के लिए इसे बदलने का एक तरीका है (इस प्रकार विम की आरंभीकरण लागत पर बचत)?
डोमक्यू

समझाने के लिए शुक्रिया! जब तक मैं बम / नोबॉम्ब सेटिंग के बारे में नहीं पढ़ता, मुझे फ़ाइल की शुरुआत के साथ एक मुश्किल समय हो रहा था।
jjwdesign

1
np, अतिरिक्त यदि आप उपयोग करते हैं तो बम को देख सकते हैं vim -bयाhead file.txt|cat -e
Boop करें

1
उदाहरण के लिए:find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | set fenc=utf8 | x' {} \;
गेब्रियल

मैंने इसका उपयोग CSV फ़ाइलों के एन्कोडिंग को बदलने के लिए किया था और जब मैंने देखा कि वास्तव में चार्ट वास्तव में बदल गया था, तो मैं बहुत उत्साहित था। दुर्भाग्य से, जब मैं फ़ाइल को MySQL में लोड करने के लिए गया था, तो उसके पास विम कमांड चलाने से पहले पहले की तुलना में कॉलम की एक अलग संख्या थी। आश्चर्य है कि क्या फ़ाइल को खोलना, एन्कोडिंग को परिवर्तित करना और फ़ाइल को सहेजना / बंद करना संभव होगा जबकि अन्य सभी फ़ाइल सामग्री को एक ही छोड़ दें?
नाइटऑवलप्रगम 15

39

लिनक्स के तहत आप विभिन्न चार्जसेट के साथ-साथ किसी भी लाइन एंडिंग मुद्दों के बीच रूपांतरण करने की कोशिश करने के लिए बहुत शक्तिशाली रीकोड कमांड का उपयोग कर सकते हैं। recode -l आपको उन सभी प्रारूपों और एन्कोडिंग को दिखाएगा जो उपकरण के बीच परिवर्तित हो सकते हैं। यह एक बहुत लंबी सूची होने की संभावना है।


आप कैसे परिवर्तित करते हैं LF? वहाँ है /CRऔर /CR-LFलेकिन नहीं/LF
हारून फ्रेंक


20
Get-Content -Encoding UTF8 FILE-UTF8.TXT | Out-File -Encoding UTF7 FILE-UTF7.TXT

सबसे छोटा संस्करण, यदि आप मान सकते हैं कि इनपुट BOM सही है:

gc FILE.TXT | Out-File -en utf7 file-utf7.txt

1
यहाँ एक छोटा संस्करण है जो बेहतर काम करता है। gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
लैरी बैटल

@LarryBattle: इससे Set-Contentबेहतर काम कैसे होता है Out-File?
जय बज़ुजी

... ओह। मुझे लगता है कि वे लगभग एक ही बात कर रहे हैं। मुझे आपके उदाहरण को चलाने में परेशानी हुई क्योंकि मैं यह मान रहा था कि दोनों संस्करण file-utf8.txtइनपुट के लिए एक ही फाइल का उपयोग कर रहे थे क्योंकि उन दोनों की आउटपुट फाइल समान थी file-utf7.txt
लैरी बैटल

यह वास्तव में बहुत अच्छा होगा, सिवाय इसके कि यह UTF16 का समर्थन नहीं करता है। यह UTF32 का समर्थन करता है, लेकिन UTF16 का नहीं! मुझे फ़ाइलों को परिवर्तित करने की आवश्यकता नहीं होगी, सिवाय इसके कि बहुत सारे Microsoft सॉफ़्टवेयर (fe SQL सर्वर bcp) UTF16 पर जोर देते हैं - और फिर उनकी उपयोगिता इसे परिवर्तित नहीं करेगी। बस इतना ही कहना है कि बहुत रोचक है।
नूह

मैंने कोशिश की, gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlलेकिन यह फ़ाइल को utf-8 में कनवर्ट करता है, लेकिन फिर यह खाली है! नोटपैड ++ का कहना है कि फ़ाइल Ansi- प्रारूप है, लेकिन पढ़ने के रूप में मैं समझता हूँ कि यह भी एक वैध charset नहीं है ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE

16

Iconv बैश फ़ंक्शन आज़माएँ

मैंने इसमें डाल दिया है .bashrc:

utf8()
{
    iconv -f ISO-8859-1 -t UTF-8 $1 > $1.tmp
    rm $1
    mv $1.tmp $1
}

.. तो जैसे फ़ाइलों को परिवर्तित करने में सक्षम हो:

utf8 MyClass.java

8
अस्थायी फ़ाइल बनाने के लिए tmp = $ (mktmp) का उपयोग करना बेहतर शैली है। इसके अलावा, आरएम के साथ लाइन बेमानी है।
LMZ

1
क्या आप इस फ़ंक्शन को ऑटो डिटेक्ट इनपुट प्रारूप के साथ पूरा कर सकते हैं?
मालीब्रे

3
खबरदार, यह फंक्शन इनपुट फाइल को यह सत्यापित किए बिना हटा देता है कि iconv कॉल सफल हुई।
दर्शनकाल

इससे टेक्स्ट फ़ाइल की सामग्री बदल जाती है। मैंने इसे BOM फ़ाइल के बिना UTF-8 से बाहर निकलने की उम्मीद के साथ BOM के साथ UTF-8 पर चलाया, लेकिन यह फ़ाइल के आरंभ में ही चल निकला ।
एरोन फ्रेंके

14

नोटपैड ++ आज़माएं

विंडोज पर मैं ISO-8859-1 से UTF-8 में रूपांतरण करने के लिए नोटपैड ++ का उपयोग करने में सक्षम था । क्लिक करें "Encoding"और फिर "Convert to UTF-8"


13

ओनलाइनर ने ऑटोमैटिक कैरेक्टर सेट डिटेक्शन के साथ फाइंड का उपयोग किया

सभी मिलान पाठ फ़ाइलों का वर्ण एन्कोडिंग स्वचालित रूप से पता लगाया जाता है और सभी मिलान पाठ फ़ाइलों को utf-8एन्कोडिंग में बदल दिया जाता है :

$ find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 -o converted "$1" && mv converted "$1"' -- {} \;

इन चरणों को करने के लिए, एक उप-शेल shका उपयोग किया जाता है -exec, -cध्वज के साथ एक-लाइनर को चलाने के लिए , और इसके "$1"साथ स्थित तर्क के रूप में फ़ाइल नाम को पारित करना -- {}। बीच में, utf-8आउटपुट फ़ाइल अस्थायी रूप से नामित होती है converted

जिससे file -biइसका मतलब है:

  • -b, --brief उत्पादन लाइनों (संक्षिप्त मोड) के लिए फ़ाइल नाम न दें।

  • -i, --mime अधिक पारंपरिक मानव पठनीय लोगों के बजाय माइम प्रकार के तारों को आउटपुट करने के लिए फ़ाइल कमांड का कारण बनता है। इस प्रकार यह उदाहरण के text/plain; charset=us-asciiबजाय कह सकता है ASCII textsedकेवल करने के लिए आदेश में कटौती इस us-asciiरूप के लिए आवश्यक है iconv

findआदेश में इस तरह के फ़ाइल प्रबंधन स्वचालन के लिए बहुत उपयोगी है। यहाँ के लिए क्लिक करें अधिक findबहुतायत


3
मुझे मैक ओएस एक्स पर काम करने के लिए इस समाधान को थोड़ा अनुकूलित करना पड़ा, कम से कम मेरे संस्करण पर। find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -b --mime-encoding "$1" | awk "{print toupper(\$0)}") -t UTF-8 > converted "$1" && mv converted "$1"' -- {} \;
ब्रायन जे। मिलर

1
आपका कोड विंडोज 7 पर MinGW-w64 (नवीनतम संस्करण) के साथ भी काम करता है। इसे साझा करने के लिए धन्यवाद!
सिल्विओप्रोग

@rmuller sedकमांड एन्कोडिंग है, जिससे कैरेक्टर एन्कोडिंग की स्वचालित पहचान संभव है। मैंने अब इसे समझाने के लिए उत्तर का विस्तार किया है। यह किसी भी शेष अप्रासंगिक टिप्पणियों को हटाने के लिए पाठक के संबंध में विनम्र होगा। धन्यवाद।
सर्ज स्ट्रोबंड्ट

@SergeStroobandt शायद मैं पर्याप्त स्पष्ट नहीं था। मेरी बात यह है कि जब आप "फ़ाइल -बी" के बजाय "फ़ाइल -b - माइम-एन्कोडिंग" का उपयोग करते हैं, तो सीड के साथ परिणाम को फ़िल्टर करने की कोई आवश्यकता नहीं है। यह कमांड फ़ाइल एन्कोडिंग को पहले ही लौटा देती है। तो आपके उदाहरण में "us-ascii"
rmuller

यह वास्तव में लिनक्स पर मेरे लिए कुछ भी करने के लिए प्रतीत नहीं होता है। मैंने बीओएम के साथ एक फाइल को यूटीएफ -8 के रूप में सहेजा और उम्मीद की कि यह बिना बीओएम के यूटीएफ -8 में बदल जाएगी और ऐसा नहीं हुआ।
एरोन फ्रेंके

3

PHP iconv ()

iconv("UTF-8", "ISO-8859-15", $input);


1
यह कथन स्ट्रिंग्स को परिवर्तित करते समय बहुत अच्छा काम करता है, लेकिन फाइलों के लिए नहीं।
jjwdesign

2

डॉस / विंडोज: कोड पेज का उपयोग करें

chcp 65001>NUL
type ascii.txt > unicode.txt

chcpकोड पेज को बदलने के लिए कमांड का उपयोग किया जा सकता है। कोड पृष्ठ 65001 UTF-8 का Microsoft नाम है। कोड पेज सेट करने के बाद, निम्न कमांड द्वारा उत्पन्न आउटपुट कोड पेज सेट का होगा।


1

गुण फ़ाइल (जावा) लिखने के लिए आम तौर पर मैं इसे linux (टकसाल और ubuntu वितरण) में उपयोग करता हूं:

$ native2ascii filename.properties

उदाहरण के लिए:

$ cat test.properties 
first=Execução número um
second=Execução número dois

$ native2ascii test.properties 
first=Execu\u00e7\u00e3o n\u00famero um
second=Execu\u00e7\u00e3o n\u00famero dois

पुनश्च: मैंने विशेष पात्रों को मजबूर करने के लिए पोर्टेग्यूशंस में एक्ज़ेक्यूशन नंबर एक / दो लिखा।

मेरे मामले में, पहले निष्पादन में मुझे यह संदेश मिला:

$ native2ascii teste.txt 
The program 'native2ascii' can be found in the following packages:
 * gcj-5-jdk
 * openjdk-8-jdk-headless
 * gcj-4.8-jdk
 * gcj-4.9-jdk
Try: sudo apt install <selected package>

जब मैंने पहला विकल्प (gcj-5-jdk) स्थापित किया तो समस्या समाप्त हो गई।

मुझे उम्मीद है कि यह किसी की मदद करेगा।




0

इसके लिए मेरा पसंदीदा उपकरण जेडिट (एक जावा आधारित पाठ संपादक) है जिसमें दो बहुत ही सुविधाजनक विशेषताएं हैं:

  • एक जो उपयोगकर्ता को एक अलग एन्कोडिंग के साथ एक पाठ को फिर से लोड करने में सक्षम बनाता है (और, जैसे, नेत्रहीन परिणाम को नियंत्रित करने के लिए)
  • एक और जो उपयोगकर्ता को बचत करने से पहले एन्कोडिंग (और लाइन चार्ट के अंत) को स्पष्ट रूप से चुनने में सक्षम बनाता है

0

बस स्थिति फ़ाइल के दाईं ओर स्थित IntelliJ IDEA IDE में लोड की गई फ़ाइल की एन्कोडिंग को बदलें, जहां वर्तमान चारसेट का संकेत दिया गया है। यह पुनः लोड या कन्वर्ट करने के लिए संकेत देता है, कन्वर्ट का उपयोग करें। सुनिश्चित करें कि आपने पहले से मूल फ़ाइल का बैकअप ले लिया है।


0

यदि MacOS GUI एप्लिकेशन आपकी रोटी और मक्खन हैं, तो SubEthaEdit वह टेक्स्ट एडिटर है जिसे मैं आमतौर पर एन्कोडिंग- जाता हूं - इसका "रूपांतरण पूर्वावलोकन" आपको आउटपुट इनकोडिंग में सभी अमान्य वर्णों को देखने और उन्हें ठीक करने / निकालने की अनुमति देता है।

और यह अब ओपन-सोर्स है, इसलिए उनके लिए now


-1

जैसा कि मुझे बताया गया है कि मैं किसी फ़ाइल के वर्ण एन्कोडिंग को कैसे सही करूं? इसे संक्षिप्त करें! ICU लाइब्रेरी द्वारा समर्थित सभी एन्कोडिंग के बीच आप आसानी से OS X में परिवर्तित कर सकते हैं

इसके अतिरिक्त आप सभी एन्कोडिंग से यूनिकोड में अनुवादित फ़ाइल के कुछ बाइट्स को जल्दी से देखने के लिए प्रदर्शित कर सकते हैं जो आपकी फ़ाइल के लिए सही है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.