자바는 유니코드를 지원하는 프로그램 언어이다. 그렇기 때문에 왠만한 다국어 지원 문제는 별 탈없이 해결된다. 그러나 자바 프로그래머라면 한가지 주의해야 할 점이 있다. 자바의 문자열을 다루는 몇몇 함수들은 “Locale Sensitive”함수라는 것이다.
먼저 유니코드가 무엇인지에 대해서 짚고 넘어가자.
유니코드
> 정 의
유니코드(Unicode)는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이며, 유니코드 협회(Unicode Consortium)가 제정한다. 이 표준에는 ISO 10646 문자 집합, 문자 인코딩, 문자 정보 데이터베이스, 문자들을 다루기 위한 알고리즘 등을 포함하고 있다.
> 목 적
유니코드의 목적은 현존하는 수많은 문자 인코딩 방법들을 모두 유니코드로 교체하려는 것이다. 기존의 인코딩들은 그 규모나 범위 면에서 한정되어 있고, 다국어 환경에서는 서로 호환되지 않는 문제점이 있었다. 유니코드가 다양한 문자 집합들을 통합하는 데 성공하면서 유니코드는 컴퓨터 소프트웨어의 국제화와 지역화에 널리 사용되게 되었으며, 비교적 최근의 기술인 XML, 자바, 그리고 최신 운영 체제 등에서도 지원하고 있다.
원본 위치 [Wikipedia](https://ko.wikipedia.org/wiki/유니코드)
UTF-8
- UTF-8은 유니코드를 위한 가변 길이 문자 인코딩 방식 중 하나로, 켄 톰프슨과 롭 파이크가 만들었다
- UTF-8 인코딩은 유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지를 사용한다.
- 예를 들어서, U+0000부터 U+007F 범위에 있는 ASCII 문자들은 UTF-8에서 1바이트만으로 표시된다.
- 4바이트로 표현되는 문자는 모두 기본 다국어 평면(BMP) 바깥의 유니코드 문자이며, 거의 사용되지 않는다.
원본 위치 [Wikipedia](https://ko.wikipedia.org/wiki/UTF-8)
자바에서 문제되는 Locale Sensitive String 함수
다음과 같은 String 관련 함수를 사용할 때에는 Locale이 문제가 될 수 있다는 것을 고려해야 한다.
String.toLowerCase()
이번에 문제가 되었던 것도 터키어 때문이었다. 터키어에서는 영어의 i 대신에 라인 스몰 닷리스(?)를 쓰기 때문이었다. JSON과 같은 스트링 기반의 프로토콜을 쓰다보니 이러한 로케일 변화에 따른 영향도 충분히 고려하여 로직을 생각해야 한다.
설명 | 주의사항 |
Converts all of the characters in this String to lower case using the rules of the default locale. This is equivalent to calling toLowerCase(Locale.getDefault()). | Note: This method is locale sensitive, and may produce unexpected results if used for strings that are intended to be interpreted locale independently. Examples are programming language identifiers, protocol keys, and HTML tags. For instance, “TITLE”.toLowerCase() in a Turkish locale returns “t\u0131tle”, where ‘\u0131’ is the LATIN SMALL LETTER DOTLESS I character. To obtain correct results for locale insensitive strings, use toLowerCase(Locale.ENGLISH). |
댓글
댓글 쓰기