当前位置: 首页 > 知识库问答 >
问题:

将区域设置与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像UK、US、ENGLISH等是否安全?当应用于字符串时,它们之间有什么大的区别吗?

对于字符串,哪个是最首选的语言环境?

共有3个答案

曹成双
2023-03-14
String str = "CyBeRdRaGoN";

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

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

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

仉英朗
2023-03-14

您可以为字符串的语言创建适当的语言环境。

例如:

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

这对土耳其人来说很有用。

易品
2023-03-14

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

例如,“标题”。土耳其语言环境中的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)。

 类似资料:
  • 问题内容: 我想要代码将Java中字符串中的所有字符都转换为大写或小写。 我发现了这样的方法: 现在,我读到使用某些s(例如土耳其语)“返回 i(不带点) 而不是 i(带点)” 。 使用英国,美国,英语等语言是否安全?应用于字符串时,它们之间有什么大区别吗? 哪个最适合s? 问题答案: 我认为您应该使用语言环境, 例如,在土耳其语区域设置中的“ TITLE” .toLowerCase()返回“tı

  • 我正在开发一个应用程序,我显式地将应用程序的语言环境设置为阿拉伯语。然而,我想收集英语的电话号码。我如何才能将EditText和TextView的语言环境显式地设置为美国英语。 下面是我如何设置应用程序区域设置的。我有一门助手课 在我的活动中,我在中使用这个助手,如下所示: 如何分别为我们设置EditText或TextView的区域设置?

  • 我想强制我的Symfony 2.5应用程序的区域设置为。我希望这个区域设置用于strftime()函数。 我的: 我正在我的一个控制器中使用以下代码来调试: 当这样执行时,它显示:。 但是,当第一行未注释时,它会显示:,因此区域设置已安装在系统中并正常工作。 我如何使Symfony始终使用配置中指定的语言环境? $locale-a:

  • 问题内容: 我有一个字符串: 如果我使用function,那么它将返回相同的字符串,但我想获取。 问题出在哪里? 问题答案: 代码 正确打印“ ICECREAM”。但是,原始字符串c不变。Java中的字符串是不可变的,因此对该字符串的所有操作都会返回一个新副本。

  • 我在为我的React本机应用程序设置testID和accessibilityLabel时遇到了一个奇怪的问题,其目的是让Appium Inspector(Appium Desktop)可以看到iOS和Android应用程序上的“accessibility id”,问题如下: 如果testID是设置在一起的辅助标签,iOS的应用程序不显示"辅助ID"的组件,但android的应用程序。 如果我只设置

  • 我在一家使用Gmail发送和接收域电子邮件的公司工作。为了更清楚,让我们假设它是firstname@company.com.现在我的目标是制作一个简单的脚本,使用csv文件中的列表发送电子邮件。当我使用我的个人Gmail电子邮件时,代码工作正常,但当我将其更改为我的商业帐户时,问题就开始了——脚本似乎忽略了初始化步骤,因为它不是@Gmail。通用域名格式。 不确定是否需要,但现在我很乐意至少运行下