使用Java';s toLowerCase()和toUpperCase()
我希望代码能够在Java中将字符串中的所有字符转换为大写或小写 我发现了一种类似这样的方法:使用Java';s toLowerCase()和toUpperCase(),java,string,locale,Java,String,Locale,我希望代码能够在Java中将字符串中的所有字符转换为大写或小写 我发现了一种类似这样的方法: public static String changelowertoupper() { String str = "CyBeRdRaGoN"; str=str.toLowerCase(Locale.ENGLISH); return str; } 现在我已经读到,使用某些Locales,比如土耳其语,“返回I(不带点),而不是I(带点)” 使用Loc
public static String changelowertoupper()
{
String str = "CyBeRdRaGoN";
str=str.toLowerCase(Locale.ENGLISH);
return str;
}
现在我已经读到,使用某些Locale
s,比如土耳其语,“返回I(不带点),而不是I(带点)”
使用Locale
s如英国、美国、英语等是否安全。?当应用于字符串时,它们之间有什么大的区别吗
对于String
s,哪个Locale
最受欢迎
String str = "CyBeRdRaGoN";
str = str.toLowerCase(); // str = "cyberdragon"
str = str.toUpperCase(); // str = "CYBERDRAGON"
您的应用程序将选择默认语言环境,因此,如果有人使用土耳其语和土耳其语语言环境运行您的应用程序,他将看到
i
without dot我认为您应该使用语言环境
例如,土耳其语言环境中的“TITLE”.toLowerCase()返回
“tıtle”,其中“ı”是拉丁文小写字母DOTLESS I字符。到
为不区分区域设置的字符串获取正确的结果,请使用
toLowerCase(Locale.ENGLISH)
我将这些链接作为您问题的解决方案
在你的“土耳其语”情况下,要记住这一点
toLowerCase()尊重国际化(i18n)。它执行
根据您的区域设置进行大小写转换。当你打电话的时候
toLowerCase(),内部toLowerCase(Locale.getDefault())正在获取
打电话。它是区域设置敏感的,您不应该在其周围编写逻辑
它可以独立地解释语言环境
在上面的程序中,查看前后的字符串长度
转换。将是1和3。是的,前面的字符串的长度
而大小写转换后就不同了。你的逻辑将受到质疑
当您依赖于此场景中的字符串长度时。当你的程序
在不同的环境中执行,它可能会失败。这将是一个巨大的挑战
代码审查中的好发现
为了更安全,您可以使用另一种方法
toLowerCase(Locale.English)并始终将区域设置重写为英语。
但是你没有国际化
所以关键是,toLowerCase()是特定于语言环境的
Dotless-i是不带点的小写“i”。这个字符的大写字母是通常的“I”。还有另一个字符,“我带点”。这个字符的小写字母是常用的小写字母“i” 你注意到问题了吗?这种非等速转换在编程中造成了严重的问题。由于toLowerCase和toUpperCase函数的(IMHO)实现较差,我们主要在Java应用程序中面临这个问题 在Java中,String.toLowerCase()方法根据默认区域设置将字符转换为小写。如果您的应用程序在土耳其语言环境中工作,尤其是当您将此函数用于必须遵守特定字符集的文件名或url时,这会导致问题 我以前在博客上写过两个严重的例子:名称中带有“I”的脚本库的编译错误,以及如果XPage位于名称中带有“I”的数据库中,XSP管理器的错误 正如我所说,历史悠久。例如,在某些R7版本中,如果收件人的姓名以“I”开头,路由器无法向收件人发送消息。直到R8,消息报告代理才在土耳其地区运行。任何具有土耳其语言环境的人都无法安装LotusNotes8.5.1(这是真的!)。名单还在继续 土耳其几乎没有beta测试人员,客户也不会为这些问题打开PMR。因此,这些问题并不是开发团队的首要任务 甚至Java团队也在最新文档中添加了一个特别警告: 此方法对区域设置敏感,如果 用于要在语言环境中进行解释的字符串 独立地。例如编程语言标识符、协议 键和HTML标记。例如,土耳其语中的“TITLE”.toLowerCase() locale返回“tıtle”,其中“ı”是拉丁文小写字母DOTLESS I 性格要获得不区分区域设置的字符串的正确结果, 使用小写(Locale.ENGLISH)
您可以为
字符串
的语言创建适当的区域设置
例如:
toUpperCase(new Locale("tr","TR"));
将对土耳其语执行此操作。如果您使用此函数检查字符串(例如搜索),则可以安全地使用小写或大写形式的字符串进行检查。您可以这样使用它:
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中搜索的情况下。我添加了这个答案,它可能会帮助有同样问题的人。在科特林
private fun changelowertoupper(): String {
val str = "CyBeRdRaGoN"
return str.toLowerCase(Locale.ROOT) // or Locale.getDefault()
}
如果需要,可以在XML端使用android:textLocale=“tr”选项
<TextView
android:text="inciler"
android:textAllCaps="true"
android:textLocale="tr" />
输出:
NCİLER
您尝试过完全不使用语言环境吗?我尝试过……它与语言环境类似。英语……但我仍然怀疑它是否有任何区别,因为土耳其语。。。。所以你说不使用语言环境就可以了….???你的应用程序将选择默认的语言环境,所以如果有人用土耳其语言环境运行你的应用程序,他将看到i
而不使用dot,这发生在我身上。我用来简化编程的一个技巧导致我的程序在Window的土耳其版本中出现故障。程序开始搜索“adjectıves.txt”而不是“形容词.txt”。因此,如果我指定Locale为ENGLISH或str.toLowerCase()。这样就可以了……而且我不必担心字符串长度……?@tchrist我的答案有一个问号,例如purposeU+0131拉丁文小写字母DOTLESS i
是“ı”,而不是“?”。在答案上打问号是错误的。这表明存在编码错误,而且还特别警告不要使用Unicode标准。把正确的代码点放在那里。永远不要用问号替换不可打印的代码点。“永远不会。”通常,我会同意你的意见,所以我对你的评论投了赞成票。然而,值得注意的是,在本例中,OP直接引用了toUpperCase()
和to的Javadoc
private fun changelowertoupper(): String {
val str = "CyBeRdRaGoN"
return str.toLowerCase(Locale.ROOT) // or Locale.getDefault()
}
<TextView
android:text="inciler"
android:textAllCaps="true"
android:textLocale="tr" />