由于我定位了较新的Android版SDK,因此我收到了有关此行代码的警告:
return getString(R.string.usertab1).toUpperCase()
当我将鼠标悬停在它上面时,它会说:
隐式使用默认语言环境是常见的错误来源:请改用
toUpperCase(Locale)
。
有谁知道如何删除此错误?为什么它现在是使用这种方法的首选方式?
我知道这是答案,使用toUpperCase(Locale)
但是无法实现它。 Locale
对象来自哪里?
答案 0 :(得分:32)
您可以显式使用默认语言环境:
return getString(R.string.usertab1).toUpperCase(Locale.getDefault());
基本上,您不希望隐式地允许设备使用默认设置,因为这可能意味着您只是忽略了它可能是一个问题的事实。对于机器可读的内容,您可能需要指定特定的区域设置(例如Locale.ENGLISH
),以确保始终从数据中获得所需的可重用性。为了显示用户,显式指定默认语言环境应该没问题。
更完整的阅读:
一个常见的错误是在生成意味着机器可读的输出时隐式使用默认语言环境。这往往适用于开发人员的测试设备(特别是因为许多开发人员使用en_US),但在用户处于更复杂的语言环境的设备上运行时会失败。
例如,如果要格式化整数,某些区域设置将使用非ASCII十进制数字。另一个例子是,如果要格式化浮点数,某些语言环境将使用
','
作为小数点,使用'.'
进行数字分组。这对于人类可读输出是正确的,但如果呈现给另一台计算机可能会导致问题(例如,parseDouble(String)
无法解析这样的数字)。您还应该警惕不采用区域设置的toLowerCase()
和toUpperCase()
重载:例如,在土耳其,字符'i'
和'I'
将不会转换为'I'
和'i'
。这是土耳其语文本(例如用户输入)的正确行为,但不适用于HTTP标头。