"์•ˆ๋…•, ์•„๋ฏธ๊ณ !"

"์ด์ œ ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ์ฃผ์ œ์ธ ์ธ์ฝ”๋”ฉ์„ ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค."

"์–ด๋””์„ ๊ฐ€ ์ด๋ฏธ ๊ฐ ๋ฌธ์ž์— ์ฝ”๋“œ(์ˆซ์ž)๊ฐ€ ์žˆ๋‹ค๋Š” ๋ง์„ ๋“ค์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ char ์œ ํ˜•์ด ๊ธฐํ˜ธ์™€ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

"์˜ˆ๋ฅผ ๋“ค์–ด ์˜์–ด ์•ŒํŒŒ๋ฒณ 'A'์˜ ์ฝ”๋“œ๋Š” 65, 'B'๋Š” 66, 'C'๋Š” 67 ๋“ฑ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ฌธ์ž, ์†Œ๋ฌธ์ž, ํ‚ค๋ฆด ๋ฌธ์ž, ์ค‘๊ตญ์–ด์— ๋Œ€ํ•œ ๊ณ ์œ  ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž(์˜ˆ, ๋งค์šฐ ๋งŽ์€ ์ฝ”๋“œ), ์ˆซ์ž ๋ฐ ๋‹ค์–‘ํ•œ ๊ธฐํ˜ธ. ์š”์ปจ๋Œ€ ๋ฌธ์ž๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค."

"๊ทธ๋ž˜์„œ, ๋ชจ๋“  ๋ฌธ์ž์™€ ๋ฌธ์ž๋Š” ์–ด๋–ค ์ˆซ์ž์— ํ•ด๋‹นํ•ฉ๋‹ˆ๊นŒ?"

"์ •ํ™•ํžˆ."

"๋ฌธ์ž๋Š” ์ˆซ์ž๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ๊ณ  ์ˆซ์ž๋Š” ๋ฌธ์ž๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Java๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋“ค ์‚ฌ์ด์˜ ์ฐจ์ด์ ์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค."

char c = 'A'; //The code (number) for 'A' is 65
c++; //Now c contains the number 66, which is the code for 'B'

"ํฅ๋ฏธ๋กœ์šด."

"๊ทธ๋ž˜์„œ ์ธ์ฝ”๋”ฉ์€ ์ผ๋ จ์˜ ๊ธฐํ˜ธ์™€ ๊ทธ์— ์ƒ์‘ํ•˜๋Š” ์ฝ”๋“œ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์ง€ ํ•˜๋‚˜์˜ ์ธ์ฝ”๋”ฉ์ด ๋ฐœ๋ช…๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฝค ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์—์•ผ ๊ณตํ†ต ๋ฒ”์šฉ ์ธ์ฝ”๋”ฉ์ธ ์œ ๋‹ˆ์ฝ”๋“œ๊ฐ€ ๋ฐœ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค."

"๊ทธ๋Ÿฌ๋‚˜ ์•„๋ฌด๋ฆฌ ๋งŽ์€ ๋ณดํŽธ์  ํ‘œ์ค€์ด ๋ฐœ๋ช…๋˜๋”๋ผ๋„ ์•„๋ฌด๋„ ์„œ๋‘˜๋Ÿฌ ์ด์ „ ํ‘œ์ค€์„ ํฌ๊ธฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ด ๋งŒํ™”์—์„œ์™€ ๊ฐ™์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค."

๋ฌธ์ž ์ธ์ฝ”๋”ฉ - 1

"Vincent์™€ Nick์ด ๊ทธ๋“ค๋งŒ์˜ ์ธ์ฝ”๋”ฉ์„ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์„ธ์š”."

"๋นˆ์„ผํŠธ์˜ ์ธ์ฝ”๋”ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค."
๋ฌธ์ž ์ธ์ฝ”๋”ฉ - 2

"๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ Nick์˜ ์ธ์ฝ”๋”ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค."
๋ฌธ์ž ์ธ์ฝ”๋”ฉ - 3

"์‹ฌ์ง€์–ด ๊ฐ™์€ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ฌธ์ž์— ๋Œ€ํ•œ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค."

"๋ฌธ์ž์—ด 'ABC-123'์ด Vincent์˜ ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์— ๊ธฐ๋ก๋˜๋ฉด ๋‹ค์Œ ๋ฐ”์ดํŠธ ์„ธํŠธ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค."
๋ฌธ์ž ์ธ์ฝ”๋”ฉ - 4

"๊ทธ๋ฆฌ๊ณ  ์ด์ œ Nick์˜ ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์ด ํŒŒ์ผ์„ ์ฝ์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค."

"๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ยซ345-IJKยป."

"๊ทธ๋ฆฌ๊ณ  ์ตœ์•…์˜ ์ƒํ™ฉ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ์ฝ”๋”ฉ์ด ํŒŒ์ผ์˜ ์–ด๋””์—๋„ ์ €์žฅ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์ถ”์ธกํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค."

