Android - Locale.toString()和Locale.toLanguageTag()有什么区别?

5

我有一段代码,我想用一个Spinner视图组件来更改我的应用程序中的语言。在处理这个问题时,我意识到我可能没有使用最流畅的方法,但更有趣的是,我注意到两个看起来相同的字符串在比较时并不相等。为什么会这样,如果我想要“检查”语言是否是某种语言,该怎么办?

if (myLocale.toLanguageTag()=="sv") 
{
    //Changing language from Swedish to English
}
else 
{
    Toast.makeText(parent.getContext(),
      myLocale.toString(), Toast.LENGTH_SHORT).show();
   //Here, the toast will tell me what myLocale.toString is "sv", 
   //and so is myLocale.toLanguageTag(). Yet they are not equal...
}

你确定你的 myLocale.toLanguageTag() 也返回 sv 吗?如果两者都返回 sv,它们必须相等。在 if 条件中尝试使用 myLocale.toLanguageTag().equals("sv") - Niraj Niroula
嗯,有趣... if (myLocale.toLanguageTag().equals("sv")) 返回 true,但是 myLocale.toString()myLocale.toLanguageTag() 在 toast 中都显示为 "sv",然而它们并不相等。 - Zerato
请问一下,在你的代码中它们(指变量或条件)在哪里不相等,以及它们为何不相等? - Niraj Niroula
1
如果你在代码中比较那些对象的值时说“它们还不相等”,那么尝试用这种方式进行比较:myLocale.toLanguageTag().equals(myLocale.toString()) - Niraj Niroula
2
那个的原因 - Niraj Niroula
显示剩余2条评论
2个回答

5

文档所述:

Locale.toString() returns a string representation of this Locale object, consisting of language, country, variant, script, and extensions, whatever is available, as below:

language + "_" + country + "_" + (variant + "_#" | "#") + script + "-" + extensions

Language is always lower case, country is always upper case, script is always title case, and extensions are always lower case.
for example en_US, en

Locale.toLanguageTag() 返回相同的内容(语言、国家和变体),但作为标记。这里的“标记”是指由某个IETF的BCP 47标准定义的语言、国家和变体的代码(BCP =“最佳当前实践”)。
例如en-US
我唯一能看到的区别是_-,或者一些语言/国家代码。
简而言之,它们都返回String;一个返回区域设置的普通字符串表示形式,而后者返回作为表示区域设置的符合IETF BCP 47语言标记的字符串。 文档还建议仅在调试模式下使用toString
这种行为旨在支持调试,并与先前使用预期仅包含语言、国家和变体字段的toString兼容。要将区域设置表示为用于交换目的的字符串,请使用toLanguageTag()。
希望有所帮助。

感谢@Journey提供的精彩答案!它很有道理,但我不明白为什么如果我把这个字符串放在TextView或Toast中,这些信息就不会显示出来。 - Zerato
Locale.toLanguageTag() 返回最新的印度尼西亚语言标签 id-ID,而 Locale.toString() 为了向后兼容性将返回 in_ID。请参见 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6457127。 - Brett Y

-1

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