2016-08-25 9 views
7

toUpperCase()를 기본 로케일 또는 더 흥미롭게도 두 개의 인수 Locale 생성자와 함께 사용할 때 그리스어와 터키어에 문제가 있습니다.Android에서 toUpperCase가 두 개의 인수와 기본 그리스어와 터키어 로케일에 맞지 않습니다.

문제는 (또한 5.1.1 재현) 갤럭시 탭 S2 안드로이드 5.0.2
문제가 타이틀이 값을 고려하여 설정 앱과 MoreLocale 2

BOTH를 통해 재현에 발생합니다 Τέλος는

을 συνεδρίας

이 호출은 정상적으로 작동합니다.

title.toUpperCase(new Locale("el_GR")) 
title.toUpperCase(new Locale("el-GR")) 

두 가지 모두 올바른 결과를 생성합니다. 당신은 T와 P.

ΤΈΛΟΣ ΣΥΝΕΔΡΊΑΣ 후 밀접가 체크되어 표시를 보면

는 그러나, 나는 기본 로케일과 2 개의 인수 로케일 생성자에 대해 서로 다른 결과를 얻을.

이 내 태블릿의 기본 로케일은 :이 호출 할 때 일반를 toUpperCase()

public String toUpperCase() { 
    return CaseMapper.toUpperCase(Locale.getDefault(), this, value, offset, count); 
} 

에 사용되는

Locale.getDefault() == el_GR 

는 잘못된 결과를 반환합니다.

title.toUpperCase(new Locale("el","GR")) 
: 나는 새로운 로케일에 대한 두 개의 인수 생성자를 사용하는 경우

title.toUpperCase() 

주에게 T와 P.에 누락 된 눈금 표시

ΤΕΛΟΣ ΣΥΝΕΔΡΙΑΣ는

나는 같은 결과를 얻을 수

ΤΕΛΟΣ ΣΥΝΕΔΡΙΑΣ

응용 프로그램 시작 문제를 해결하지만 오히려 hackish입니다.

String language = Locale.getDefault().getLanguage(); 
String country = Locale.getDefault().getCountry(); 
Locale.setDefault(new Locale(language + "-" + country)); 

단순히 기본 로캘로 연기하는 것을 선호합니다.

+0

거기에 틱이있는 이유는 무엇입니까? 그건 나에게 맞는 것 같지 않아. –

+0

언어학자가 아니지만 어떻게 든 스트레스 표시를 제공합니다. http://www.foundalis.com/lan/grstress.htm 터키어도 비슷한 점을 사용하십시오. 이들이 대문자와 다르게 적용되기 때문에 터키어와 그리스어는 고유 한 대/소문자 변환 문제가 있습니다. – amhest

+0

오, 당신은 대문자 "τέλως συνεδρίασης"'를 시도하고 있습니다. 미안, 나는 억양없이 이것을 시도했다. –

답변

4

당신이 CaseMapper.java에 제리, 리투아니아어, 터키어와 그리스어 로케일을위한 특별 행동이 toUpperCase 방법 볼 수 있듯이 :

public static String toUpperCase(Locale locale, String s, int count) { 
    String languageCode = locale.getLanguage(); 
    if (languageCode.equals("tr") || languageCode.equals("az") || languageCode.equals("lt")) { 
     return ICU.toUpperCase(s, locale); 
    } 
    if (languageCode.equals("el")) { 
     return EL_UPPER.get().transliterate(s); 
    } 

    ... 
} 

가 왜 다른 결과가 사용 Locale의 종류에 따라 알았어?

의 생성 Locale의 다른 종류의 분석 해보자 :

locale = new Locale("el_GR"); 
Log.d(TAG, String.format("[el_GR] Language: '%s' ~ Country: '%s'", locale.getLanguage(), locale.getCountry())); 

locale = new Locale("el", "GR"); 
Log.d(TAG, String.format("[el, GR] Language: '%s' ~ Country: '%s'", locale.getLanguage(), locale.getCountry())); 

locale = Locale.getDefault(); //Device with el_GR language 
Log.d(TAG, String.format("[default] Language: '%s' ~ Country: '%s'", locale.getLanguage(), locale.getCountry())); 

을 이들은 얻은 결과입니다

[el_GR] Language: 'el_gr' ~ Country: '' 
[el, GR] Language: 'el' ~ Country: 'GR' 
[default] Language: 'el' ~ Country: 'GR' 

당신은에서 볼 수 있듯이 수동으로 하나의 매개 변수 언어로 Locale를 생성 el_gr 인 경우 다른 두 경우 대신 언어는 el입니다. 언어 코드가 tr, az, lt 또는 el 인 경우에만 toUpperCase의 동작이 달라집니다. 그렇지 않으면 정상적으로 작동합니다. 이러한 이유로 출력은 다릅니다.

불행히도 틱 마크를 원한다면 매개 변수가 하나만있는 Locale 생성자를 사용해야합니다.

+0

거의 완벽한 답변이지만 끝 부분 : "유일하게 실행 가능한 솔루션은 하나의 매개 변수로 Locale 생성자를 사용하는 것"입니다. 그건 맞지 않아. 새로운 로케일 ("el", "GR")을 사용할 수 있습니다. 또는 API 레벨 ≥21에 대한 Locale.forLanguageTag ("el-GR"). 새 로켈 ("el_GR")은 그리스어가 아닙니다. –

+0

'Locale.forLanguageTag ("el-GR")'같은 Locale을 생성하기 때문에'새로운 Locale ("el", "GR")' OP가 요청한대로 눈금을 얻지 마십시오. 틱 마크를 얻는 유일한 방법은'el'과 다른 언어로'Locale'을 사용하는 것입니다. 그래서'toUpper' 메쏘드는 문자열을 대문자로 사용하기 위해 표준 행동을 사용합니다. –