使用Java语言的toLowerCase()和toUpperCase()

我希望代码将所有string中的字符转换为Java中的大写或小写。

我发现了一个像这样的方法:

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

现在我已经读过使用某些Locale ,比如土耳其语,“返回我(没有点),而不是我(点)

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

哪个是最喜欢的StringLocale

我想你应该使用语言环境,

例如,土耳其语语言环境中的“TITLE”.toLowerCase()返回“tıtle”,其中“ı”是拉丁小写字母无我字符。 要获得区域设置不敏感string的正确结果,请使用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ı` } } 

在上面的程序中,查看转换前后的string长度。 它将是1和3.是的,大小写转换前后string的长度是不同的。 在这种情况下,当你依赖string长度的时候,你的逻辑将会抛弃。 当您的程序在不同的环境中执行时,可能会失败。 这将是一个很好的代码审查。

为了使它更安全,你可以使用另一种方法来使用LowCase(Locale.English),并且总是将locale重写为英文。 但是你没有国际化。

所以关键是,toLowerCase()是特定于语言环境的。

参考1
参考2
参考3

无点我,是一个小写字母'我'没有点。 这个字符的大写字母就是通常的“I”。 还有另一个字符,“我带点”。 这个字符的小写字母是通常的小写字母“i”。

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

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

我之前曾经讨论过两个严重的例子:如果一个XPage在一个数据库名称为“I”的数据库中,那么脚本库的名称中包含“i”的编译错误和XSP Manager的错误。

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

几乎没有土耳其的testing者,客户也不会为这些问题开放PMR。 所以这些问题不会成为开发团队的首要任务。

甚至Java团队也为最新的文档添加了一个特殊的警告:

此方法是区域设置敏感的,如果用于要独立解释区域设置的string,则可能会产生意外的结果。 示例是编程语言标识符,协议密钥和HTML标签。 例如,土耳其语语言环境中的“TITLE”.toLowerCase()返回“tıtle”,其中“ı”是拉丁小写字母无我字符。 要获得区域设置不敏感string的正确结果,请使用toLowerCase(Locale.ENGLISH)。

请阅读链接,我可以发布所有的“这是你的意见”

 String str = "CyBeRdRaGoN"; str = str.toLowerCase(); // str = "cyberdragon" str = str.toUpperCase(); // str = "CYBERDRAGON" 

你的应用程序将select默认的语言环境,所以如果有人用土耳其语的语言环境运行你的应用程序,他会看到i没有点

您可以为您的String的语言创build适当的区域设置。

例如:

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

将做土耳其的伎俩。

如果你正在使用这个函数来检查一个string(例如search)使用小写或大写forms的string来检查是安全的。 你可以像这样使用它:

 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... } 

我面对同样的问题,但在ListView中search的情况下。 我添加了这个答案,它可以帮助有同样问题的人。