19

由于我针对的是 Android 的较新 SDK 版本,因此我收到了关于这行代码的警告:

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

当我将鼠标悬停在它上面时,它会说:

隐式使用默认语言环境是常见的错误来源:toUpperCase(Locale)改为使用。

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

我知道这就是答案,可以使用toUpperCase(Locale)但无法实施。Locale对象从何而来?

4

1 回答 1

32

您可以显式使用默认语言环境:

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

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

更完整的阅读:

一个常见的错误是在生成机器可读的输出时隐式使用默认语言环境。这往往适用于开发人员的测试设备(特别是因为许多开发人员使用 en_US),但在用户处于更复杂区域设置的设备上运行时会失败。

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

--Locale开发者文档

于 2012-11-23T21:13:29.913 回答