요르딩딩
[JAVA] String.getBytes("")'; 본문
String을 인코딩하고 디코딩하는 이유는 무엇일까?
= 한글을 지원하지 않는 경우를 위해서 사용한다.
만약 DB가 한글을 지원하지 않는 경우 한글로 된 문자를 숫자로 인코딩하여 DB에 저장하고,
사용할때는 디코딩하여 보여주면된다. 암호화도 이와 같은 원리이다.
1. JAVA 의 String 클래스는 유니코드로 처리되는 char 의 배열 이외에 어떠한 인코딩 정보를 갖고 있지 않는다.
2. String.getByte('인코딩명') 을 사용하여 인코딩 할 수 있으며, new String(byte[], "인코딩명") 을 사용하여 디코딩 할 수 있다.
[Charset]
Charset - 캐릭터셋을 나타내는 클래스
[인코딩]
byte[] getBytes()
byte[] getBytes(Charset charset)
byte[] getBytes(String charsetName)
(예시)
String str = "Hellow World";
Byte[] encode = Str.getbyte();
문자열을 인코딩된 Byte형태로 넘겨줍니다.getByte()를 사용하면 default charset을 사용합니다.
ISO-8859-1, euc-kr, utf-8 등의 charset도 존재합니다.
encoding과 decoding할때 이 chatset을 맞춰서 해야합니다. 그러지 않을 경우 문자가 깨지는 현상이 발생하게 됩니다.
[디코딩]
(예시)
String decode = new String(encode);
인코딩된 byte배열을 String문자로 변환한다.
[test]
public static void main(String[] args){
String str="reakwon의 블로그";
//default charset으로 인코딩된 바이트 배열
byte[] bytes=str.getBytes();
//인코딩된 바이트 출력
System.out.print("Default charset encoding: ");
for(int i=0;i<bytes.length;i++)
System.out.print(bytes[i]+" ");
System.out.println();
//default charset으로 디코딩된 문자열 출력
String decoded=new String(bytes);
System.out.println(decoded);
System.out.println();
try {
//UTF-8로 인코딩된 바이트 배열
bytes=str.getBytes("UTF-8");
System.out.print("UTF-8 charset encoding: ");
for(int i=0;i<bytes.length;i++)
System.out.print(bytes[i]+" ");
System.out.println();
//이 바이트 배열을 default charset으로 디코딩된 문자열 출력 : charset이 다르므로 한글이 깨짐.
decoded=new String(bytes);
System.out.println(decoded);
//인코딩된 UTF-8로 디코딩되어 한글이 깨지지 않음.
decoded=new String(bytes,"UTF-8");
System.out.println(decoded);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
결과
Default charset encoding: 114 101 97 107 119 111 110 -64 -57 32 -70 -19 -73 -50 -79 -41
reakwon의 블로그
UTF-8 charset encoding: 114 101 97 107 119 111 110 -20 -99 -104 32 -21 -72 -108 -21 -95 -100 -22 -73 -72
reakwon?쓽 釉붾줈洹?
reakwon의 블로그
[test]
public class EncodingTest {
public static void main(String[] args) throws Exception {
String str = "기분 좋은 날씨인데, 집에만 틀어박혀있어야 한다니.. 뷁";
byte defaultBytes[] = str.getBytes();
byte eucBytes[] = str.getBytes("euc-kr");
byte ksc5601Bytes[] = str.getBytes("ksc5601");
byte ms949Bytes[] = str.getBytes("ms949");
byte unicodeBytes[] = str.getBytes("unicode");
byte utf8Bytes[] = str.getBytes("utf-8");
byte utf16Bytes[] = str.getBytes("utf-16");
System.out.println("기본 인코딩 : "+ new String(defaultBytes));
System.out.println("EUC-KR 인코딩 : "+ new String(eucBytes,"euc-kr"));
System.out.println("KSC5601 인코딩 : "+ new String(ksc5601Bytes,"ksc5601"));
System.out.println("MS949 인코딩 : "+ new String(ms949Bytes,"ms949"));
System.out.println("Unicode 인코딩 : "+ new String(unicodeBytes,"unicode"));
System.out.println("UTF-8 인코딩 : "+ new String(utf8Bytes,"utf-8"));
System.out.println("UTF-16 인코딩 : "+ new String(utf16Bytes,"utf-16"));
}
}
참고 : https://dev.re.kr/87
참고 : https://javacan.tistory.com/entry/77
참고: https://javacan.tistory.com/entry/77
[byte ->String 으로 형변환 하는 곳이 문제 발생시]
/**
* 바이너리 바이트 배열을 스트링으로 변환
*
* @param b
* @return
*/
public static String byteArrayToBinaryString(byte[] b) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < b.length; ++i) {
sb.append(byteToBinaryString(b[i]));
}
return sb.toString();
}
/**
* 바이너리 바이트를 스트링으로 변환
*
* @param n
* @return
*/
public static String byteToBinaryString(byte n) {
StringBuilder sb = new StringBuilder("00000000");
for (int bit = 0; bit < 8; bit++) {
if (((n >> bit) & 1) > 0) {
sb.setCharAt(7 - bit, '1');
}
}
return sb.toString();
}
/**
* 바이너리 스트링을 바이트배열로 변환
*
* @param s
* @return
*/
public static byte[] binaryStringToByteArray(String s) {
int count = s.length() / 8;
byte[] b = new byte[count];
for (int i = 1; i < count; ++i) {
String t = s.substring((i - 1) * 8, i * 8);
b[i - 1] = binaryStringToByte(t);
}
return b;
}
/**
* 바이너리 스트링을 바이트로 변환
*
* @param s
* @return
*/
public static byte binaryStringToByte(String s) {
byte ret = 0, total = 0;
for (int i = 0; i < 8; ++i) {
ret = (s.charAt(7 - i) == '1') ? (byte) (1 << i) : 0;
total = (byte) (ret | total);
}
return total;
}
'[Java]' 카테고리의 다른 글
[JAVA] StringBuffer (0) | 2021.05.26 |
---|---|
[JAVA] (collection) iterator (0) | 2021.05.24 |
[JAVA] lastIndexOf(), String.format("%02d")~ (0) | 2021.05.20 |
[JAVA] LocalDate, System.arraycopy() (0) | 2021.05.14 |
[JAVA] startsWith(), endsWith() (0) | 2021.05.10 |