2013-02-10 103 views
14

लिनक्स पर फ़ायरफ़ॉक्स से जावा 6 एप (केवल!) में HTML को चिपकाते समय मुझे एक अजीब समस्या है। यहाँ एक न्यूनतम उदाहरण है:जावा क्लिपबोर्ड: लिनक्स पर फ़ायरफ़ॉक्स से HTML पेस्ट करें

import java.awt.Toolkit; 
import java.awt.datatransfer.Clipboard; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.io.Reader; 
import java.nio.ByteBuffer; 

class ClipboardPrinter { 
    public static void main(String args[]) throws Exception 
    { 
     Clipboard systemClipboard = Toolkit.getDefaultToolkit() 
       .getSystemClipboard(); 
     Transferable transferData = systemClipboard.getContents(null); 
     if (transferData == null) { 
      System.out.println("no content"); 
      return; 
     } 

//  final DataFlavor htmlFlavorString = new DataFlavor("text/html;class=java.lang.String"); 
//  String html = (String)transferData.getTransferData(htmlFlavorString); 
//  System.out.println("html = '" + html + "'"); 

     final DataFlavor htmlFlavor = new DataFlavor("text/html;class=java.nio.ByteBuffer;charset=US-ASCII"); 
     if (!transferData.isDataFlavorSupported(htmlFlavor)) { 
      System.out.println("no text/html reader content"); 
      return; 
     } 

     ByteBuffer bb = (ByteBuffer)transferData.getTransferData(htmlFlavor); 
     byte[] bytes = bb.array(); 
     for (byte b: bytes) 
     { 
      System.out.format("%02x", b); 
     } 
     System.out.println(); 
     final int cutoff = 2; 
     byte[] bytes2 = new byte[bytes.length - cutoff]; 
     for (int i = cutoff; i < bytes.length; i++) 
      bytes2[i-cutoff] = bytes[i]; 
     final String htmlContent = new String(bytes2, "UTF-16LE"); 


     System.out.println("htmlContent = '" + htmlContent + "'"); 
    } 
} 

सबसे पहले मैं new DataFlavor("text/html;class=java.lang.String"), (ऊपर स्निपेट में बाहर टिप्पणी की कोड), का उपयोग करने की कोशिश की लेकिन यह एक व्यर्थ शुरुआत में मूल्य 65533 के साथ 2 वर्ण के साथ स्ट्रिंग में परिणाम है (और यह उन दो पात्रों को काटने के लिए की सहायता नहीं करता है)।

