2013-02-10 2 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 개 문자와 사용할 수없는 문자열 결과 IT와 이 두 문자를 자르려면 을 도와주지 않습니다.) charset=UTF-16LE (또는 UTF-16 또는 UTF는-16BE)는 전혀 작동하지 않습니다

가 다음 내가 charset=US-ASCII와의 ByteBuffer 데이터 풍미를 사용하는 (! 나는 목적에 ASCII 를 사용). 위의 charset=US-ASCII 해결책 (함께 new String(bytes2, "UTF-16LE")), 7bit 문자가 작동하지만 (예 : 움라우트가 작동하지 않으면 '?'가 대신 인쇄됩니다.)

시작 부분에 두 개의 멍청이가있는 것 같습니다 ( 이 아닌 것일 수 있음).

제가 charset=UTF-8 및 컷오프 = 6 ( 시작하는 두 개의 3 바이트 "여분의 문자"0xEFBFBD 움라우트와 두 잘못된 문자로 부호화)와 데이터 풍미와 유사한 결과를 얻는다. 두 경우 모두 new String(bytes2, "UTF-16LE")을 사용했습니다. (더 나은 솔루션을 찾거나)이 솔루션에

  • 지원 ASCII 문자가 아닌 문자 :

    당신이하는 방법에 대한 제안이 있습니까?
  • UTF-16LE인지 UTF-16BE인지 확인하십시오.

고마워요! 모든 힌트를 부탁드립니다!

은 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. 그래서, 문제는 사용되지 않습니다 : 여기에 (transferable.getTransferDataFlavors()에서) 내 (리눅스) 시스템 에서 지원되는 데이터 맛입니다.

+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

답장을 보내 주셔서 감사합니다. 나는 8bit 문자를 허용 할 때 ASCII를 요청하는 것이 이치에 맞지 않는다는 것에 동의한다.그러나 위의 클립 보드 문제는 해결되지 않습니다. –

관련 문제