티스토리 뷰



이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501
이클립스를 사용하지 않고 메모장과 같은 윈도우즈용 기본 문서 편집기를 사용하여 안드로이드
어플리케이션을 개발하면 한글이 제대로 출력되지 않는 문제가 발생합니다. 이 문제는 안드로이드용
어플리케이션을 개발할 때 사용하는 자바 언어가 UTF-8 문자 인코딩를 사용하기 때문인데 메모장은
기본적으로 ANSI 문자 인코딩을 사용하기 때문에 한글 코드가 제대로 처리되지 않습니다.
따라서 메모장을 이용하여 안드로이드 어플리케이션을 개발할 때 한글을 사용하려면 메모장의
저장 방식을 ANSI 가 아닌 UTF-8 로 변경하여 저장해야 합니다. 메모장에서 UTF-8 인코딩 방식을
사용하려면 "다른 이름으로 저장" 항목을 사용하면 되지만 Microsoft 의 UTF-8 인코딩 방식이
조금 독특하여 javac 가 제대로 인식을 하지 못하는 문제가 발생합니다.
이 강좌에서는 이클립스를 사용하지 않은 상태에서 자바 소스나 리소스에 한글을 사용하는 방법과
메모장을 사용했을 때 발생하는 UTF-8 인코딩의 문제점을 해결하는 방법에 대해서 소개하겠습니다.
1. XML 형식의 레이아웃 리소스 파일 이용하기
이 방법은 XML 을 이용해서 컨트롤을 배치할 때 텍스트뷰나 버튼에 캡션을 명시해둘 때 사용할 수
있습니다. 예를 들어 main.xml 파일에서 한글로된 문장을 텍스트뷰에 출력한다고 했을 때 아래와
같이 텍스트뷰를 정의할 수 있습니다.
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="레이아웃 파일에 직접 입력한 문자열입니다."
/>
그러나 위와 같이 한글을 입력한 뒤 컴파일을 하면 에러가 발생할 수도 있습니다. 문자 인코딩시에
영문 외의 문자는 ANSI 인코딩을 사용한 것과 UTF-8 인코딩을 사용한 데이터가 상이하기 때문에
만약 XML 파일이 ANSI 인코딩을 사용했다면 컴파일러가 해당 문자를 인식할 수 없기 때문입니다.
그래서 위와 같은 XML 형식의 파일에서 영문이 아닌 문자를 사용할 때에는 반드시 UTF-8 인코딩을
사용하여 파일을 저장해야합니다. 만약 ANSI 인코딩으로 파일이 저장되어 있는 경우에는 아래와 같은
순서로 인코딩을 변경해줍니다.
메모장의 파일 -> 다른 이름으로 저장 -> 다이얼로그창의 하단에 인코딩을 UTF-8 로 변경 -> 저장
이렇게 파일의 인코딩을 변경해주면 이것과 관련된 컴파일 에러는 발생하지 않을 것입니다.
2. XML 형식의 string 리소스 파일 이용하기
안드로이드용 어플리케이션을 개발할 때 문자 변경을 수월하게 하기위해서 문자열만 따로 관리하는
strings.xml 파일을 이용할 수 있습니다. 해당 파일은 프로젝트 폴더의 res/values 에 있으며
아래와 같이 문자열을 정의해둘 수 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">간단한 한글 출력 예제!!</string>
<string name="xml_str">XML 에서 설정한 문자열 리소스입니다!</string>
<string name="code_str">자바 소스 코드에서 설정한 문자열 리소스입니다!</string>
</resources>
위의 XML 코드에서도 한글 문자열을 사용하기 때문에 파일의 인코딩이 무엇이냐에 따라서 에러가
발생할 수 있습니다. 그러므로 파일 인코딩의 형태가 UTF-8 인지 확인하고 컴파일하면 별다른 문제가
생기지 않을 것입니다.
위와 같이 정의된 문자열은 해당 문자열을 직접 사용하는 대신 <string> 요소의 name 속성에 지정한
값을 통해서 간접적으로 문자열을 사용할 수 있습니다. string 리소스에 정의된 문자열을 사용하는
방법은 다음과 같습니다.
2.1 레이아웃 리소스 파일에서 사용하기
텍스트뷰나 버튼의 캡션명을 지정할 때 1번 항목처럼 직접 문자열을 구성하는 것이 아니라
strings.xml 에 정의한 문자열을 간접적으로 사용하는 것입니다.
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/xml_str"
/>
위와 같이 구성한 텍스트뷰는 "XML 에서 설정한 문자열 리소스입니다!" 라는 문자열을 출력하게
됩니다.
2.2 자바 소스 파일에서 사용하기
레이아웃 리소스 파일에서 미리 문자열을 지정할 수 없거나 어플리케이션이 실행되는 도중에
컨트롤의 캡션이 변경되는 경우에는 아래와 같이 사용할 수 있습니다.
// tv_xml_content 라는 ID 를 가진 텍스트뷰를 얻는다.
TextView tv = (TextView) findViewById(R.id.tv_xml_content);
// code_str 이라는 string 리소스를 가져온다.
String str = getString(R.string.code_str);
// 텍스트뷰에 해당 문자열을 출력한다.
// "자바 소스 코드에서 설정한 문자열 리소스입니다!" 가 출력된다.
tv.setText(str);
3. 자바 소스코드에서 한글 직접 입력하기
위에서도 언급했듯이 자바는 UTF-8 문자 인코딩을 사용합니다. 영문의 경우에는 UTF-8 형식과
ASCII 형식이 동일하게 문자를 부호화하기 때문에 영문으로 구성된 자바 소스 파일이 ANSI 인코딩을
사용하더라도 문제가 발생하지 않습니다. 그러나 영문 외의 문자는 두가지 인코딩 방식이 서로 다르게
문자를 부호화하기 때문에 소스 코드에서 한글을 사용할 때에는 자바 소스 파일을 UTF-8 인코딩으로
변경해주어야 합니다.
그러나 다른 XML 파일들이 UTF-8 인코딩으로 변경하면 문제가 해결되었던 것과 달리 자바 소스
코드는 이것만으로 문제가 해결되지 않고 컴파일시 아래와 같은 에러가 발생할 수 있습니다.
DisplayKoreanAppActivity.java:1: illegal character: \65279
[javac] ?package com.example.DisplayKorean;
[javac] ^
[javac] 1 error
자바 소스 코드의 첫번째 줄에는 package com.example.DisplayKorean; 가 적혀 있지만 컴파일러는
맨 앞에 다른 문자가 있는 것으로 인식하여 컴파일할 수 없다고 에러를 발생 시킵니다. 이런 문제는
메모장이 UTF-8 인코딩으로 파일을 저장할 때 사용하는 BOM 때문에 발생하는 것입니다.
BOM 은 Byte Order Mark 의 약자로 여러가지 종류의 유니코드 인코딩을 구별해주는 역할을 합니다.
이것은 문서의 가장 서두에 2 ~ 4 바이트의 보이지 않는 구분자를 삽입하여 문서를 해석할 때 해당
구분자로 어떤 유니코드 인코딩을 사용하였는지 확인하기 위해서 사용되는 것입니다.
BOM 을 사용할 수 있는 유니코드 인코딩 방식은 5 가지이며 각 인코딩의 BOM 값은 아래와 같습니다.

