我希望代码能够在Java中将字符串中的所有字符转换为大写或小写。
我找到了一种类似这样的方法:
public static String changelowertoupper()
{
String str = "CyBeRdRaGoN";
str=str.toLowerCase(Locale.ENGLISH);
return str;
}
现在我读到使用某些Locale
s,例如土耳其语,“返回i(不带点)而不是i(带点)”。
使用Locale
像UK、US、ENGLISH等是否安全?当应用于字符串时,它们之间有什么大的区别吗?
对于字符串,哪个是最首选的语言环境?
我认为你应该使用语言环境,
例如,“标题”。土耳其语言环境中的toLowerCase()返回“tıtle”,其中“ı”是拉丁文小写字母无点I字符。要获得不区分区域设置的字符串的正确结果,请使用toLowerCase(locale.ENGLISH)。
我指的是这些链接作为解决您的问题,它有点要记住在你的情况"土耳其"
**FROM THE LINKS**
toLowerCase()尊重国际化(国际化)。它根据您的语言环境执行大小写转换。当您调用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)并始终将Locale重写为English。但是你没有国际化。
所以关键是,toLowerCase()是特定于语言环境的。
参考1
参考2
参考3
Dotless-i是一个不带点的小写“i”。这个字符的大写字母是通常的“I”。还有另一个字符,“I with dot”。这个字符的小写字母是通常的小写字母“i”。
你注意到这个问题了吗?这种不对称的转换导致了编程中的一个严重问题。我们主要在Java应用程序中面临这个问题,因为toLowerCase和toUpperCase函数的实现很差。
在Java中,字符串。方法根据默认区域设置将字符转换为小写。如果您的应用程序在土耳其语言环境中工作,尤其是当您将此函数用于必须遵守特定字符集的文件名或url时,这会导致问题。
我之前写过两个严肃的例子:名称中带有“i”的脚本库的编译错误,以及如果XPage位于名称中带有“I”的数据库中,XSP管理器的错误。
正如我所说,历史悠久。例如,在某些R7版本中,如果收件人的姓名以“我”开头,路由器就无法向他/她发送消息。消息报告代理直到R8才在土耳其语言环境中运行。任何拥有土耳其语言环境的人都无法安装Lotus Notes 8.5.1(这是真的!)。列表还在继续...
土耳其几乎没有beta测试人员,客户也不会为这些问题打开PMR。因此,这些问题并不是开发团队的首要任务。
甚至Java团队也在最新的留档中加入了特别警告:
此方法对语言环境敏感,如果用于旨在独立解释语言环境的字符串,可能会产生意想不到的结果。示例是编程语言标识符、协议键和超文本标记语言标签。例如,土耳其语语言环境中的“TITLE”. toLowerCase()返回“tötle”,其中“ri”是拉丁小字母DOTLESS I字符。要获得对语言环境不敏感的字符串的正确结果,请使用toLowerCase(Locale. ENGLISH)。
您可以为字符串的语言创建适当的语言环境。
例如:
toUpperCase(new Locale("tr","TR"));
这对土耳其人来说很有用。
String str = "CyBeRdRaGoN";
str = str.toLowerCase(); // str = "cyberdragon"
str = str.toUpperCase(); // str = "CYBERDRAGON"
您的应用程序将选择默认语言环境,因此,如果有人用土耳其语言环境运行您的应用程序,他将看到没有dot的i