2013-02-10 12 views
14

Linux'ta Firefox’tan Java6 uygulamasına bir (yalnızca!) Olarak yapıştırırken garip bir problemim var. İşte minimal örnektir: (Java Panosu: Linux'ta Firefox'tan HTML'yi yapıştırın

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 + "'"); 
    } 
} 

Önce new DataFlavor("text/html;class=java.lang.String"), (yukarıdaki kod parçasında dışarı yorumladı kodu), kullanmaya çalıştı ama bu başında değeri 65.533 ile 2 karakter ile kullanışsız dize sonuçlanır onu ve Bu iki karakteri kesmek için yardımcı olmaz. charset=UTF-16LE (veya UTF-16 veya UTF-16BE) hiç çalışmaz:

Sonraki Ben charset=US-ASCII ile ByteBuffer veri lezzet kullanılan (! Bilerek ASCII kullanılır). Yukarıdaki charset=US-ASCII çözümü ile ( new String(bytes2, "UTF-16LE") ile birlikte), 7bit karakterleri çalışır (ancak, örneğin, çalışma değil, '?' Yerine yazdırılır).

İki bayttan kestim çünkü başlangıçta iki bom var gibi görünüyor ( , başka bir şey olabilir)?

Ben charset=UTF-8 ve kesim = 6 (başlangıç ​​ az iki üç bayt "yedek karakterler" 0xEFBFBD ve çift nokta iki yanlış karakter olarak kodlanmış) ile bir veri lezzet ile benzer bir sonuç elde. Hem vakalarında new String(bytes2, "UTF-16LE") kullanıyorum. (Daha iyi bir çözüm bulmak ya da) bu çözümde

  • destek ASCII olmayan karakterler:

    Eğer konusunda herhangi bir öneriniz var mı?
  • , UTF-16LE veya UTF-16BE olup olmadığını belirler?

Teşekkür ederiz! Herhangi bir ipucu takdir edilir!

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

olası yinelenen [Java Drag ve DropTargetListener aracılığıyla Bırak Metin] (http://stackoverflow.com/questions/7305628/java-drag-and-drop-text -via-droptargetlistener) –

cevap

0

Java 6 is not supported any more. Yani, soru kullanılmıyor: İşte (itibaren) benim (Linux) sisteme desteklenen veri tatlar vardır.

+0

Java7'de sorun hala devam ediyor. Java8'de daha da kötüsü: , Firefox’tan HTML yapıştırdığınızda, (Java7 ile olduğu gibi sadece düz metin yerine) çöpe atılıyor. –

1

Problemin, o zaman read from clipboard as US-ASCII olduğu gerçeğinden kaynaklandığına inanıyorum, daha sonra unicode'a dönün ve Alman umlauts'ını sağlam bırakmayı bekliyorum. US-ASCII, 7 bitlik bir charset olduğu için, US-ASCII olarak panoya okunduktan sonra, Alman umlanları dahil edilmemiş ve halihazırda kaybolmuştur.

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(); 
    } 
} 

çıkış

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

Cevabınız için teşekkür ederiz. 8bit karakterlerine izin verirken ASCII isteğinin mantıklı olmadığını kabul ediyorum. –

İlgili konular