๐Ÿ’ป Encoding / Decoding

๋ฐฐํšจ๋ฆผยท2023๋…„ 4์›” 17์ผ
0

์Šคํ„ฐ๋””

๋ชฉ๋ก ๋ณด๊ธฐ
3/3

๐ŸŒŠ Recap on Input / Output

  • ๋‹จ์ˆœ InputSystem ๊ณผ BufferedInputSystem ์˜ read() ํšจ์œจ์„ฑ์€ ๊ฒ€์ฆํ–ˆ๋‹ค. write() ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ธ๊ฐ€ ?
    : YES. InputStream์„ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ์“ฐ๊ณ , ๊ฐ™์€ ์šฉ๋Ÿ‰์„ FileOutputStream์œผ๋กœ ์ผ์„ ๋•Œ๋Š” 5.3s, BufferedOutputStream์œผ๋กœ ์ผ์„ ๋•Œ๋Š” 0.4s ๊ฐ€ ๊ฑธ๋ ธ๋‹ค. ์˜คํžˆ๋ ค read๋ณด๋‹ค ์ฐจ์ด๊ฐ€ ๋” ๋‚˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • Buffer ์‚ฌ์ด์ฆˆ๊ฐ€ ๋„˜์–ด๊ฐˆ ๋•Œ, ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š”๊ฐ€?
    : NO. ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋˜์ง„๋‹ค.
	BufferedInputStream bis = new BufferedInputStream(fis,1000000000);
	BufferedOutputStream bos = new BufferedOutputStream(fos,1);
	
	// Exception in thread "main" java.lang.NullPointerException
	//	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
	//	at java.io.BufferedOutputStream.write(BufferedOutputStream.java:95)
	
	 public synchronized void write(int b) throws IOException {
	        if (count >= buf.length) {
	            flushBuffer();
	        }
	        buf[count++] = (byte)b;
	    }

โœ” ์ถœ๋ ฅํ•  ๋•Œ ๋ฌธ์ž๊ฐ€ ๊นจ์ง€๋Š” ๋ฌธ์ œ

Mission 1์„ ์œ„ํ•œ ์„ธํŒ…์„ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€, Tomcat ๊ด€๋ จ Log์˜ ํ•œ๊ธ€ ๋ถ€๋ถ„์ด IDE ์ถœ๋ ฅ ์ฐฝ์—์„œ ๊นจ์ ธ์„œ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค. ์ด๋ฅผ ๊ณ ์น˜๊ธฐ ์œ„ํ•ด ๊ตฌ๊ธ€๋ง์„ ํ–ˆ๋”๋‹ˆ,

  1. ์„ค์ •์—์„œ ๋ชจ๋“  ์ธ์ฝ”๋”ฉ ๊ด€๋ จ ์„ค์ •์„ UTF-8๋กœ ๋ฐ”๊ฟ€ ๊ฒƒ
  2. VM Options ์— ์•„๋ž˜ ๋‘ ์ค„์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ:
	-Dfile.encoding=UTF-8
    -Dconsole.encoding=UTF-8

์ด๋Ÿฐ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ด์„œ ๋”ฐ๋ผํ•ด๋ดค๋”๋‹ˆ ํ•œ๊ธ€์ด ์ž˜ ๋‚˜์˜จ๋‹ค. UTF-8 ์ด๋ผ๊ณ  ํ•˜๋ฉด ๋ง‰์—ฐํ•˜๊ฒŒ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์ž˜ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์ธ์ฝ”๋”ฉ์ด๋ผ๊ณ ๋Š” ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ์ •ํ™•ํ•˜๊ฒŒ ๋‚ด๋ถ€์ ์œผ๋กœ ์ด ์„ค์ •์ด ์ž‘์šฉํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ณ  ์žˆ์–ด์„œ, ์ด๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ๊ณต์œ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

