2013-01-05 20 views
7

मेरे पास जापानी वर्णों के साथ कुछ निर्देशिका/फ़ाइलें हैं। अगर मैं एक फ़ाइल नाम (सामग्री नहीं) को पढ़ने की कोशिश करता हूं (उदाहरण के लिए) ク मुझे एक स्ट्रिंग प्राप्त होता है जिसमें होता है। यदि मैं एक फ़ाइल/निर्देशिका बनाने की कोशिश करता हूं जिसमें एक फ़ाइल/निर्देशिका है जिसमें एक है?जावा पढ़ना यूनिकोड/यूटीएफ -8 फाइलनाम (सामग्री नहीं)

उदाहरण के तौर पर: मैं फ़ाइलों को सूचीबद्ध करता हूं।

File file = new File("."); 
String[] filesAndDirs = file.list(); 

फ़ाइलें औरडिर्स सरणी में अब निर्देशिकाएं विशेष वर्ण हैं। स्ट्रिंग में अब केवल है। यह लगता है कि डीकोड करने के लिए कुछ भी नहीं है क्योंकि गेटबाइट अलग-अलग वर्णों के लिए फ़ाइल नाम में प्रत्येक char के लिए केवल "-17 -65 -67" दिखाता है।

मै मैकोज़ 10.8.2 जावा 7_10 और नेटबीन्स का उपयोग करता हूं।

कोई विचार?

अग्रिम धन्यवाद :)

+2

यह स्पष्ट नहीं है कि आप * उन फाइलनामों को कैसे दिखा रहे हैं या फिर आप 'String.getBytes()' (जिसे आपको हमेशा चाहिए) के लिए एन्कोडिंग प्रदान कर रहे हैं। यह देखने के लिए कि वास्तव में क्या चल रहा है, आपको फ़ाइल नाम में प्रत्येक वर्ण के लिए यूटीएफ -16 कोड बिंदु को डंप करना चाहिए। साथ ही, फ़ाइल को बनाने का प्रयास करते समय यह स्पष्ट नहीं है कि आप इनपुट डेटा कैसे प्राप्त कर रहे थे। –

+0

'GetBytes' जो वैध लगता है वह यूटीएफ 8 –

+1

@ जैन हां यह मान्य यूटी 8 जैसा लगता है लेकिन GetBytes प्रत्येक char के लिए "-17 -65 -67" देता है। लेकिन फ़ाइल/निर्देशिका नाम में सभी वर्ण समान नहीं हैं। ऐसा लगता है जैसे मैं ओएस और जावावीएम के बीच सभी जानकारी खो देता हूं। "-17 -65 -67" प्रत्येक विशेष चार के लिए दोहराया जाता है। [ए-जेए-जेड ...] अपेक्षित के रूप में लौटाए जाते हैं। मैं कम से कम प्रत्येक चार के लिए अलग बाइट्स की उम्मीद करता हूं। –

उत्तर

2

उन बाइट्स 0xef 0xbf 0xbd, जो \ ufffd चरित्र आप जापानी अक्षरों के स्थान पर देख रहे हैं के लिए UTF-8 एन्कोड रूप है कर रहे हैं। ऐसा लगता है कि फ़ाइलों को सूचीबद्ध करने के लिए जावा जो भी ओएस फ़ंक्शन का उपयोग कर रहा है वह वास्तव में उन गलत वर्णों को वापस कर रहा है।

शायद Files.newDirectoryStream अधिक विश्वसनीय होगा। ऐसा करें:

try (DirectoryStream<Path> dir = Files.newDirectoryStream(Paths.get("."))) { 
    for (Path child : dir) { 
     String filename = child.getFileName().toString(); 

     System.out.println("name=" + filename); 
     for (char c : filename.toCharArray()) { 
      System.out.printf("%04x ", (int) c); 
     } 
     System.out.println(); 
    } 
} 
+1

एक आकर्षण की तरह काम कर रहा है :)। अब मुझे केवल यह पता लगाना होगा कि विशेष वर्णों के साथ फाइलें और फ़ोल्डर्स कैसे बनाएं। आपका बहुत बहुत धन्यवाद! –

+0

'फाइल' कक्षा के लिए javadoc पर एक नज़र डालें। इसमें उन सभी चीजों को करने के तरीके हैं। – VGR

2

यह (शायद सिर्फ एक मैक पर) वर्ष जावा फ़ाइल एपीआई में एक बग है। वैसे भी, यह सब नया java.nio में तय है।

मेरे पास फ़ाइल नाम और यूनिट में यूनिकोड वर्ण युक्त कई फ़ाइलें हैं जो java.io.File और संबंधित वर्गों का उपयोग करके लोड करने में विफल रही हैं। java.nio.Path का उपयोग करने के लिए मेरे सभी कोड को कनवर्ट करने के बाद सब कुछ काम करना शुरू कर दिया। और मैंने java.nio.Files के साथ org.apache.commons.io.FileUtils (जिसमें एक ही समस्या है) को बदल दिया है ...

... और उचित वर्णमाला का उपयोग करके फ़ाइल की सामग्री को पढ़ने और लिखना सुनिश्चित करें, उदाहरण के लिए: Files.readAllLines (myPath, StandardCharsets.UTF_8)