기본 콘텐츠로 건너뛰기

Java Case Sensitive 함수 사용시 주의 사항

자바는 유니코드를 지원하는 프로그램 언어이다. 그렇기 때문에 왠만한 다국어 지원 문제는 별 탈없이 해결된다. 그러나 자바 프로그래머라면 한가지 주의해야 할 점이 있다. 자바의 문자열을 다루는 몇몇 함수들은 “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).

댓글

이 블로그의 인기 게시물

AWS ELB 504 Error

AWS EC2  운영 중 가끔씩 볼 수 있는 에러가 있습니다. 대표적으로 다음의 세가지 502, 503, 504 입니다. 이 중에서 이번에 알아볼 문제는 HTTP 504 에러입니다 .  타임 아웃이 되어   Request 를 처리하지 못하는 상황이 됩니다 .   해결 방법부터 이야기 하자면 다음과 같이 웹서버의 Time-out 시간을 60 초 이상으로 늘리는 것입니다 . Web Server & Application Time-out >= 60 sec 그 이유는 다음과 같은 ELB의 특성 때문입니다. ELB는 클라이언트와 EC2 서버 양쪽으로 커넥션을 유지하고 있습니다. ELB는 클라이언트와  EC2 서버간의 커넥션을 관리하는 역할을 맡고 있습니다. 그래서 유효한 커넥션만을 남겨놓습니다. 이를 위해서 Time-out 시간을 가지고 이 시간동안 데이터가 송수신되지 않으면 연결을 끊습니다.  기본적으로 Elastic Load Balancing는 두 연결 모두에 대해 Time-out(유휴 시간) 시간을 60초로 되어 있습니다. 그렇기 때문에 HTTP 또는 HTTPS를 사용할 경우 "KeppAlive" 옵션을 사용하여 커넥션을 재활용해야 합니다. 이 때  ELB 커넥션도 재사용되기 때문에 CPU 사용률을 줄일 수 있습니다. Browser Time-out Opera 11.11 120 sec IE 9 60 sec Chrome 13 300 sec FireFox 4 115 sec 서버 로직 중에서 60초 이상 실행될 수 있는 부분이 있는 경우 504 에러를 자주 볼 수 있을 것입니다. 문제 해결을 위해서는 Web Server는 물론  Tomcat 설정 또한 60초 이상으로 변경해주어야 합니다. ...

Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Membase vs Neo4j comparison

번역 작업 원문 NoSQL DB 비교 분석 자료 MongoDB 구현 : C++ 특징 : 몇가지 SQL과 비슷한 속성을 가짐(Query, index 등) 라이센스 : AGPL 프로토콜 : Custom, binary(BSON) 특징 Master/slave replication(auto failover with replica sets) Sharding built-in Queries are javascript expressions Run arbitrary javascript functions server-side Better update-in-place than CouchDB Uses memory mapped files for data storage Performance over features Journaling (with --journal) is best turned on On 32bit system, limited to 2.5Gb An empty database takes up 192Mb GridFS to store big data + metadata (not actually an FS) Has geospatial indexing 주요 사용처 만약 다양한 쿼리가 필요하다면 map/reduce 함수가 아니라 인텍스를 선호한다면 big DB에서 좋은 성능을 바란다면  CouchDB를 사용하길 원하지만, filling up disks에 너무 많은 데이터 변화가 있다면 사용예 For most things that you would do with MySQL or PostgreSQL, but having predefined columns really holds you back. CouchDB 구현 :  Erlang 주요특징 : DB consistency, 쉬운 사용 라이센스 : Apache 프로토콜 : HTTP/REST 상세특징 Bi-directional r...

Cron expression

초 0-59 , - * / 분 0-59 , - * / 시 0-23 , - * / 일 1-31 , - * ? / L W 월 1-12 or JAN-DEC , - * / 요일 1-7 or SUN-SAT , - * ? / L # 년(옵션) 1970-2099 , - * / * 모든 값 ? 특정 값 없음 - 범위 지정에 사용 , 여러 값 지정 구분에 사용 / 초기값과 증가치 설정에 사용 L 지정할 수 있는 범위의 마지막 값 W 월~금요일 또는 가장 가까운 월/금요일 # 몇 번째 무슨 요일 2#1 => 첫 번째 월요일 예제) Expression Meaning 초분시일월주(년) "0 0 12 * * ?" 아무 요일, 매월, 매일 12:00:00 "0 15 10 ? * *" 모든 요일, 매월, 아무 날이나 10:15:00 "0 15 10 * * ?" 아무 요일, 매월, 매일 10:15:00 "0 15 10 * * ? *" 모든 연도, 아무 요일, 매월, 매일 10:15 "0 15 10 * * ? 2005" 2005년 아무 요일이나 매월, 매일 10:15 "0 * 14 * * ?" 아무 요일, 매월, 매일, 14시 매분 0초 "0 0/5 14 * * ?" 아무 요일, 매월, 매일, 14시 매 5분마다 0초 "0 0/5 14,18 * * ?" 아무 요일, 매월, 매일, 14시, 18시 매 5분마다 0초 "0 0-5 14 * * ?" 아무 요일, 매월, 매일, 14:00 부터 매 14:05까지 매 분 0초 "0 10,44 14 ? 3 WED" 3월의 매 주 수요일, 아무 날짜나 14:10:00, 14:44:00 "0 15 10 ? * MON-FRI" 월~금, 매월, 아무 날이나 10:15:00 "0 15 10 15 * ?...