2013-02-10 16 views
14

LinuxのFirefoxのHTMLをJava6のアプリケーション に貼り付けるときに奇妙な問題があります。ここで、最小の例である:Javaクリップボード:LinuxのFirefoxから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つの文字で使用不能 文字列になる(それそれらの2つの文字を切り捨てるために を助けません)。

次の私は(私は故意にASCII を使用!)charset=US-ASCIIでのByteBufferのデータフレーバを使用: すべてでは動作しませんcharset=UTF-16LE(またはUTF-16またはUTF-16BE)。上記のcharset=US-ASCII解決策(new String(bytes2, "UTF-16LE")と一緒に)では、7ビット文字が機能しますが(たとえば、ウムラウトは ではなく、 '?'が代わりに印刷されます)。

最初に2つのボムがあるように見えます( ではないかもしれません)。

私は(2つの間違った文字としてエンコード 最初とウムラウトでの2つの3バイトの「置換文字」0xEFBFBD)= 6 charset=UTF-8と カットオフを有するデータの風味と同様の結果を得ることができます。 の場合、私はnew String(bytes2, "UTF-16LE")を使用しました。 (よりよい解決策を見つけるか)をこの溶液中

  • サポート非ASCII文字:

    は、あなたがする方法についての提案がありますか?
  • それがUTF-16LEかUTF-16BEかを判別しますか?

ありがとう!どんなヒントもありがとう!

ところで:ここで(から)私の(Linux)のシステム でサポートされるデータのフレーバーです:

[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を介したJavaドラッグ&ドロップテキスト]の可能な重複(http://stackoverflow.com/questions/7305628/java-drag-and-drop-text -via-droptargetlistener) –

答えて

0

Java 6 is not supported any more.だから、質問は廃止されました。

+0

Java7ではまだ問題が解決されていません。 Java8ではさらに悪いです。 FirefoxからHTMLを貼り付けると、Java7のような単純なテキストの代わりにゴミが出ます。 –

1

私は彼がread from clipboard as US-ASCIIという事実に関連していると信じています。そして、ユニコードに変換し、ドイツ語のウムラウトをそのまま残すことを期待します。 US-ASCIIは7ビットの文字セットであるため、ドイツ語のウムラウトは含まれておらず、US-ASCIIとしてクリップボードを読んだ後ですでに失われています。

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を要求することは合理的ではないことに同意します。ただし、上記のクリップボードの問題は解決されません。 –

関連する問題