2012-11-23 11 views
5

का उपयोग करते हुए utf8 नामों के साथ छवियों की प्रतिलिपि बनाएँ/नाम बदलें मैं बैच नाम बदलने और सीएसवी फ़ाइल के आधार पर छवियों की प्रतिलिपि बनाने के लिए एक स्क्रिप्ट पर काम कर रहा हूं। सीएसवी में कॉलम 1: पुराना नाम और कॉलम 2 होता है: नया नाम। मैं सीएसवी फ़ाइल का उपयोग पर्ल स्क्रिप्ट के लिए इनपुट के रूप में करना चाहता हूं ताकि यह पुराना नाम जांच सके और नए नाम का उपयोग नए नाम में एक प्रतिलिपि बना सके। समस्या यह है कि (मुझे लगता है) मुझे छवियों के साथ करना है। वे ß आदि जैसे UTF8 वर्ण हो जब मैं चलाने स्क्रिप्ट इसे बाहर इस प्रिंट: Barfu├ƒg├ñsschen जहां यह होना चाहिए Barfußgässchen और निम्न त्रुटि:सीएसवी फ़ाइल

Unsuccessful stat on filename containing newline at C:/Perl64/lib/File/Copy.pm line 148, <$INFILE> line 1. 
Copy failed: No such file or directory at X:\Script directory\correction.pl line 26, <$INFILE> line 1. 

मैं जानता हूँ कि यह Binmode UTF8 के साथ क्या करना है, लेकिन यहां तक ​​कि जब मैं एक साधारण स्क्रिप्ट की कोशिश (इसे यहाँ देखा: How can I output UTF-8 from Perl?):

use strict; 
use utf8; 
my $str = 'Çirçös'; 
binmode(STDOUT, ":utf8"); 
print "$str\n"; 

इसे बाहर प्रिंट इस: Airth ÷ रों

यह मेरी पूरी स्क्रिप्ट है, किसी ने मुझे समझा सकता है मैं कहाँ जा रहा हूँ गलत? (यह कोड की सबसे साफ नहीं है क्योंकि मैं सामान का परीक्षण कर रहा था)।

use strict; 
use warnings; 
use File::Copy; 
use utf8; 

my $inputfile = shift || die "give input!\n"; 
#my $outputfile = shift || die "Give output!\n"; 

open my $INFILE, '<', $inputfile or die "In use/not found :$!\n"; 
#open my $OUTFILE, '>', $outputfile or die "In use/not found :$!\n"; 

binmode($INFILE, ":encoding(utf8)"); 

#binmode($OUTFILE, ":encoding(utf8)"); 

while (<$INFILE>) { 
s/"//g; 
my @elements = split /;/, $_; 

my $old = $elements[1]; 
my $new = "new/$elements[3]"; 
binmode STDOUT, ':utf8'; 
print "$old | $new\n"; 

copy("$old","$new") or die "Copy failed: $!"; 
#copy("Copy.pm",\*STDOUT); 

# my $output_line = join(";", @elements); 
# print $OUTFILE $output_line; 
#print "\n" 
} 

close $INFILE; 
#close $OUTFILE; 

exit 0; 
+0

अपने पहले स्निपेट के बारे में: क्या .pl फ़ाइल स्वयं utf8 में एन्कोड किया गया है? 'Utf8' pragma का उपयोग करें पर्ल को बताता है कि आपका स्रोत कोड utf8 में लिखा गया है। यह डेटा से संबंधित नहीं है। – simbabque

+0

आप आउटपुट को कहां प्रिंट कर रहे हैं? एक लिनक्स खोल? इसके अलावा, आप फाइल कैसे बना रहे हैं? –

+0

मैं पुष्टि कर सकता हूं कि आपका पहला स्निपेट मेरे लिनक्स शैल पर LANG सेट के साथ 'en_GB.UTF-8' और पुटी सेट यूटीएफ -8 पर ठीक काम करता है। मैंने उसी शेल में वीआईएम का उपयोग करके फ़ाइल बनाई है। –

उत्तर

3

आपको यह सुनिश्चित करना होगा कि प्रक्रिया के प्रत्येक चरण यूटीएफ -8 का उपयोग कर रहे हैं।

जब आप इनपुट सीएसवी बनाते हैं, तो आपको यह सुनिश्चित करना होगा कि यह यूटीएफ -8 के रूप में सहेजा गया हो, अधिमानतः बीओएम के बिना। विंडोज नोटपैड एक बीओएम जोड़ देगा इसलिए नोटपैड ++ को आजमाएं जो आपको एन्कोडिंग का अधिक नियंत्रण देता है।

आपको यह भी समस्या है कि विंडोज कंसोल डिफ़ॉल्ट रूप से यूटीएफ -8 अनुरूप नहीं है। Unicode characters in Windows command line - how? देखें। या तो chcp 65001 के साथ कोडपेज सेट करें या STDOUT एन्कोडिंग को न बदलें।

अपने कोड के संदर्भ में, नई लाइन के बारे में पहली त्रुटि शायद सीएसवी की पिछली नई लाइन के कारण है। chomp() के बाद while (<$INFILE>) {

अपडेट करें:

करने के लिए "पता" फ़ाइल आप सही स्थान में अपनी फ़ाइल नाम सांकेतिक शब्दों में बदलना करने की जरूरत है - How do you create unicode file names in Windows using Perl और What is the universal way to use file I/O API with unicode filenames? देखें। मान लें कि आप पश्चिमी 1252/लैटिन का उपयोग कर रहे, इस जब आपके प्रति आदेश की तरह दिखाई देगा का अर्थ है:

copy(encode("cp1252", $old), encode("cp1252", $new)) 

इसके अलावा, अपने खुले भी फ़ाइल नाम सांकेतिक शब्दों में बदलना चाहिए:

open my $INFILE, '<', encode("cp1252", $inputfile) 

अद्यतन 2:

जैसा कि आप एक डॉस विंडो में चल रहे हैं, binmode(STDOUT, ":utf8"); हटाएं और डिफ़ॉल्ट कोडपेज को जगह पर छोड़ दें।

+0

मैंने नोटपैड ++ में सीएसवी को बीओएम के बिना utf8 के रूप में बनाया है, जो कि यह नहीं होना चाहिए। मैं अन्य 2 सुझावों की जांच कर रहा हूं जिन्हें आपने अभी दिया था। – Jan

+0

'chomp; 'के बाद' 0 (<$INFILE>) {' पहली त्रुटि के लिए चाल थी। कोड कोड को पहले सेट करना और फिर स्क्रिप्ट को आजमाने की कोशिश करना कुछ भी नहीं बदलेगा। मुझे अभी भी संदेश प्रतिलिपि मिल गई है। मैं पुराने और नए नाम को प्रिंट करता हूं और आप देख सकते हैं कि पुराना नाम गलत है और यही कारण है कि यह वास्तविक फ़ाइल से मेल नहीं खाता है और – Jan

+0

विफल रहता है फिर से देखें: फ़ाइल नाम एन्कोडिंग –