Programing

Java의 toLowerCase () 및 toUpperCase ()와 함께 로케일 사용

lottogame 2020. 12. 9. 07:42
반응형

Java의 toLowerCase () 및 toUpperCase ()와 함께 로케일 사용


Java에서 문자열의 모든 문자를 대문자 또는 소문자로 변환하는 코드를 원했습니다.

다음과 같은 방법을 찾았습니다.

public static String changelowertoupper()
{
         String str = "CyBeRdRaGoN";
         str=str.toLowerCase(Locale.ENGLISH);
         return str;
}

이제 Locale터키어와 같은 특정 s 를 사용하여 " i (점 포함) 대신 i ( 점없이) 반환"을 읽었습니다 . "

LocaleUK, US, ENGLISH 등과 같은 s 를 사용해도 안전 합니까? 현에 적용될 때 그들 사이에 큰 차이가 있습니까?

가장 선호하는 Locale위해 String의?


locale을 사용해야한다고 생각합니다.

예를 들어, 터키어 로케일에서 "TITLE".toLowerCase ()는 "tıtle"을 리턴합니다. 여기서 'ı'는 LATIN SMALL LETTER DOTLESS I 문자입니다. 로케일을 구분하지 않는 문자열에 대한 올바른 결과를 얻으려면 toLowerCase (Locale.ENGLISH)를 사용하십시오.

나는이 링크들을 당신의 문제에 대한 해결책이라고 부르며 당신의 상황에서 "터키어"를 염두에 두어야 할 점이 있습니다.

**FROM THE LINKS**

toLowerCase ()는 국제화 (i18n)를 존중합니다. 로케일과 관련하여 대소 문자 변환을 수행합니다. toLowerCase ()를 호출하면 내부적으로 toLowerCase (Locale.getDefault ())가 호출됩니다. 로케일에 민감하며 로케일을 독립적으로 해석하는 로직을 작성해서는 안됩니다.

import java.util.Locale;

public class ToLocaleTest {
    public static void main(String[] args) throws Exception {
        Locale.setDefault(new Locale("lt")); //setting Lithuanian as locale
        String str = "\u00cc";
    System.out.println("Before case conversion is "+str+
" and length is "+str.length());// Ì
        String lowerCaseStr = str.toLowerCase();
    System.out.println("Lower case is "+lowerCaseStr+
" and length is "+lowerCaseStr.length());// iı`
    }
}

위의 프로그램에서 변환 전후의 문자열 길이를 살펴보십시오. 1과 3이됩니다. 예 대소 문자 변환 전후의 문자열 길이가 다릅니다. 이 시나리오에서 문자열 길이에 의존 할 때 논리가 던져집니다. 프로그램이 다른 환경에서 실행되면 실패 할 수 있습니다. 이것은 코드 리뷰에서 좋은 캐치가 될 것입니다.

더 안전하게 만들기 위해 다른 메서드 toLowerCase (Locale.English)를 사용하고 로케일을 항상 영어로 재정의 할 수 있습니다. 그러나 당신은 국제화되지 않았습니다.

따라서 핵심은 toLowerCase ()가 로케일에 따라 다릅니다.

참조 1
참조 2
참조 3


Dotless-i는 점이없는 소문자 'i'입니다. 이 문자의 대문자는 일반적인 "I"입니다. 또 다른 캐릭터 "I with dot"이 있습니다. 이 문자의 소문자는 일반적인 소문자 "i"입니다.

문제를 발견 했습니까? 이 비대칭 변환은 프로그래밍에 심각한 문제를 일으 킵니다. 우리는 toLowerCase 및 toUpperCase 함수의 잘못된 구현 (IMHO)으로 인해 대부분 Java 애플리케이션에서이 문제에 직면합니다.

Java에서 String.toLowerCase () 메소드는 기본 로케일에 따라 문자를 소문자로 변환합니다. 애플리케이션이 터키어 로케일에서 작동하는 경우 특히 특정 문자 세트를 준수해야하는 파일 이름 또는 URL에이 함수를 사용하는 경우 문제가 발생합니다.

이전에 두 가지 심각한 예에 대해 블로그를 작성했습니다. 이름에 "i"가있는 스크립트 라이브러리의 컴파일 오류와 이름에 "I"가있는 데이터베이스에 XPage가있는 경우 XSP Manager의 오류입니다.

내가 말했듯이 오랜 역사가 있습니다. 예를 들어 일부 R7 버전에서 라우터 이름이 "I"로 시작하면 수신자에게 메시지를 보낼 수 없습니다. 메시지보고 에이전트는 R8까지 터키어 로케일에서 실행되지 않았습니다. 터키어 로케일을 사용하는 사람은 누구나 Lotus Notes 8.5.1을 설치할 수 없습니다 (실제입니다!). 목록은 계속됩니다 ...

터키의 베타 테스터는 거의 없으며 고객은 이러한 문제에 대해 PMR을 열지 않습니다. 따라서 이러한 문제는 개발 팀의 최우선 순위가 아닙니다.

Java 팀조차도 최신 문서에 특별한 경고를 추가했습니다.

이 방법은 로케일에 민감하며 로케일을 독립적으로 해석 할 문자열에 사용하면 예기치 않은 결과가 발생할 수 있습니다. 예로는 프로그래밍 언어 식별자, 프로토콜 키 및 HTML 태그가 있습니다. 예를 들어, 터키어 로케일에서 "TITLE".toLowerCase ()는 "tıtle"을 리턴합니다. 여기서 'ı'는 LATIN SMALL LETTER DOTLESS I 문자입니다. 로케일을 구분하지 않는 문자열에 대한 올바른 결과를 얻으려면 toLowerCase (Locale.ENGLISH)를 사용하십시오.

내가 게시 할 수없는 링크를 읽으십시오. "이것은 귀하의 의견에 대한 답변입니다"


String의 언어에 적합한 로케일을 만들 수 있습니다 .

예를 들면 :

toUpperCase(new Locale("tr","TR"));

터키어를위한 트릭을 할 것입니다.


String str = "CyBeRdRaGoN";

str = str.toLowerCase(); // str = "cyberdragon"

str = str.toUpperCase(); // str = "CYBERDRAGON"

애플리케이션은 기본 로케일을 선택하므로 누군가 터키어 로케일을 사용하여 터키어로 애플리케이션을 실행하면 i점없이 표시 됩니다.


If you are using this function for checking a string (e.g. search) It is safe to use the strings in a lowercase or uppercase form to check. You may use it like this:

if (mViewData.list.data[i].Name.toLowerCase(new Locale("tr", "TR"))
   .contains(mViewHolder.tctSearch.getText().toString().trim()
                                      .toLowerCase(new Locale("tr", "TR")))) {
    // your code here...
}

I confront the same issue but in a case of search in listview. I added this answer that it may help someone who has the same issue.


In kotlin

private fun changelowertoupper(): String {
        val str = "CyBeRdRaGoN"
        return str.toLowerCase(Locale.ROOT) // or Locale.getDefault()
    }

참고URL : https://stackoverflow.com/questions/11063102/using-locales-with-javas-tolowercase-and-touppercase

반응형