어떻게 자바 바이트 배열에서 보조 유니 코드 문자를 인코딩 할?

RM-녹색 :

나는를 사용하고 InputStream에 (C #으로 작성) TCP 서버에서 바이트를 읽고 byte[], 그리고 사용하여 문자열로를 인코딩 new String(byteArray, "UTF-16LE"). 이 방법은 잘 기본 다국어 평면의 문자를 인코딩하지만, 보조 문자를 처리하지 않습니다.

나는 자바 바이트 서명 반면 C #에서 바이트 부호가 없음을 이해하고, 보조 문자는 하나 또는 두 개의 유니 코드 값으로 구성 될 수있다.

        ByteBuffer wrapped = ByteBuffer.wrap(dataBytes);
        wrapped.order(ByteOrder.LITTLE_ENDIAN);
        short noOfSites = wrapped.getShort();

        for(int i = 0; i < noOfSites; i++){
            short siteNo = wrapped.getShort();
            short textLength = wrapped.getShort();
            byte[] textBytes = new byte[textLength];
            wrapped.get(textBytes, 0, textLength);

            for(byte bite : textBytes){
                System.out.print(bite+" ");
            } //just to see what's in the byte array

            String siteText = new String(textBytes, "UTF_16LE");
            System.out.println(siteNo + ": " + siteText);
            siteList.add(new Site(siteNo, siteText));
            publishProgress(siteNo + " - " + siteText);
        }

이때, dataBytes바이트 서버로부터 판독 함유 바이트 배열이고, noOfSites오브젝트의 개수가 서버로부터 판독 될 siteNo아이디이고, textLength사이트 이름을 포함하는 바이트의 수이며, textBytes보유 배열 이러한 바이트.

서버에서 단어 "뮌스터"를 수신 할 때, 바이트 버퍼로 읽어은 다음과 같습니다 77 0 -3 -1 78 0 83 0 84 0 69 0 82 0. 그러나, "U"문자는 내가에 다운 생각하는 인식되지 않는 -3 -1자바 인코딩하려고 (그리고 실패)되는 UTF-16 값입니다. 나는 C #에서, "U"를로 표현되는 것을 이해 DC-00하지만이되고 왜 이해가 안 -3 -1자바. 어떤 도움을 크게 감상 할 수있다.

jsbueno :

은 "U"문자는 소스에서 인코딩되지 않고 - 싱크대 측에 도착하는 순서 "-3 -1"인 0xfffd- UTF 께 16 LE 인코딩 여분의 문자 .

서버 측 코드를 보지 않고이 일어나고 있지만 어떤 얘기하기 어렵다 나쁜 . UTF-16는 방법의 외출하지 않고 "U"와 같은 문자를 처리 할 수 있습니다. 사실, 그것은 훨씬 덜 기본 다국어 평면 외부, 심지어 처음 256 유니 코드 코드 포인트에서 아닙니다. (즉, 보류 문자로 설계된 비행기 밖으로 할 수있는 방법 서양 언어, 심지어 라틴어 많은 성격의 캐릭터 공통의 부족이며, 모든 세계의 언어?)

어떤 일이 일어나고은 유선 전송을 의미했다 UTF-16 텍스트에서 코드 경로, 어떤 시점에서, 명시 적으로 만 (기존의 유니 코드 코드 포인트가 0x20 ASCII가 아닌 임의의 문자에 대한 대체 문자를 설정하도록 지시되고 있다는 점이다 -0x7f, 단지 악센트가없는 라틴어 문자를 포함합니다).

명확하게하기 위해 즉, 상기 데이터는 서버 측을 손상되고, 문자를 피팅 ASCII가 아닌 모든 가능성이 "대체 문자"를이 숙청 될 것입니다. 클라이언트 측 코드에 바이올린을 켜는 아무리 그 문제를 해결 할 수 없습니다.

추천

출처http://43.154.161.224:23101/article/api/json?id=235935&siteId=1