programing

Java의 ToLowerCase() 및 ToUpperCase()에서 Locales 사용

nicescript 2022. 9. 28. 22:02
반응형

Java의 ToLowerCase() 및 ToUpperCase()에서 Locales 사용

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

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

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

어떤 now now now now now now 。Locales는 터키어와 마찬가지로 i(점) 대신 i(점)를 반환합니다.

★★★★★★★★★★★★★★★★를 사용하는 것이 안전합니까?Locale아, 아, 아, 아, 아, 아?에에 적적 용용 이? ?? ?? ??

됩니까?Locale★★★★★★에Strings?s?

로케일을 사용하는 것이 좋을 것 같습니다.

예를 들어 터키어 로케일의 "TITLE.".toLowerCase()는 "tittle"을 반환합니다. 여기서 'i'는 LATIN SWARL LETTER DOTLESS I 문자입니다.로케일의 영향을 받지 않는 문자열에 대한 올바른 결과를 얻으려면 LowerCase(Locale)를 사용합니다.영어)

이러한 링크를 고객님의 문제에 대한 해결책으로 언급하고 있습니다.또, 「터키인」의 상황을 염두에 둘 필요가 있습니다.

**FROM THE LINKS**

toLowerCase()는 국제화(i18n)를 존중합니다.로케일에 관해서 대소문자의 변환을 실행합니다.LowerCase()에 호출하면 내부적으로 LowerCase(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이 될 거예요.예. 대소문자 변환 전후의 문자열 길이가 다릅니다.이 시나리오에서 문자열 길이에 의존하면 논리가 뒤바뀌게 됩니다.프로그램이 다른 환경에서 실행되면 실패할 수 있습니다.이것은 코드 리뷰에서 좋은 기회가 될 것이다.

보다 안전하게 하기 위해 LowerCase(Locale)에 다른 방법을 사용할 수 있습니다.영어) 및 로케일을 항상 영어로 덮어씁니다.하지만 당신은 국제화되지 않았습니다.

즉, 중요한 것은 로케일 고유의 To LowerCase()입니다.

참조 1
레퍼런스 2
레퍼런스 3


Dotless-i는 점이 없는 소문자 'i'입니다.이 문자의 대문자는 통상의 「I」입니다.또 '점 있는 나'라는 캐릭터가 있어요.이 문자의 소문자는 일반적인 소문자 "i"입니다.

당신은 문제를 알아차렸습니까?이러한 비정형 변환은 프로그래밍에 심각한 문제를 일으킵니다.이 문제는 주로 (IMHO)의 to Lower Case 함수 및 to Upper Case 함수 구현이 잘 되지 않기 때문에 Java 어플리케이션에서 발생합니다.

In Java, String.toLowerCase() method converts characters to lowercase according to the default locale. This causes problems if your application works in Turkish locale and especially if you are using this function for a file name or a url that must obey a certain character set.

I have blogged about two serious examples before: The compile errors with Script libraries with "i" in their names and XSP Manager's fault if an XPage is in a database with "I" in its name.

There is a long history, as I said. For instance in some R7 version, router was unable to send a message to a recipient if his/her name starts with "I". Message reporting agents was not running in Turkish locale until R8. Anyone with Turkish locale could not install Lotus Notes 8.5.1 (it's real!). The list goes on...

There is almost no beta tester from Turkey and customers don't open PMR for these problems. So these problems are not going up to the first priority for development teams.

Even Java team has added a special warning to the latest documentation:

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ıtle", where 'ı' is the LATIN SMALL LETTER DOTLESS I character. To obtain correct results for locale insensitive strings, use toLowerCase(Locale.ENGLISH).

적절한 로케일을 작성할 수 있습니다.String의 언어입니다.

For example:

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

will do the trick for Turkish.

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.

사용하셔도 .android:textLocale="tr"옵션을 지정합니다.

<TextView
android:text="inciler"
android:textAllCaps="true"
android:textLocale="tr" />

★★★★★İNCİLER

인코틀린

private fun changelowertoupper(): String {
        val str = "CyBeRdRaGoN"
        return str.lowercase()
    }

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

반응형