将语言环境与Java的toLowerCase()和toUpperCase()一起使用

时间:2012-06-16 11:40:49

标签: java string locale

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

我找到了一个类似这样的方法:

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

现在我读过使用某些Locale s,比如土耳其语,“返回 i(不带点) 而不是 我(带点) 。“

使用英国,美国,英国等Locale是否安全?应用于字符串时,它们之间是否存在很大差异?

Locale的首选String是哪个?

6 个答案:

答案 0 :(得分:61)

我认为你应该使用locale,

  

例如,土耳其语语言环境中的“TITLE”.toLowerCase()返回   “tıtle”,其中'ı'是LATIN SMALL LETTER DOTLESS I字符。至   获取区域设置不敏感字符串的正确结果,使用   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ı`
    }
}
  

在上面的程序中,查看前后的字符串长度   转换。它将是1和3.是之前字符串的长度   案件转换后不同。你的逻辑会去折腾   当你在这个场景中依赖字符串长度时。当你的程序   在不同的环境中执行,它可能会失败。这将是一个   代码审查很好。

     

为了使其更安全,您可以使用其他方法   toLowerCase(Locale.English)并始终将语言环境覆盖为英语。   但是你没有国际化。

     

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

reference 1
reference 2
reference 3


Dotless-i,是一个没有点的小写'i'。这个角色的大写字母是通常的“我”。还有另一个角色,“我有点”。这个字符的小写字母通常是小写的“i”。

你注意到了这个问题吗?这种不对称的转换导致编程中的严重问题。我们主要在Java应用程序中遇到这个问题,因为(IMHO)toLowerCase和toUpperCase函数的实现很差。

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

我之前在博客上发过两个严肃的例子:如果XPage位于名称中包含“I”的数据库中,脚本库中的名称为“i”,而XSP Manager出现错误则编译错误。

正如我所说,历史悠久。例如,在某些R7版本中,如果路由器名称以“I”开头,则无法向收件人发送消息。在R8之前,邮件报告代理未在土耳其语语言环境中运行。任何拥有土耳其语语言环境的人都无法安装Lotus Notes 8.5.1(这是真的!)。名单继续......

土耳其几乎没有beta测试人员,客户也不会因为这些问题而打开PMR。因此,这些问题不会成为开发团队的首要任务。

即使是Java团队也在最新文档中添加了一个特殊警告:

  

此方法对区域设置非常敏感,如果可能会产生意外结果   用于要解释语言环境的字符串   独立。示例是编程语言标识符,协议   键和HTML标记。例如,土耳其语中的“TITLE”.toLowerCase()   locale返回“tıtle”,其中'ı'是LATIN SMALL LETTER DOTLESS I   字符。要获得区域设置不敏感字符串的正确结果,   使用toLowerCase(Locale.ENGLISH)。

请阅读我无法发布所有信息的链接“这是对您的评论的回复”

答案 1 :(得分:6)

您可以为String的语言创建合适的区域设置。

例如:

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

将成为土耳其人的伎俩。

答案 2 :(得分:5)

String str = "CyBeRdRaGoN";

str = str.toLowerCase(); // str = "cyberdragon"

str = str.toUpperCase(); // str = "CYBERDRAGON"

您的应用程序将选择默认语言环境,因此如果有人将使用土耳其语语言环境运行您的应用程序,他将看到i没有点

答案 3 :(得分:0)

如果您使用此函数检查字符串(例如搜索)可以安全地使用小写或大写形式的字符串进行检查。您可以这样使用它:

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中搜索的情况。我添加了这个答案,它可以帮助那些有同样问题的人。

答案 4 :(得分:0)

在科特林

private fun changelowertoupper(): String {
        val str = "CyBeRdRaGoN"
        return str.toLowerCase(Locale.ROOT) // or Locale.getDefault()
    }

答案 5 :(得分:0)

如果您愿意,可以在 XML 端使用 android:textLocale="tr" 选项。

<TextView
android:text="inciler"
android:textAllCaps="true"
android:textLocale="tr" />

输出:İNCİLER