如何在Android 4.2中使用toUppercase(locale)?

7

enter image description here我正在使用Android 4.2 SDK,但在这行代码上我一直收到警告:

String text0 = tagalogText.getText().toString();
String textA = text0.substring(0, 1).toUpperCase() + text0.substring(1).toLowerCase();

当我将鼠标悬停在上面时,它会显示:
Implicitly using the default locale is a common source of bugs: Use toUpperCase(Locale) instead.

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

我从 Java 中复制了代码,不是针对 Android 的 Java。 有人知道如何解决这个错误吗?为什么现在推荐使用这种方法?


你有没有查看过这个答案 https://dev59.com/gGgu5IYBdhLWcg3wzKEc 和这个答案 https://dev59.com/yGYr5IYBdhLWcg3wucew - surhidamatya
6个回答

5

只需清理项目即可。

我也遇到了同样的问题。我没有依赖默认的区域设置,并且明确尝试了Locale.US和Locale.English,但仍然收到黄色lint警告。清理后问题消失了。

string.toLowerCase(Locale.ENGLISH);

2
这是一个lint警告,不是错误。原因是默认语言环境应该用于用户界面数据 - 如果您正在呈现某些用户可能更喜欢以特定地区方式/格式查看的内容。
您需要决定是否使用默认语言环境:
- 如果这是将在幕后使用的字符串,并且您的架构希望此字符串在全球所有设备上保持一致,则应明确指定语言环境 - 通常为Locale.US。 - 如果这是用户界面字符串或者您的架构不在乎它在其他设备上是否不同(即仅在内部使用,而不期望以特定格式出现),则可以安全地忽略lint警告。

1
这是我的解决方案:
string.toUpperCase(getResources().getConfiguration().locale));

0

您没有表明是否得到了答案,因此可以尝试这个(类似的方法对我有用):

text0 = text0.substring(0, 1).toUpperCase();
text1 = text0.substring(1).toLowerCase();
String textA = text0 + text1;

看起来作业很关键。

如果可以,请告诉我。

保重。


嗨,我尝试使用你的代码,但它对我仍然不起作用。我可以有你的 Facebook 账号吗,这样我就可以联系你解决这个问题。 - Theresa Gamit
非常抱歉没有及时回复你。实际上,我刚看到这个消息,因为我不经常登录。我没有Facebook账号,但我很惊讶作业没能正常工作。如果你看到的信息只是一个警告,那么我建议你忽略它并继续进行。保重。 - Doug

0

这意味着依赖于默认的Locale可能会出现语言问题,因为它在不同的系统之间会有所不同。请改用以下方法:

text0.substring(0, 1).toUpperCase(Locale.US);

通常在安卓上会发生这种情况吗? - Theresa Gamit
这不是一个特定于Android的问题。 - Lesleh
其实,我是从PC版的Java代码中复制的,但当我将代码适配到Android时,发现它们确实有很大不同。我想知道为什么PC版的代码没有使用toUpperCase(Locale.US)方法呢? - Theresa Gamit
这不是一个错误,只是可能存在漏洞的潜在源头,因此Android添加了一个警告。 - Lesleh
H @lesleh。我在安卓方面还是新手.. 我尝试了你的代码,但警告仍然存在.. 我该怎么办?请帮帮我.. - Theresa Gamit
很奇怪,我发布的代码应该已经解决了这个问题。 - Lesleh

0

尝试使用

text0.substring(0, 1).toUpperCase(Locale.ENGLISH);

从这里文档开始

一个常见的错误是在生成面向机器的输出时隐式使用默认语言环境。这通常在开发人员的测试设备上运行良好(特别是因为许多开发人员使用en_US),但在运行用户所在语言环境更复杂的设备上失败。

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


这与警告所暗示的问题相同,即默认语言环境可能会引入错误。 - Lesleh
您的帖子最初提到了Locale.getDefault(),因此我才发表了评论。 - Lesleh
是的,我刚刚编辑了这个...在阅读文档后...抱歉我的编辑有些含糊不清。 - stinepike
我按照您说的做了,但是当我再次尝试悬停时,上面相同的语句仍然存在。 - Theresa Gamit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接