2012-07-06 4 views
2

DB에 clob 열이 있습니다. 이제 우리가이 clob을 추출하여 그것을 표시하려고 시도 할 때 (html이 아닌 일반 텍스트), html 화면에 정크 문자를 인쇄합니다.문자 인코딩 문제?

System.out.println("”".getBytes()[0]); 

인쇄 -108 : 직접 파일을 스트리밍 캐릭터는 (일반 키보드에없는 보통 큰 따옴표)

한 번 더 관찰 것 같습니다.

왜 문자 바이트가 음수 범위에 있어야합니까? html 화면에 올바르게 표시 할 수있는 방법이 있습니까?

답변

2

Re : 최종 관찰 - Java 바이트는 항상 서명됩니다. 그들에게 같은 부호를 해석하기 위해, 당신은 그 (것)은 INT와 비트 AND 수 있습니다

byte[] bytes = "”".getBytes("UTF-8"); 
for(byte b: bytes) 
{ 
    System.out.println(b & 0xFF); 
} 

출력한다 : 당신의 문자열이 UTF-8에서 3 바이트 길이 실제로

226 
128 
157 

참고.

의견에서 지적한대로 인코딩에 따라 다릅니다. UTF-16를 들어 당신이 얻을 :

254 
255 
32 
29 

및 US-ASCII 또는 ISO-8859-1에 대한

당신이 물음표 (즉, "나는 몰라입니다

63 

를 얻을, 일부 신기한 캐릭터"). Note that :

이 문자열 지정된 캐릭터 세트로 인코딩 될 수없는 방법이 [getBytes()]의 동작을 지정한다. CharsetEncoder 클래스 은 인코딩 프로세스에 대한 더 많은 제어가 필요하면 이 필요할 때 사용해야합니다.

+0

플랫폼 (특히 UTF-8)의 특정 기본 인코딩에서 3 바이트 길이입니다. –

+0

예, 좋은 지적입니다! 더 명확하게하기 위해 명시 적 인코딩을 추가 할 것입니다 ... – DNA

2

내가 그것을 이런 식으로 같은 문자 코드를 인쇄 더 좋을 것이라고 생각 :

System.out.println((int)'”');//result is 8221 

This link는이 특별한 따옴표를 설명하는 데 도움이 될 수 있습니다 (html 코드를 포함한다).

0

HTML 문서에서 문자를 올바르게 표시하는 방법에 대한 질문에 대답하려면 다음 두 가지 중 하나를 수행해야합니다. 문서의 인코딩을 설정하거나 비 ASCII 문자를 엔티티 화하십시오.

인코딩을 설정하려면 두 가지 옵션이 있습니다.

  1. Content-Type 헤더에 적절한 문자 집합 인수를 보내도록 웹 서버를 업데이트하십시오. 올바른 헤더는 Content-Type: text/html; charset=UTF-8입니다.
  2. 페이지의 머리 부분 에 <meta charset="UTF-8" /> 태그를 추가하십시오.

옵션 1은 옵션 2보다 우선합니다.헤더에 잘못된 문자 집합을 이미 설정 한 경우 메타 태그로 재정의 할 수 없습니다.

다른 옵션은 비 ASCII 문자를 엔티티 화하는 것입니다. 질문의 인용 문자는 &rdquo; 또는 &#8221; 또는 &#x201D;을 사용할 수 있습니다. 첫 번째는 사용자에게 친숙한 명명 된 엔티티이며, 두 번째는 10 진수로 된 문자의 유니 코드 코드 포인트를 지정하고 세 번째 코드는 16 진수로 코드 포인트를 지정합니다. 모두 유효하며 모두 작동합니다.

일반적으로 알 수없는 문자가 포함 된 데이터베이스에서 동적 내용을 엔티티 화하려면 엔티티의 코드 포인트 버전을 사용하는 것이 가장 좋습니다. 적절한 코드 포인트로 이동하십시오.

내가 현재 작업하고있는 시스템 중 하나는 실제로 UTF-8 소스에서 데이터를 가져 와서 Content-Type 헤더를 제어 할 수없는 HTML 페이지를 제공해야하는이 문제에 실제로 부딪혔다. 우리는 실제로 자바 문자의 스트림을 모든 비 ASCII 문자가 엔티티로 변환 된 ASCII 인코딩 된 바이트 스트림으로 변환 할 수있는 사용자 정의 Java Charset을 작성했습니다. 그런 다음 출력 스트림을 Writer에서 해당 Charset으로 래핑하고 평소와 같이 모든 것을 출력합니다. Charset을 올바르게 구현하는 데는 몇 가지 어려움이 있지만 간단하게 인코딩을하는 것은 간단합니다. 서로 게이트 쌍을 올바르게 처리해야합니다.