인코딩

BOM

UTF-8 0xEF 0xBB 0xBF
UTF-16 (Big Endian) 0xFE 0xFF
UTF-16 (Little Endian) 0xFF 0xFE
UTF-32 (Big Endian) 0x00 0x00 0xFE 0xFF
UTF-32 (Little Endian) 0xFF 0xFe 0x00 0x00
위의 표에서 정리한 BOM 은 자바 컴파일러가 해당 BOM 이 추가된 소스 파일을 컴파일 할 때 알 수
없는 문자로 인식하여 에러를 발생시킬 수 있습니다. 특히 UTF-8 을 사용할 때 더욱 주의해야 합니다.
윈도우즈에서 제공하는 문서 편집기에서는 UTF 인코딩으로 파일을 구성할 때 BOM 을 선두에 항상
추가하기 때문에 가능하면 BOM 의 사용 여부를 옵션으로 선택할 수 있는 문서 편집기를 사용하는
것이 좋으며, 만약 반드시 메모장으로 소스 파일을 구성해야 한다면 이 자료에 첨부된 프로그램으로
해당 파일의 BOM 을 제거하는 작업을 해주어야 합니다.
(해당 프로그램은 UTF-8 인코딩으로 저장된 파일만 BOM 을 제거합니다.)
해당 프로그램으로 BOM 이 제거된 파일을 메모장에서 읽어들일 수는 있지만 파일을 저장할 때마다
BOM 이 다시 추가되기때문에 컴파일을 할때마다 수정된 소스 파일에서 BOM 을 제거해야하는
불편함이 있습니다.
소스 코드에 한글을 입력할 때에는 아래의 코드처럼 평소에 영문을 사용하듯이 하시면 됩니다.
// 텍스트뷰에 한글 문자열을 설정한다.
TextView tv = (TextView) findViewById(R.id.tv_code_content);
tv.setText("소스코드에서 직접 입력한 문자열입니다!!");
4. 실행 화면
아래의 그림은 여러개의 텍스트뷰에 위에서 설명한 한글을 사용하는 여러가지 방법을 이용하여
한글을 출력한 것입니다.
※ BOM 제거프로그램은 "파일 추가", "파일 삭제", "BOM 제거" 세개의 버튼과 파일 경로가 출력되는
리스트박스로 구성되어 있습니다. BOM 을 제거하고자 하는 파일이 있으면 "파일 추가" 버튼을
이용해서 리스트 박스에 추가하거나 프로그램에 해당 파일을 드래그 앤 드랍하여 추가하고,
"BOM 제거" 버튼을 누르면 됩니다.

 

댓글