요르딩딩

[JAVA] String.getBytes("")'; 본문

[Java]

[JAVA] String.getBytes("")';

요르딩딩 2021. 5. 20. 21:33
728x90
반응형

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;
    }

728x90
반응형

'[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
Comments