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 ์ถ๋ ฅ ์ฐฝ์์ ๊นจ์ ธ์ ๋์ค๋ ๊ฒ์ ํ์ธํ๋ค. ์ด๋ฅผ ๊ณ ์น๊ธฐ ์ํด ๊ตฌ๊ธ๋ง์ ํ๋๋,
-Dfile.encoding=UTF-8
-Dconsole.encoding=UTF-8
์ด๋ฐ ์๋ฃจ์ ์ ์ ๊ณตํด์ ๋ฐ๋ผํด๋ดค๋๋ ํ๊ธ์ด ์ ๋์จ๋ค. UTF-8 ์ด๋ผ๊ณ ํ๋ฉด ๋ง์ฐํ๊ฒ ์ ๋์ฝ๋๋ฅผ ์ ์ฝ์ ์ ์๊ฒ ํ๋ ์ธ์ฝ๋ฉ์ด๋ผ๊ณ ๋ ์๊ณ ์์ง๋ง, ์ ํํ๊ฒ ๋ด๋ถ์ ์ผ๋ก ์ด ์ค์ ์ด ์์ฉํ๋์ง ๋ชจ๋ฅด๊ณ ์์ด์, ์ด๋ฅผ ๊ณต๋ถํ๊ณ ๊ณต์ ํ๋ ค๊ณ ํ๋ค.
์ฐ์ ์ฌ์ ์ ์ผ๋ก, Encoding ์ด๋ '~๋ฅผ ์ฝ๋ํํ๋ค' ๋ผ๋ ์๋ฏธ์ด๋ค. ์ปดํจํฐ๋ ์ธ๊ฐ์ ๋ฌธ์๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ์ธ์ด๋ก ๋ณํํ๋ ์์ ์ด ํ์ํ๊ธฐ์ ๊ฐ๊ฐ์ ๋ฌธ์๋ฅผ ์ปดํจํฐ ์ธ์ด๋ก ์ฝ๋ํ ํ๋ ๊ฒ์ด ํ์ํ๋ค.
๊ณต๋ถํ๋ฉด์ ์กฐ๊ธ ๋๋ผ๊ณ , ๋ ์ฌ๋ฐ์๋ ๋ถ๋ถ์ ๋จผ์ ๋์ง๋ ค๊ณ ํ๋ค :
U+1F600
์ ์ฝ๋๊ฐ ์ด๋ค ๊ฒ์ ์๋ฏธํ ๊น? ์์ด ? ํ๊ธ ? ์ซ์ ? ์ด๋ ๋๋ผ์ ์ธ์ด?
ํํธ๋ฅผ ์ฃผ์๋ฉด ๋ง๊ตญ๊ณตํต์ ์ธ์ด๋ผ๊ณ ํ ์ ์๊ฒ ๋ค.
์ด๊ฒ์ ์๊ณ , ๋ด ์๊ฐ๋ณด๋ค ๋ ๋ง์ ๊ฒ์ด ์ด "์ธ์ฝ๋ฉ"์ด๋ผ๋ ๊ณผ์ ์ ํตํด ์ปดํจํฐ์๊ฒ ์ธ์๋๊ณ ์๋ค๋ ๊ฒ์ ์์๋ค. ์ปดํจํฐ๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋ฌธ์๋ฅผ ์ซ์๋ก ๋ณํํ๋๋ฐ, ์ด๋ฅผ ๋ค์ ์ด์ง์๋ก ์นํํ๋ค. ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ด๋ถ์ ์ผ๋ก ์ด๋ค ๊ณผ์ ์ ํตํด ์ด ๋ณํ์ด ์ด๋ฃจ์ด์ง๋ ์ง, ๊ทธ๋ฆฌ๊ณ ๋ค์ํ ๋ณํ๋ฒ์๋ ์ด๋ค ๊ฒ๋ค์ด ์๋์ง, ๊ทธ๋ฆฌ๊ณ ์๋ชป๋ Encoding ์ ์ ํํ๊ฒ ๋๋ฉด ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ์์๋ณด์.
Encoding ์ด๋ ๋ฌธ์๋ฅผ ์ฝ๋๋ก ๋ณํํ๋ ๊ฒ์ด๊ณ , ๊ทธ ๋ฐ๋๋ก Decoding ์ด๋ ์ฝ๋๋ฅผ ๋ฌธ์๋ก ๋ณํํ๋ ๊ฒ์ด๋ค.
์ญ์ฌ์ ๋ํด ์กฐ๊ธ ์์๋ณด์๋ฉด, ASCII์ ํ์ ์ ์๋ ์ปดํจํฐ์ ์ ์กฐ์ ์ฒด๋ง๋ค ๊ฐ์์ ๋ฐฉ์์ผ๋ก ์ํ๋ฒณ, ์ซ์ ๋ฐ ๋ค๋ฅธ ๋ฌธ์๋ฅผ ํํํ๊ธฐ ๋๋ฌธ์, ์ด๋ค๊ฐ์ ๋ฐ์ดํฐ ๊ตํ์ด ์ด๋ ค์ ๋ค๊ณ ํ๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ASCII (American Standard Code for Information Interchange) ๋๋ ํ๊ตญ์ด๋ก ๋ฏธ๊ตญ์ ๋ณด๊ตํํ์ค๋ถํธ๊ฐ ํ์ด๋ฌ๋ค.
7๋นํธ๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ด๋ ์ฆ 128๊ฐ์ ๋ค๋ฅธ ๋ฌธ์๋ฅผ ํํํ ์ ์๋ค.000 0000 - NULL ๋ก ์์ํ์ฌ, ์์ด ๋์๋ฌธ์ ๋ฐ 10๊ฐ์ ์ซ์, 32๊ฐ์ ํน์ ๋ฌธ์ ๊ทธ๋ฆฌ๊ณ ํ๋์ ๊ณต๋ฐฑ ๋ฌธ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์ฒ์์๋ ASCII๋ก ๋ถ์กฑํจ์ด ์์์ง๋ง, PC๊ฐ ๋ ๋๋ฆฌ ๋ณด๊ธํ๋๊ณ , ์ธ๊ณํ๊ฐ ์งํ๋๋ฉฐ, ๊ฐ ๋ค๋ฅธ ๋๋ผ์ ์ธ์ด๋ฅผ ํํํ๋ ๊ฒ์ด ํ์ํด์ก๋ค. ๊ทธ๋์ ๋จ์ 1๋นํธ๋ ์ฌ์ฉํ์ฌ , ์ฆ 256 ๋ฌธ์๋ฅผ ํํ ํ ๊ฒ์ด ํ์ฅ ์์คํค (Extended ASCII) ์ฝ๋์ด๋ค. ๊ตญ๊ฐ๋ณ๋ก ๋ค๋ฅธ ๋ณํ์ด ์กด์ฌํ๋ค. ์๋ก ๋ค์ด์, ISO-8859-1 ~ ISO-8859-16 ๊ฐ ์๋๋ฐ, ISO-8859-1 ์ ์์ ๋ฝ์์ ๋ง์ด ์ฐ์ด๋ ๋ผํด์ด๋ฅผ ํฌํจํ ๋ฌธ์๊ฐ ์๋ค๊ณ ํ๋ค. ์ด๋ค ์ธ์ฝ๋ฉ ๊ธฐ๋ฒ์ ์ผ๋์ง ์์์ผ, ์ ํํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ํด์ํ ์ ์๋ค.
ASCII๋ก๋ ํ๊ธ์ ํํํ๊ธฐ์๋ ์ญ๋ถ์กฑ์ด๋ค. ์ด๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ์๊น?
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 ์ธ์ฝ๋ฉ : ?
๊ฐ๋ ์์ ์ ํ๋ค๊ฐ ๏ฟฝ ๋ผ๋ ๋ฌธ์๊ฐ ๋๋ฐฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ ํด์ํ ์ ์๋ ๋ฌธ์๋ฅผ ์๋ฏธํ๋ค. ์๋ชป๋ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ ํํ๋ฉด ์ด๋ฐ ํ์์ ๋ณผ ์ ์์ผ๋ ์ฃผ์ํ์.
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 - ์ ์ธ๊ณ์ ๋๋ถ๋ถ์ ๋ฌธ์๋ฅผ ํํํ ์ ์๋ ์ธ์ฝ๋ฉ ๋ฐฉ์์ด๋ค. 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๋ฐ์ดํธ๋ก ์ธ์ฝ๋ฉํ๋ค. ํ์ง๋ง ๊ณ ์ ๊ธธ์ด ๋ฌธ์์ด์ด๊ธฐ ๋๋ฌธ์, ๋ฌธ์์ด ๋ด์ ๋ฌธ์ ์์น๋ฅผ ์ฐพ๋ ๋ฑ์ ๋ฌธ์์ด ์กฐ์ ์์ ์ด ์ฉ์ดํ๋ค.
์๋ฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก 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๋ก ๋ฐ๊พธ์ด ์คฌ๋๋ ํด๊ฒฐ ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
์ด์์ฒด์ ๋ง๋ค, ํ์ผ๋ง๋ค, ์์ฉ ํ๋ก๊ทธ๋จ๋ง๋ค ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ ํ์ธํด์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ , ์จ์ผ ํ๋ค.