使用Java';s toLowerCase()和toUpperCase()

使用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

我希望代码能够在Java中将字符串中的所有字符转换为大写或小写

我发现了一种类似这样的方法:

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" />