๐Ÿ’ป Encoding : ์ธ๊ฐ„์˜ ์–ธ์–ด๋ฅผ ์ปดํ“จํ„ฐ์˜ ์–ธ์–ด๋กœ

์šฐ์„  ์‚ฌ์ „์ ์œผ๋กœ, Encoding ์ด๋ž€ '~๋ฅผ ์ฝ”๋“œํ™”ํ•˜๋‹ค' ๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ์ปดํ“จํ„ฐ๋Š” ์ธ๊ฐ„์˜ ๋ฌธ์ž๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๊ธฐ์— ๊ฐ๊ฐ์˜ ๋ฌธ์ž๋ฅผ ์ปดํ“จํ„ฐ ์–ธ์–ด๋กœ ์ฝ”๋“œํ™” ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.

๊ณต๋ถ€ํ•˜๋ฉด์„œ ์กฐ๊ธˆ ๋†€๋ผ๊ณ , ๋˜ ์žฌ๋ฐŒ์—ˆ๋˜ ๋ถ€๋ถ„์„ ๋จผ์ € ๋˜์ง€๋ ค๊ณ  ํ•œ๋‹ค :

U+1F600

์œ„ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ๊ฒƒ์„ ์˜๋ฏธํ• ๊นŒ? ์˜์–ด ? ํ•œ๊ธ€ ? ์ˆซ์ž ? ์–ด๋Š ๋‚˜๋ผ์˜ ์–ธ์–ด?
ํžŒํŠธ๋ฅผ ์ฃผ์ž๋ฉด ๋งŒ๊ตญ๊ณตํ†ต์˜ ์–ธ์–ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

์ •๋‹ต

์ด๊ฒƒ์„ ์•Œ๊ณ , ๋‚ด ์ƒ๊ฐ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ฒƒ์ด ์ด "์ธ์ฝ”๋”ฉ"์ด๋ผ๋Š” ๊ณผ์ •์„ ํ†ตํ•ด ์ปดํ“จํ„ฐ์—๊ฒŒ ์ธ์‹๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค. ์ปดํ“จํ„ฐ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ž๋ฅผ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ๋‹ค์‹œ ์ด์ง„์ˆ˜๋กœ ์น˜ํ™˜ํ•œ๋‹ค. ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค ๊ณผ์ •์„ ํ†ตํ•ด ์ด ๋ณ€ํ™˜์ด ์ด๋ฃจ์–ด์ง€๋Š” ์ง€, ๊ทธ๋ฆฌ๊ณ  ๋‹ค์–‘ํ•œ ๋ณ€ํ™˜๋ฒ•์—๋Š” ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž˜๋ชป๋œ Encoding ์„ ์„ ํƒํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์•Œ์•„๋ณด์ž.

Encoding ์ด๋ž€ ๋ฌธ์ž๋ฅผ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๊ณ , ๊ทธ ๋ฐ˜๋Œ€๋กœ Decoding ์ด๋ž€ ์ฝ”๋“œ๋ฅผ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

โœ” ASCII

์—ญ์‚ฌ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์•Œ์•„๋ณด์ž๋ฉด, ASCII์˜ ํƒ„์ƒ ์ „์—๋Š” ์ปดํ“จํ„ฐ์˜ ์ œ์กฐ์—…์ฒด๋งˆ๋‹ค ๊ฐ์ž์˜ ๋ฐฉ์‹์œผ๋กœ ์•ŒํŒŒ๋ฒณ, ์ˆซ์ž ๋ฐ ๋‹ค๋ฅธ ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋“ค๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜์ด ์–ด๋ ค์› ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ASCII (American Standard Code for Information Interchange) ๋˜๋Š” ํ•œ๊ตญ์–ด๋กœ ๋ฏธ๊ตญ์ •๋ณด๊ตํ™˜ํ‘œ์ค€๋ถ€ํ˜ธ๊ฐ€ ํƒœ์–ด๋‚ฌ๋‹ค.