"๊ธ€์Ž„, ๊ทธ๋“ค์€ ์–ด๋–ป๊ฒŒ ์ถ”์ธกํ•ฉ๋‹ˆ๊นŒ?"

"๊ทธ๊ฑด ๋‹ค๋ฅธ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ธ์ฝ”๋”ฉ ์ž‘์—… ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋“ฏ์ด Java์˜ ๋ฌธ์ž ํฌ๊ธฐ๋Š” 2๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Java ๋ฌธ์ž์—ด์€ ์œ ๋‹ˆ์ฝ”๋“œ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค."

"๊ทธ๋Ÿฌ๋‚˜ Java๋Š” ๋ฌธ์ž์—ด์„ ์•Œ๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์ธ์ฝ”๋”ฉ์˜ ๋ฐ”์ดํŠธ ์ง‘ํ•ฉ์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. String ํด๋ž˜์Šค์—๋Š” ์ด๋ฅผ ์œ„ํ•œ ํŠน์ˆ˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Java์—๋Š” ํŠน์ • ์ธ์ฝ”๋”ฉ์„ ์„ค๋ช…ํ•˜๋Š” ํŠน์ˆ˜ Charset ํด๋ž˜์Šค๋„ ์žˆ์Šต๋‹ˆ๋‹ค."

1) Java๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ์ธ์ฝ”๋”ฉ ๋ชฉ๋ก์„ ์–ด๋–ป๊ฒŒ ์–ป์Šต๋‹ˆ๊นŒ?

"์ด๋ฅผ ์œ„ํ•ด availableCharsets๋ผ๋Š” ํŠน๋ณ„ํ•œ ์ •์  ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. "์ด ๋ฉ”์„œ๋“œ๋Š” ์Œ ์„ธํŠธ(์ธ์ฝ”๋”ฉ ์ด๋ฆ„, ์ธ์ฝ”๋”ฉ์„ ์„ค๋ช…ํ•˜๋Š” ๊ฐœ์ฒด)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค."

SortedMap<String,Charset> charsets = Charset.availableCharsets();

"๊ฐ ์ธ์ฝ”๋”ฉ์—๋Š” ๊ณ ์œ ํ•œ ์ด๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. UTF-8, UTF-16, Windows-1251, KOI8-R,โ€ฆ

2) ํ˜„์žฌ ํ™œ์„ฑ ์ธ์ฝ”๋”ฉ(์œ ๋‹ˆ์ฝ”๋“œ)์„ ์–ด๋–ป๊ฒŒ ์–ป์Šต๋‹ˆ๊นŒ?

" ์ด๋ฅผ ์œ„ํ•œ defaultCharset ์ด๋ผ๋Š” ํŠน๋ณ„ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค .

Charset currentCharset = Charset.defaultCharset();

3) ๋ฌธ์ž์—ด์„ ํŠน์ • ์ธ์ฝ”๋”ฉ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๊นŒ?

"Java์—์„œ๋Š” Java๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์ธ์ฝ”๋”ฉ์—์„œ ๋ฌธ์ž์—ด์„ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

๋ฐฉ๋ฒ• ์˜ˆ
byte[] getBytes()
String s = "Good news, everyone!";
byte[] buffer = s.getBytes()
byte[] getBytes(Charset charset)
String s = "Good news, everyone!";
Charset koi8 = Charset.forName("KOI8-R");
byte[] buffer = s.getBytes(koi8);
byte[] getBytes(String charsetName)
String s = "Good news, everyone!";
byte[] buffer = s.getBytes("Windows-1251")

4) ํŒŒ์ผ์˜ ์ธ์ฝ”๋”ฉ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ํŒŒ์ผ์—์„œ ์ฝ์€ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

"ํ›จ์”ฌ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. String ํด๋ž˜์Šค์—๋Š” ํŠน๋ณ„ํ•œ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค."

๋ฐฉ๋ฒ• ์˜ˆ
String(byte bytes[])
byte[] buffer = new byte[1000];
inputStream.read(buffer);

String s = new String(buffer);
String(byte bytes[], Charset charset)
byte[] buffer = new byte[1000];
inputStream.read(buffer);

Charset koi8 = Charset.forName("KOI8-R");
String s = new String(buffer, koi8);
String(byte bytes[], String charsetName)
byte[] buffer = new byte[1000];
inputStream.read(buffer);

String s = new String(buffer, "Windows-1251");

5) ํ•œ ์ธ์ฝ”๋”ฉ์—์„œ ๋‹ค๋ฅธ ์ธ์ฝ”๋”ฉ์œผ๋กœ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๊นŒ?

"๋งŽ์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค."

Charset koi8 = Charset.forName("KOI8-R");
Charset windows1251 = Charset.forName("Windows-1251");

byte[] buffer = new byte[1000];
inputStream.read(buffer);
String s = new String(buffer, koi8);
buffer = s.getBytes(windows1251);
outputStream.write(buffer);

"๊ทธ๊ฒŒ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ๊ฑฐ์•ผ. ์žฌ๋ฏธ์žˆ๋Š” ์ˆ˜์—… ๊ณ ๋งˆ์›Œ, ๋ฆฌ์‹œ."