अगला मैं charset=US-ASCII के साथ एक ByteBuffer डेटा स्वाद इस्तेमाल किया (मैंने जान-बूझकर ASCII इस्तेमाल किया!): charset=UTF-16LE (या UTF-16 या UTF-16BE) सब पर काम नहीं करता। उपर्युक्त charset=US-ASCII समाधान (new String(bytes2, "UTF-16LE") के साथ), 7 बिट वर्ण काम करते हैं (लेकिन उदाहरण के लिए umlauts कार्य नहीं करते हैं, '' 'इसके बजाय मुद्रित हो जाता है)।

मैंने दो बाइट्स काट दिया क्योंकि शुरुआत में दो बम प्रतीत होते हैं ( सुनिश्चित नहीं है, कुछ और हो सकता है)?

मैं साथ charset=UTF-8 और कटऑफ = 6 (दो से तीन-बाइट "प्रतिस्थापन वर्ण" 0xEFBFBD में शुरुआत और ऊमलायूट दो गलत पात्रों के रूप में इनकोडिंग) एक डेटा स्वाद के साथ एक समान परिणाम प्राप्त। मामलों में मैंने new String(bytes2, "UTF-16LE") का उपयोग किया था।

  • समर्थन इस समाधान में गैर- ASCII वर्ण (या एक बेहतर समाधान खोजने):

    आप करने के बारे में कोई सुझाव है?

  • यह निर्धारित करता है कि यह यूटीएफ -16LE या यूटीएफ -16 बीई है या नहीं?

धन्यवाद! किसी भी संकेत की सराहना की जाती है!

Btw: यहाँ मेरी (लिनक्स) प्रणाली (से) पर समर्थित डेटा जायके हैं:

[java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.Reader] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.lang.String] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.CharBuffer] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[C] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=application/x-java-serialized-object;representationclass=java.lang.String] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.Reader] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.lang.String] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.CharBuffer] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[C] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=unicode] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=text/x-moz-url-priv;representationclass=java.io.InputStream] 
java.awt.datatransfer.DataFlavor[mimetype=text/_moz_htmlinfo;representationclass=java.io.InputStream] 
java.awt.datatransfer.DataFlavor[mimetype=text/_moz_htmlcontext;representationclass=java.io.InputStream] 
java.awt.datatransfer.DataFlavor[mimetype=text/x-moz-url-priv;representationclass=java.nio.ByteBuffer] 
java.awt.datatransfer.DataFlavor[mimetype=text/_moz_htmlinfo;representationclass=java.nio.ByteBuffer] 
java.awt.datatransfer.DataFlavor[mimetype=text/_moz_htmlcontext;representationclass=java.nio.ByteBuffer] 
java.awt.datatransfer.DataFlavor[mimetype=text/x-moz-url-priv;representationclass=[B] 
java.awt.datatransfer.DataFlavor[mimetype=text/_moz_htmlinfo;representationclass=[B] 
java.awt.datatransfer.DataFlavor[mimetype=text/_moz_htmlcontext;representationclass=[B]] 
+0

के संभावित डुप्लिकेट [जावा खींचें और DropTargetListener के माध्यम से पाठ ड्रॉप] (http://stackoverflow.com/questions/7305628/java-drag-and-drop-text -via-droptargetlistener) –

उत्तर

0

Java 6 is not supported any more. तो, सवाल अप्रचलित है।

+0

समस्या अभी भी जावा 7 में बनी हुई है। जावा 8 में यह भी बदतर है: जब आप फ़ायरफ़ॉक्स से एचटीएमएल पेस्ट करते हैं तो कचरा परिणामस्वरूप होता है (जावा 7 के साथ केवल सादा पाठ के बजाय)। –

1

मुझे विश्वास है कि समस्या read from clipboard as US-ASCII है, फिर यूनिकोड में परिवर्तित करें और जर्मन उमोट्स को बरकरार रखने की उम्मीद है। चूंकि यूएस-एएससीआईआई 7-बिट वर्णमाला जर्मन उमॉट्स शामिल नहीं है और क्लिपबोर्ड को यूएस-एएससीआईआई के रूप में पढ़ने के बाद पहले ही खो गया है।

public class CharsetDemo { 
    public static void main(String[] args) throws Exception { 
     byte[] bytes; 

     // convert the German umlaut to bytes in US-ASCII charset 
     bytes = "ö".getBytes("US-ASCII"); 
     System.out.println("US-ASCII"); 
     System.out.println("bytes : " + asHexString(bytes)); 
     System.out.println("string: " + new String(bytes, "US-ASCII")); 
     System.out.println(); 

     // create a unicode string from the US-ASCII bytes 
     String utf8String = new String(bytes, "UTF-8"); 
     bytes = utf8String.getBytes("UTF-8"); 
     System.out.println("UTF-8"); 
     System.out.println("bytes : " + asHexString(bytes)); 
     System.out.println("string: " + utf8String); 
     System.out.println(); 

     // convert the German umlaut to bytes in ISO-8859-1 charset 
     bytes = "ö".getBytes("ISO-8859-1"); 
     System.out.println("ISO 8859-1"); 
     System.out.println("bytes : " + asHexString(bytes)); 
     System.out.println("string: " + new String(bytes, "ISO-8859-1")); 
     System.out.println(); 

     // create a unicode string from the ISO-8859-1 bytes 
     utf8String = new String(bytes, "UTF-8"); 
     bytes = utf8String.getBytes("UTF-8"); 
     System.out.println("UTF-8"); 
     System.out.println("bytes : " + asHexString(bytes)); 
     System.out.println("string: " + utf8String); 
     System.out.println(); 

     // bytes of the "REPLACEMET CHARACTER" 
     System.out.println("replacement character bytes: " 
      + asHexString("\uFFFD".getBytes("UTF-8"))); 

    } 

    static String asHexString(byte[] bytes) { 
     StringBuilder sb = new StringBuilder(); 
     for (byte b : bytes) { 
      sb.append(String.format("%X ", b)); 
     } 
     return sb.toString(); 
    } 
} 

उत्पादन

US-ASCII 
bytes : 3F 
string: ? <--- the question mark represents here the "REPLACEMENT CHARACTER" 

UTF-8 
bytes : 3F 
string: ? 

ISO 8859-1 
bytes : F6 
string: ö 

UTF-8 
bytes : EF BF BD <-- the "REPLACEMENT CHARACTER", as "F6" is not a valid UTF-8 codepoint 
string: � 

replacement character bytes: EF BF BD 
+0

उत्तर के लिए धन्यवाद। मैं सहमत हूं कि 8 बिट वर्णों को अनुमति देने पर ASCII का अनुरोध करना समझ में नहीं आता है।हालांकि, यह उपरोक्त क्लिपबोर्ड समस्या हल नहीं करता है। –