7๋น„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ด๋Š” 272^7 ์ฆ‰ 128๊ฐœ์˜ ๋‹ค๋ฅธ ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.000 0000 - NULL ๋กœ ์‹œ์ž‘ํ•˜์—ฌ, ์˜์–ด ๋Œ€์†Œ๋ฌธ์ž ๋ฐ 10๊ฐœ์˜ ์ˆซ์ž, 32๊ฐœ์˜ ํŠน์ˆ˜ ๋ฌธ์ž ๊ทธ๋ฆฌ๊ณ  ํ•˜๋‚˜์˜ ๊ณต๋ฐฑ ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ASCII๋กœ ๋ถ€์กฑํ•จ์ด ์—†์—ˆ์ง€๋งŒ, PC๊ฐ€ ๋” ๋„๋ฆฌ ๋ณด๊ธ‰ํ™”๋˜๊ณ , ์„ธ๊ณ„ํ™”๊ฐ€ ์ง„ํ–‰๋˜๋ฉฐ, ๊ฐ ๋‹ค๋ฅธ ๋‚˜๋ผ์˜ ์–ธ์–ด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ด์กŒ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚จ์€ 1๋น„ํŠธ๋„ ์‚ฌ์šฉํ•˜์—ฌ 282^8 , ์ฆ‰ 256 ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ ํ•œ ๊ฒƒ์ด ํ™•์žฅ ์•„์Šคํ‚ค (Extended ASCII) ์ฝ”๋“œ์ด๋‹ค. ๊ตญ๊ฐ€๋ณ„๋กœ ๋‹ค๋ฅธ ๋ณ€ํ˜•์ด ์กด์žฌํ•œ๋‹ค. ์˜ˆ๋กœ ๋“ค์–ด์„œ, ISO-8859-1 ~ ISO-8859-16 ๊ฐ€ ์žˆ๋Š”๋ฐ, ISO-8859-1 ์€ ์„œ์œ ๋Ÿฝ์—์„œ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ผํ‹ด์–ด๋ฅผ ํฌํ•จํ•œ ๋ฌธ์ž๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์–ด๋–ค ์ธ์ฝ”๋”ฉ ๊ธฐ๋ฒ•์„ ์ผ๋Š”์ง€ ์•Œ์•„์•ผ, ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ASCII๋กœ๋Š” ํ•œ๊ธ€์„ ํ‘œํ˜„ํ•˜๊ธฐ์—๋Š” ์—ญ๋ถ€์กฑ์ด๋‹ค. ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ์„๊นŒ?

โœ” EUC-KR (Extended Unix Code - Korea)

2๋ฐ”์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ํ•œ๊ธ€์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. 2350์ž์˜ ํ•œ๊ธ€ ์Œ์ ˆ๊ณผ 4888์ž์˜ ํ•œ์ž๋ฅผ ์ง€์›ํ•˜๋ฉฐ, '๊ฐ€' ์—์„œ 'ํž' ๊นŒ์ง€ ๋Œ€๋ถ€๋ถ„์˜ ํ•œ๊ธ€ ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•œ๊ธ€์—๋Š” ์ดˆ์„ฑ,์ค‘์„ฑ,์ข…์„ฑ์ด ์กด์žฌํ•˜๋Š”๋ฐ, EUC-KR์€ ๋ชจ๋“  ๊ธ€์ž๊ฐ€ ์™„์„ฑ๋œ ํ˜•ํƒœ๋กœ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ‘œํ˜„ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ž๋„ ์กด์žฌํ•œ๋‹ค. ์˜ˆ๋กœ ๋“ค์–ด, "๋ท"์ด๋ผ๋Š” ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ ํ•  ์ˆ˜ ์—†๋‹ค.

String str = "๋ท";
byte defaultBytes[] = str.getBytes();		// CP 949
byte eucBytes[] = str.getBytes("euc-kr");

