toUpperCaseLocale()vs toUpperCase() – 现在针对Android 4.2

由于我定位了一个更新的SDK版本的Android,我在这行代码中得到了一个警告:

return getString(R.string.usertab1).toUpperCase() 

当我徘徊在它上面,它说:

隐式使用缺省语言环境是bug的常见来源:请改为使用toUpperCase(Locale)

有谁知道如何消除这个错误? 为什么现在是使用这种方法的首选方法?

我得到这个答案,使用toUpperCase(Locale)但是实现它有困难。 Locale对象来自哪里?

Solutions Collecting From Web of "toUpperCaseLocale()vs toUpperCase() – 现在针对Android 4.2"

您可以明确地使用默认的区域设置:

 return getString(R.string.usertab1).toUpperCase(Locale.getDefault()); 

基本上,您不希望隐式地允许设备使用默认设置,因为这可能意味着您只是忽略了可能是问题的事实。 对于机器可读的内容,您可能需要指定一个特定的语言环境(如Locale.ENGLISH ),以确保始终获得所需的数据重用性。 为了显示用户,显式指定默认的语言环境应该没问题。

为了更完整的阅读:

一个常见的错误是在产生意味着机器可读的输出时隐式地使用默认的语言环境。 这往往在开发人员的testing设备上工作(特别是因为这么多的开发人员使用en_US),但在用户处于更复杂的区域设备上运行时失败。

例如,如果您正在格式化整数,某些语言环境将使用非ASCII十进制数字。 另外一个例子,如果你正在格式化浮点数,一些locales将使用','作为小数点, '.' 数字分组。 这对于人类可读的输出是正确的,但是如果呈现给另一台计算机可能会导致问题( parseDouble(String)不能分析这样的数字)。 你也应该警惕toLowerCase()toUpperCase()重载,它们不采用locale:例如在土耳其,字符'i''I'不会被转换为'I''i' 。 这是土耳其文字的正确行为(如用户input),但不适用于HTTP标头。

Locale开发人员文档