Java 使用默认区域设置的String.toLowerCase()的用途?

Java 使用默认区域设置的String.toLowerCase()的用途?,java,string,unicode,locale,case-sensitive,Java,String,Unicode,Locale,Case Sensitive,Java为String.toLowerCase和toUpperCase分别提供了两个重载。其中一个重载将区域设置作为参数,而另一个重载不接受任何参数并使用默认区域设置(Locale.getDefault()) 无参数变量可能无法按预期工作,因为大小写转换尊重国际化,并且默认区域设置依赖于系统。最值得注意的是,在土耳其语地区,小写字母i被转换为大写字母,并用虚线İ表示 这些方法的目的是什么?无参数变型有合法用途吗?或者可能只是设计错误?(与一些默认使用系统默认字符编码的I/O API没有什么不同。

Java为String.toLowerCase和toUpperCase分别提供了两个重载。其中一个重载将区域设置作为参数,而另一个重载不接受任何参数并使用默认区域设置(
Locale.getDefault()

无参数变量可能无法按预期工作,因为大小写转换尊重国际化,并且默认区域设置依赖于系统。最值得注意的是,在土耳其语地区,小写字母i被转换为大写字母,并用虚线İ表示


这些方法的目的是什么?无参数变型有合法用途吗?或者可能只是设计错误?(与一些默认使用系统默认字符编码的I/O API没有什么不同。)

我认为它们只是在大多数情况下都能工作的方便方法,因为真正需要I18n的应用程序在世界上的java应用程序中可能只占少数


如果您在java程序中为文件名硬编码unix路径,并尝试在windows框中运行,您也会得到错误的结果,这不是java的错。

我想这是一种“一次写入,随处运行”原则的实现

这是有意义的,因为您可以在JVM启动时提供默认语言环境作为运行时参数之一


此外,Java运行时还提供了一系列类似的日期和数字格式化方法。(
SimpleDateFormat
NumberFormat
等)

一些人认为默认区域设置和字符集确实是一个设计错误,没有任何有意义的用途。

如何限制“合法使用”?如果您出于某种原因想要转换任意文本的情况,那么假设文本使用默认语言环境的语言不是很明智吗?@jarnbjo这不是一个有效的假设,因为它会在不同的系统上产生不同的结果。您需要知道适当的区域设置,或者如果文本确实是任意的,您可以使用locale.ROOT或其他硬编码区域设置。相关:这表明默认区域设置和字符集是一个设计错误:我认为简单且无处不在的国际化是Java的设计目标之一。此外,更方便的重载应该调用
tolowcase(Locale.ROOT)
,而不是
tolowcase(Locale.getDefault())