2009-03-11 4 views
5

UTF-8 상표 기호를 ISO Latin 1로 변환하고 ISO Latin 1로 인코딩 된 데이터베이스에 저장해야합니다.UTF-8 문자를 ISO Latin 1로 변환하는 방법은 무엇입니까?

Java로 어떻게 할 수 있습니까?

나는

String s2 = new String(s1.getBytes("ISO-8859-1"), "utf-8"); 

같은 것을 시도했다하지만 예상대로 작동하지 않을 것 같다.

+0

http://stackoverflow.com/questions/285228/how-to-convert-utf-8-to-us-ascii-in-java 중복되지는 않지만 유사하지는 않습니다. –

답변

5

Java 문자열은 항상 유니 코드 (UTF-16, 효과적으로)입니다. 변환은 텍스트에서 이진 인코딩으로 또는 그 반대로 이동하려는 경우에만 필요합니다.

관련된 캐릭터는 무엇입니까? ISO Latin 1에도 존재하는지 확신합니까? 그것이 있다면, 나는 그 캐릭터가 문제없이 데이터베이스에 저장 될 것으로 기대합니다. "UTF-8 상표 표시"와 같은 것은 없습니다. "UTF-8로 표시되는 상표 기호를 나타내는 바이트"를 가질 수 있지만 문자열이 아닌 바이트 배열이됩니다.

편집 : Unicode trademark character U + 2122를 의미하는 경우 ISO-Latin-1의 범위를 벗어납니다. (IIRC, 외관 또는 법적 의미 중 하나) 같은 것은 아니지만없는 것보다는 나을 수 registered trademark character U + 00AE가있다 - 당신이 그 다음을 사용하려면 단지 사용

string replaced = original.replace('\u2122', '\u00ae'); 
+2

그러나 <®> 및 <™>의 의미는 매우 다릅니다. –

+0

따라서 "똑같은 모양이나 법적인 의미가 아닙니다" –

2
  1. Jon Skeet이 말한 것을 읽어보십시오. 게시 한 코드는 쓰레기입니다 (UTF-8로 인코딩 된 문자열 형식을 사용하고 ISO-8859-1처럼 해석하므로 아무런 효과가 없습니다).
  2. ISO-8859-1 인코딩 (a.k.a Latin1)에는 상표 문자 "™"가 없습니다.
0

비슷한 문제가있어서 엔티티의 변환 할 수없는 문자를 변환하여 해결했습니다. 정보를 나중에 html로 표시하면 어쨌든 괜찮습니다.

그렇지 않은 경우 유니 코드로 다시 변환 할 수 있습니다. "상표"와 파이썬에서

예 :

s = u'yellow bananas\u2122'.encode('latin1', 'xmlcharrefreplace') 
# s is 'yellow bananas&#8482;' 
4

지금까지 내가, 당신은 단지 ISO-을 지원하는 DB에 비 라틴 1 문자가 포함 된 (s1에서) 문자를 저장하려고하는 이해 8859-1.

  • 먼저 다른 사람들과 의견을 같이하는 것이 더러운 생각입니다. 이제

  • CP1252은 ISO-8859-1 (문자 당 1 바이트)에서 가깝고 포함
    참고, 질문을 anwser, 나는 당신이 반대를했다고 생각 ..
    당신은 인코딩 할 UTF-8 ISO-8859-1에 바이트 :

    String s2 = new String(s1.getBytes("UTF-8"), "ISO-8859-1"); 
    

    이 방법 s2 번 ISO-8859-1로 인코딩하는 characher 문자열이 유효 UTF-8과 같을 수있다 바이트 배열을 반환 바이트.

    String s1 = new String(s2.getBytes("ISO-8859-1"),"UTF-8"); 
    

을하지만 WAIT 것, 원래 문자열을 검색하세요!이 바이트는 ISO-8859-1 .. 으로 디코딩 될 수 있으며 DB는 이러한 데이터를 허용 할 것이라고 희망합니다.

실제로 공식적으로는 ISO-8859-1 doesn't have chars for any byte values이므로 정말 확실하지 않습니다. 예를 들어, 80 ~ 9F.

byte[] b = { -97, -100, -128 }; 
System.out.println(new String(b,"ISO-8859-1")); 

자바에서 그러나 ???

, 표시 할이어서

s.getBytes("ISO-8859-1") 실제로 초기 배열을 복원한다.

+1

훌륭한 대답, 문자 집합에 대한 이해가 우수합니다. – paj28