gpt4 book ai didi

java - 将语言环境与 Java 的 toLowerCase() 和 toUpperCase() 一起使用

转载 作者:IT老高 更新时间:2023-10-28 20:22:05 26 4
gpt4 key购买 nike

我想要代码将字符串中的所有字符转换为 Java 中的大写或小写。

我找到了一个类似这样的方法:

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

现在我读到使用某些 Locales,比如土耳其语,“返回 i(不带点) 而不是 i(带点)。”

使用英国、美国、英语等Locale是否安全?应用于字符串时,它们之间有什么大的区别吗?

Strings 最喜欢哪个Locale

最佳答案

我认为你应该使用 locale ,

For instance, "TITLE".toLowerCase() in a Turkish locale returns"tıtle", where 'ı' is the LATIN SMALL LETTER DOTLESS I character. Toobtain correct results for locale insensitive strings, usetoLowerCase(Locale.ENGLISH).

我将这些链接称为解决您问题的方法并且在你的情况下要记住“土耳其语”

**FROM THE LINKS**

toLowerCase() respects internationalization (i18n). It performs thecase conversion with respect to your Locale. When you calltoLowerCase(), internally toLowerCase(Locale.getDefault()) is gettingcalled. It is locale sensitive and you should not write a logic aroundit interpreting locale independently.

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ı`
}
}

In the above program, look at the string length before and afterconversion. It will be 1 and 3. Yes the length of the string beforeand after case conversion is different. Your logic will go for a tosswhen you depend on string length on this scenario. When your programgets executed in a different environment, it may fail. This will be anice catch in code review.

To make it safer, you may use another methodtoLowerCase(Locale.English) and override the locale to English always.But then you are not internationalized.

So the crux is, toLowerCase() is locale specific.

reference 1
reference 2
reference 3


Dotless-i,是没有点的小写“i”。这个字符的大写是通常的“I”。还有一个字符,“I with dot”。这个字符的小写字母是通常的小写字母“i”。

你注意到问题了吗?这种非对称转换会导致编程中的严重问题。我们主要在 Java 应用程序中遇到这个问题,因为(恕我直言)toLowerCase 和 toUpperCase 函数的实现很差。

在 Java 中,String.toLowerCase() 方法根据默认语言环境将字符转换为小写。如果您的应用程序在土耳其语环境中运行,尤其是当您将此函数用于必须遵守特定字符集的文件名或 url 时,这会导致问题。

我之前在博客上写过两个严重的例子:名称中带有“i”的脚本库的编译错误以及如果 XPage 在名称中带有“I”的数据库中,则 XSP 管理器的错误。

正如我所说,历史悠久。例如,在某些 R7 版本中,如果收件人的姓名以“I”开头,则路由器无法向收件人发送消息。直到 R8,消息报告代理才在土耳其语言环境中运行。任何使用土耳其语言环境的人都无法安装 Lotus Notes 8.5.1(这是真的!)。名单还在继续……

土耳其几乎没有 Beta 版测试人员,客户也不会针对这些问题打开 PMR。所以这些问题并不是开发团队的首要任务。

甚至 Java 团队都在最新文档中添加了特别警告:

This method is locale sensitive, and may produce unexpected results ifused for strings that are intended to be interpreted localeindependently. Examples are programming language identifiers, protocolkeys, and HTML tags. For instance, "TITLE".toLowerCase() in a Turkishlocale returns "tıtle", where 'ı' is the LATIN SMALL LETTER DOTLESS Icharacter. To obtain correct results for locale insensitive strings,use toLowerCase(Locale.ENGLISH).

关于java - 将语言环境与 Java 的 toLowerCase() 和 toUpperCase() 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11063102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com