当前位置: 首页 > 面试题库 >

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

陶璞
2023-03-14
问题内容

我想要代码将Java中字符串中的所有字符都转换为大写或小写。

我发现了这样的方法:

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

现在,我读到使用某些Locales(例如土耳其语)“返回 i(不带点) 而不是 i(带点)”

使用Locale英国,美国,英语等语言是否安全?应用于字符串时,它们之间有什么大区别吗?

哪个最Locale适合Strings?


问题答案:

我认为您应该使用语言环境,

例如,在土耳其语区域设置中的“ TITLE”
.toLowerCase()返回“tıtle”,其中“ı”是拉丁文小写字母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。是。大小写转换前后的字符串长度不同。当您在这种情况下依赖于字符串长度时,您的逻辑就会折腾。当您的程序在其他环境中执行时,它可能会失败。这将是代码检查中的一个不错的选择。

为了使其更html" target="_blank">安全,可以使用另一种方法toLowerCase(Locale.English)并将语言环境始终替换为English。但是那时您还没有国际化。

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

参考
参考

Dotless-i,是不带点的小写字母“ i”。该字符的大写字母是通常的“ I”。还有另一个字符,“我带点”。该字符的小写字母是通常的小写字母“ i”。

您注意到问题了吗?这种不对称的转换在编程中引起了严重的问题。由于(IMHO)toLowerCase和toUpperCase函数的实现较差,我们主要在Java应用程序中遇到此问题。

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

我以前在博客中介绍过两个严重的示例:名称为“ i”的脚本库的编译错误,以及如果XPage位于名称为“ I”的数据库中,则是XSP Manager的错误。

正如我所说,历史悠久。例如,在某些R7版本中,如果路由器的名称以“
I”开头,则路由器无法向收件人发送消息。直到R8,消息报告代理才在土耳其语区域中运行。任何具有土耳其语区域设置的人都无法安装Lotus Notes
8.5.1(这是真的!)。清单继续…

土耳其几乎没有beta测试仪,客户也不会针对这些问题打开PMR。因此,这些问题并不是开发团队的首要任务。

甚至Java团队也向最新文档添加了特殊警告:

此方法对语言环境敏感,并且如果用于打算独立解释语言环境的字符串,则可能会产生意外的结果。示例包括编程语言标识符,协议密钥和HTML标签。例如,在土耳其语区域设置中的“
TITLE”
.toLowerCase()返回“tıtle”,其中“ı”是拉丁文小写字母I字符。要获得对语言环境不敏感的字符串的正确结果,请使用toLowerCase(Locale.ENGLISH)。

请阅读我不愿张贴的所有链接“这是对您的评论的答复”



 类似资料:
  • 我希望代码能够在Java中将字符串中的所有字符转换为大写或小写。 我找到了一种类似这样的方法: 现在我读到使用某些s,例如土耳其语,“返回i(不带点)而不是i(带点)”。 使用像UK、US、ENGLISH等是否安全?当应用于字符串时,它们之间有什么大的区别吗? 对于字符串,哪个是最首选的语言环境?

  • 问题内容: 我用来将货币从BigDecimal格式化为字符串。按预期工作,问题在于我们的主要目标是荷兰市场,而默认的荷兰格式很奇怪。 让我解释一下,当格式化-125时,荷兰语将得到“€125-”(预期为“-€125”)。英国按预期方式提供“-£125.50”。 我可以检查语言环境是否为荷兰语,然后在每次我要设置小数格式时都提供一个模式。但是我更喜欢一个解决方案,它可以覆盖荷兰的格式设置。我在考虑以

  • 两部分:创建topologies 以及 使用其他语言来实现 spouts 和bolts 用另一种语言创建topologies 是比较容易的,因为topologies 用的是[thrift](link to storm.thrift) 的结构 用另一种语言实现 spouts 和 bolts 被称为“multilang components ”或“shelling ” 以下是协议的规范: Multil

  • 问题内容: 我刚刚安装了jre7,很惊讶地看到我的默认语言环境现在是en_US。对于jre6,它是de_CH。 jre7有什么不同?默认语言环境不再是操作系统之一吗?(顺便说一句,我正在使用Windows7) 谢谢你的回答。 编辑:我已经看到了 Category.FORMAT 的语言环境是“旧”的(de_CH)。区域设置为 Category.DISPLAY 从OS的语言的语言(在Windows中,

  • 问题内容: 我在Java语言环境中发现了许多缺少的国家/地区-如果我打印出可用语言环境的列表, 我缺少许多国家,包括尼日利亚,伊朗,吉尔吉斯斯坦和巴基斯坦。任何人都可以对此进行说明,或者是否有更好(更全面)的方法来获取Java国家列表? 1.6.0_16-b01 问题答案: 世界上的国家和地区之间没有一对一的映射。语言环境指定区域。它们旨在标记诸如语言多样性之类的东西。只是一个明确的例子:印度,斯

  • 问题内容: 我已经看过类似于此问题的各种问答,但是还没有找到解决方案。 我所拥有的一个枚举代表了观看电视指南的不同方式… 在NDroid 类中 …当用户更改视图时,事件处理程序会收到0-2的值,而我想做这样的事情… 在Android 事件处理程序中 我已经习惯了C#枚举和select / case语句,这些语句允许类似上面的内容,而且我知道Java的处理方式有所不同,但是我根本无法理解需要做什么。