System.out.println("๊ธฐ๋ณธ ์ธ์ฝ”๋”ฉ : "+ new String(defaultBytes));
System.out.println("EUC-KR ์ธ์ฝ”๋”ฉ : "+ new String(eucBytes,"euc-kr"));

์ถœ๋ ฅ:
๊ธฐ๋ณธ ์ธ์ฝ”๋”ฉ : ๋ท
EUC-KR ์ธ์ฝ”๋”ฉ : ?
  • ์ฐธ๊ณ ๋กœ String ํด๋ž˜์Šค์˜ getBytes ํ•จ์ˆ˜๋Š” ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ์–ด๋–ค ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•ด ๋ฌธ์ž๋กœ ์น˜ํ™˜ํ• ์ง€ ์ง€์ •ํ•˜๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•ด์„œ ์ด๋ฅผ ์ผ๋‹ค. ๋˜ํ•œ, new String(byte[], "์ธ์ฝ”๋”ฉ๋ช…") ์„ ํ†ตํ•ด ๋””์ฝ”๋”ฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€๋” ์ž‘์—…์„ ํ•˜๋‹ค๊ฐ€ ๏ฟฝ ๋ผ๋Š” ๋ฌธ์ž๊ฐ€ ๋„๋ฐฐ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ํ•ด์„ํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ž๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ž˜๋ชป๋œ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋ฉด ์ด๋Ÿฐ ํ˜„์ƒ์„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•˜์ž.

โœ” CP949

PC๊ฐ€ ๋ณด๊ธ‰๋จ์— ๋”ฐ๋ผ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ง€์—ญ ๋˜๋Š” ๊ตญ๊ฐ€์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ํ™•์žฅ ์•„์Šคํ‚ค๊ฐ€ ํ•„์š”ํ•ด์กŒ๋Š”๋ฐ, ์ด ์ฝ”๋“œํŽ˜์ด์ง€ ๋งˆ๋‹ค 'CP XXX'๋ผ๊ณ  ์ด๋ฆ„์„ ๋ถ™์˜€๋‹ค. ์ฐธ๊ณ ๋กœ ์ฝ”๋“œํŽ˜์ด์ง€(CP)๋ž€ 256๋ฌธ์ž๋ฅผ ์–ด๋–ค ์ˆซ์ž๋กœ ๊ฐ๊ฐ ๋งคํ•‘ ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ํ‘œ์‹œํ•ด๋†“์€ ๊ฒƒ์ด๋‹ค.

cmd ๋ฅผ ์‹คํ–‰์‹œ์ผœ chcp ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์น˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ถœ๋ ฅ์ด ๋‚˜์˜จ๋‹ค :

ํ•œ๊ตญ์–ดํŒ ์œˆ๋„์šฐ์˜ ๊ธฐ๋ณธ ์ฝ”๋“œํŽ˜์ด์ง€(CP)๋Š” 949์ธ๋ฐ, MS๊ฐ€ ๊ฐœ๋ฐœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— MS949 ๋˜๋Š” Windows-949 ๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค. CP949 ๋Š” EUC-KR์— ์—†๋Š” 8822๊ธ€์ž๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๋” ๋งŽ์€ ํ•œ๊ธ€์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. EUC-KR๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ, 5๋น„ํŠธ์”ฉ ๋Š์–ด ์ดˆ์„ฑ,์ค‘์„ฑ,์ข…์„ฑ์— ๋Œ€์‘์‹œํ‚ค๋Š” ๋ฐฉ์‹์ด๋‹ค.

์—ฌ๊ธฐ์„œ ๋” ์•Œ ์ˆ˜ ์žˆ๋Š” ์ ์€, ์šด์˜์ฒด์ œ๋งˆ๋‹ค ์‚ฌ์šฉํ•˜๋Š” ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์‹ค์ œ๋กœ Window๋Š” CP949 , MacOS ์™€ Linux ๋Š” UTF-8์„ ์‚ฌ์šฉํ•œ๋‹ค.

