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

Zer*_*ato 5 string android locale

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

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...
}
Run Code Online (Sandbox Code Playgroud)

Nir*_*ula 5

文档所述

Locale.toString() 返回此 Locale 对象的字符串表示形式,包括语言、国家/地区、变体、脚本和扩展名,无论可用,如下所示:

language + "_" + country + "_" + (variant + "_#" | "#") + script + "-" + extensions
Run Code Online (Sandbox Code Playgroud)

语言总是小写,国家总是大写,脚本总是标题,扩展总是小写。
例如en_USen

Locale.toLanguageTag()返回相同的内容(语言、国家和变体),但作为标签。这里Tag指的是某些IETF 的 BCP 47标准(BCP = 'Best Current Practice')定义的语言、国家和变体的一些代码。
例如en-US
,我能看到的唯一区别是_-或者也可能是某些语言/国家/地区代码。

简而言之,它们都返回了String;一个返回Locale 的正常字符串表示,而后者返回一个字符串作为表示 locale 的格式良好的 IETF BCP 47 语言标签

该文档还建议toString仅在调试模式下使用:

此行为旨在支持调试并仅与预期语言、国家/地区和变体字段的 toString 以前的使用兼容。要将 Locale 表示为用于交换目的的 String,请使用 toLanguageTag()。

希望能帮助到你。