使用Java语言的toLowerCase()和toUpperCase()
我希望代码将所有string中的字符转换为Java中的大写或小写。
我发现了一个像这样的方法:
public static String changelowertoupper() { String str = "CyBeRdRaGoN"; str=str.toLowerCase(Locale.ENGLISH); return str; }
现在我已经读过使用某些Locale
,比如土耳其语,“返回我(没有点),而不是我(点) 。
使用英语,美国,英语等Locale
是否安全? 在应用于string时,它们之间有什么大的区别吗?
哪个是最喜欢的String
的Locale
?
我想你应该使用语言环境,
例如,土耳其语语言环境中的“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的情况下。 我添加了这个答案,它可以帮助有同样问题的人。