โœ” Unicode - UTF-8? 16? 32?

์œ„ ์ธ์ฝ”๋”ฉ์œผ๋กœ ํ•œ๊ธ€์€ ์ž˜ ํ‘œํ˜„๋˜์ง€๋งŒ, ํ•œ๊ธ€ ์™ธ์— ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๋‹ˆ์ฆˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด Unicode - ์ „์„ธ๊ณ„์˜ ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์ด๋‹ค. U+๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

๋จผ์ €, UTF-8์€ ๋ฒ”์œ„์— ๋”ฐ๋ผ 1~4 byte๋ฅผ ๊ฐ€๋ณ€์ ์œผ๋กœ ์“ด๋‹ค. ์˜๋ฌธ์˜ ๊ฒฝ์šฐ ASCII์ฒ˜๋Ÿผ 1๋ฐ”์ดํŠธ๋ฅผ ์“ฐ๊ณ , ํ•œ๊ธ€์— ๊ฒฝ์šฐ 3๋ฐ”์ดํŠธ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฐธ๊ณ ๋กœ, 0~127 ์˜์—ญ์—์„œ๋Š” ASCII์ฝ”๋“œ์™€ ์™„์ „ํžˆ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธํ™˜์„ฑ์ด ์žˆ๋‹ค. ์ด ๋ง์€ ์ฆ‰์Šจ UTF-8์„ ์ง€์›ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์€ ๋ฌด๋ฆฌ์—†์ด ASCII ์ฝ”๋“œ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ๋นˆ๋„๊ฐ€ ๋†’์€ ๊ธ€์ž๋Š” ์ ์€ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ , ๋‚ฎ์€ ๊ธ€์ž๋Š” ๋งŽ์€ ์ €์žฅ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ฒŒ๋” ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค.

๋ฐ˜๋ฉด UTF-16์€ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž๋ฅผ 2๋ฐ”์ดํŠธ ๋˜๋Š” 4๋ฐ”์ดํŠธ๋กœ ์ธ์ฝ”๋”ฉํ•œ๋‹ค. ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ž๋Š” 2๋ฐ”์ดํŠธ๋กœ, ๊ทธ ์ด์™ธ์˜ ๋ฌธ์ž๋Š” 4๋ฐ”์ดํŠธ๋กœ ์ธ์ฝ”๋”ฉ ๋˜๋Š”๋ฐ, ํ•œ๊ธ€์€ 2๋ฐ”์ดํŠธ๋กœ ํ‘œํ˜„๋œ๋‹ค. ๋”ฐ๋ผ์„œ UTF-8๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ํ•œ๊ธ€์„ ํ‘œํ˜„ํ•˜๊ธฐ์— ๋” ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋“œ๋Š” ๊ฒƒ์€ UTF-16์ด๋‹ค.

UTF-32๋Š” 4๋ฐ”์ดํŠธ๋กœ ์ธ์ฝ”๋”ฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ณ ์ • ๊ธธ์ด ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฌธ์ž์—ด ๋‚ด์˜ ๋ฌธ์ž ์œ„์น˜๋ฅผ ์ฐพ๋Š” ๋“ฑ์˜ ๋ฌธ์ž์—ด ์กฐ์ž‘ ์ž‘์—…์ด ์šฉ์ดํ•˜๋‹ค.

๐Ÿ’ป Encoding In Java

์ž๋ฐ”๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ UTF-8 ๋ฐฉ์‹์„ ์ฑ„ํƒํ•œ๋‹ค. String.getBytes() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ž๋ฐ”์—์„œ ์ธ์ฝ”๋”ฉ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

String str = "ํ…Œ์ŠคํŠธ";
byte eucBytes[] = str.getBytes("euc-kr");

