Java에서 ISO-8859-1과 UTF-8간에 어떻게 변환합니까?
누구든지 ISO-8859-1에서 UTF-8로 문자열을 변환하고 Java로 다시 변환하는 방법을 알고 있습니까?
웹에서 문자열을 가져와 RMS (J2ME)에 저장하지만 특수 문자를 유지하고 RMS에서 문자열을 가져 오지만 ISO-8859-1 인코딩을 사용하고 싶습니다. 어떻게해야합니까?
일반적으로이 작업을 수행 할 수 없습니다. UTF-8은 모든 유니 코드 코드 포인트를 인코딩 할 수 있습니다. ISO-8859-1은 그 중 극히 일부만 처리 할 수 있습니다. 따라서 ISO-8859-1에서 UTF-8로 트랜스 코딩하는 것은 문제가되지 않습니다. UTF-8에서 ISO-8859-1로 거꾸로 이동하면 지원되지 않는 문자가 발견 될 때 텍스트에 "대체 문자"( )가 나타납니다.
텍스트를 트랜스 코딩하려면 :
byte[] latin1 = ...
byte[] utf8 = new String(latin1, "ISO-8859-1").getBytes("UTF-8");
또는
byte[] utf8 = ...
byte[] latin1 = new String(utf8, "UTF-8").getBytes("ISO-8859-1");
하위 수준 CharsetAPI를 사용하여 더 많은 제어를 수행 할 수 있습니다 . 예를 들어 암호화 할 수없는 문자가 발견되면 예외를 발생 시키거나 대체 텍스트에 다른 문자를 사용할 수 있습니다.
나를 위해 일한 것 : ( "üzüm bağları"는 터키어로 쓰여진 정확한 것입니다)
ISO-8859-1을 UTF-8로 변환 :
String encodedWithISO88591 = "üzüm baÄları";
String decodedToUTF8 = new String(encodedWithISO88591.getBytes("ISO-8859-1"), "UTF-8");
//Result, decodedToUTF8 --> "üzüm bağları"
UTF-8을 ISO-8859-1로 변환
String encodedWithUTF8 = "üzüm bağları";
String decodedToISO88591 = new String(encodedWithUTF8.getBytes("UTF-8"), "ISO-8859-1");
//Result, decodedToISO88591 --> "üzüm baÄları"
가있는 경우 다음을 String수행 할 수 있습니다.
String s = "test";
try {
s.getBytes("UTF-8");
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
만약 당신이 'broken'을 가지고 있다면 String, 당신은 뭔가 잘못한 것입니다. Stringa String를 다른 인코딩으로 변환하는 것은 방어 적으로 갈 길이 아닙니다! a String를 a로 byte[]또는 그 반대로 변환 할 수 있습니다 (인코딩이 제공됨). Java에서는 StringAFAIK로 인코딩 UTF-16되지만 구현 세부 사항입니다.
당신이 가지고 있다고 가정하면 InputStream, 당신은 a 에서 읽은 byte[]다음 그것을 Stringusing으로 변환 할 수 있습니다.
byte[] bs = ...;
String s;
try {
s = new String(bs, encoding);
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
또는 더 나은 (erickson 덕분에) 다음 InputStreamReader과 같이 사용하십시오 .
InputStreamReader isr;
try {
isr = new InputStreamReader(inputStream, encoding);
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
다음은 String 출력을 사용하는 쉬운 방법입니다 (이 작업을 수행하는 방법을 만들었습니다).
public static String (String input){
String output = "";
try {
/* From ISO-8859-1 to UTF-8 */
output = new String(input.getBytes("ISO-8859-1"), "UTF-8");
/* From UTF-8 to ISO-8859-1 */
output = new String(input.getBytes("UTF-8"), "ISO-8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return output;
}
// Example
input = "Música";
output = "Música";
Regex도 좋고 효과적으로 사용할 수 있습니다 ( ISO-8859-1공백으로 덮이지 않은 모든 UTF-8 문자를 대체합니다 ).
String input = "€Tes¶ti©ng [§] al€l o€f i¶t _ - À ÆÑ with some 9umbers as"
+ " w2921**#$%!@# well Ü, or ü, is a chaŒracte⚽";
String output = input.replaceAll("[^\\u0020-\\u007e\\u00a0-\\u00ff]", " ");
System.out.println("Input = " + input);
System.out.println("Output = " + output);
Apache Commons IO Charsets 클래스 가 유용 할 수 있습니다.
String utf8String = new String(org.apache.commons.io.Charsets.ISO_8859_1.encode(latinString).array())
다음은 UNICODE (ISO_8859_1)를 UTF-8로 변환하는 함수입니다.
public static String String_ISO_8859_1To_UTF_8(String strISO_8859_1) {
final StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < strISO_8859_1.length(); i++) {
final char ch = strISO_8859_1.charAt(i);
if (ch <= 127)
{
stringBuilder.append(ch);
}
else
{
stringBuilder.append(String.format("%02x", (int)ch));
}
}
String s = stringBuilder.toString();
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
String strUTF_8 =new String(data, StandardCharsets.UTF_8);
return strUTF_8;
}
테스트
String strA_ISO_8859_1_i = new String("الغلاف".getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
System.out.println("ISO_8859_1 strA est = "+ strA_ISO_8859_1_i + "\n String_ISO_8859_1To_UTF_8 = " + String_ISO_8859_1To_UTF_8(strA_ISO_8859_1_i));
결과
ISO_8859_1 strA est = Ø§ÙØºÙا٠String_ISO_8859_1To_UTF_8 = الغلاف
참고 URL : https://stackoverflow.com/questions/652161/how-do-i-convert-between-iso-8859-1-and-utf-8-in-java
'IT TIP' 카테고리의 다른 글
| 텍스트가 허용 된 것보다 큰 경우 CSS로 오버플로시 텍스트 페이드 아웃 (0) | 2020.11.21 |
|---|---|
| S3 객체에 데이터 추가 (0) | 2020.11.21 |
| 콘텐츠에 대한 WPF 제어 크기? (0) | 2020.11.21 |
| 주어진 그림에서 긴 / 위도를 픽셀 x / y로 변환 (0) | 2020.11.21 |
| Gson 및 배열이있는 객체 배열 역 직렬화 (0) | 2020.11.21 |