์ถ”๊ฐ€์ ์œผ๋กœ๋Š”, ์›น ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด URL ๊ด€๋ จํ•˜์—ฌ ์ธ์ฝ”๋”ฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ, ์ด ๋•Œ๋Š” URLEncoder / URLDecoder ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด, URL ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ์—๋Š” ๊ทœ์น™์ด ์žˆ๋Š”๋ฐ, ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๊ทœ์น™์„ ์‚ฌ์šฉํ•ด์„œ character set์„ ์ž˜ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.

๐Ÿ’ป ์˜ฌ๋ฐ”๋ฅธ ์ธ์ฝ”๋”ฉ์„ ์“ฐ๋Š” ๊ฒƒ์˜ ์ค‘์š”์„ฑ

์˜ฌ๋ฐ”๋ฅธ ์ธ์ฝ”๋”ฉ์˜ ์ค‘์š”์„ฑ์€ ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž๋ฅผ ๋””์ฝ”๋”ฉ ํ•  ๋•Œ ๋” ํฌ๊ฒŒ ๋Š๋‚„ ์ˆ˜ ์žˆ๋‹ค. "ํ…Œ์ŠคํŠธ" ๋ผ๋Š” ๋ฌธ์ž์—ด์„ EUC-KR ์ธ์ฝ”๋”ฉ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด C5D7 BDBA C6AE ์ด๋‹ค. (16์ง„์ˆ˜์ด๊ณ  ์ปดํ“จํ„ฐ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ). ์ด๋ฅผ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ธ์ฝ”๋”ฉ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ decode ํ•˜๋ฉด :

EUC-KR : ํ…Œ์ŠคํŠธ
ASCII : ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ
iso-8859-1 : ร…ร—ยฝยบร†ยฎ
UTF-8 : ๏ฟฝืฝ๏ฟฝฦฎ

์œ„์™€ ๊ฐ™์ด ์ œ๋Œ€๋กœ ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ป ๊ทธ๋Ÿผ ๋‹ค์‹œ, ์ถœ๋ ฅํ•  ๋•Œ ๋ฌธ์ž๊ฐ€ ๊นจ์ง€๋Š” ๋ฌธ์ œ๋Š”?

๊ทธ๋Ÿผ IDE ์ถœ๋ ฅ์ฐฝ์—์„œ ํ•œ๊ธ€ ๋กœ๊ทธ๊ฐ€ ๊นจ์กŒ๋˜ ๋ฌธ์ œ๋Š” ์ถœ๋ ฅ์ฐฝ์— ์‚ฌ์šฉ๋œ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹๊ณผ ์‹ค์ œ ๋ฌธ์ž์—ด์˜ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์ด ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ฒผ๋˜ ์ผ์ด๋ผ๊ณ  ๊ฒฐ๋ก ์ง€์„ ์ˆ˜ ์žˆ๋‹ค. ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ IntelliJ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” UTF-8์„ ๊ธฐ๋ณธ ์ธ์ฝ”๋”ฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ถœ๋ ฅ์ฐฝ์—์„œ ์‚ฌ์šฉํ•œ ๊ฑด CP949 ์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ธด ์ผ์ด์—ˆ๋‹ค. ์œ„์—์„œ ํ–ˆ๋“ฏ์ด, ์ถœ๋ ฅ์ฐฝ์˜ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์„ UTF-8๋กœ ๋ฐ”๊พธ์–ด ์คฌ๋”๋‹ˆ ํ•ด๊ฒฐ ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์šด์˜์ฒด์ œ๋งˆ๋‹ค, ํŒŒ์ผ๋งˆ๋‹ค, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๋งˆ๋‹ค ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์„ ์ž˜ ํ™•์ธํ•ด์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  , ์จ์•ผ ํ•œ๋‹ค.

profile
ํ•ญ์ƒ ์œ„๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ

0๊ฐœ์˜ ๋Œ“๊ธ€