2016-03-13 33 views
2

我有由NSLocale localeIdentifier產生的字符串值,我需要構造一個java.util.Locale。我有用於解析Java語言環境的org.apache.commons.lang3.LocaleUtils#toLocale,但這不適用於所有情況。例如,[email protected]=gregorianzh-Hans_TH等值導致java.lang.IllegalArgumentException如何將iOS NSLocale localeIdentifier轉換爲Java語言環境?

+1

我有同樣的問題。結束後檢查@字符並在其後切斷字符串。它的工作原理 - 但我不知道'zh-Hans_TH'問題​​,我懷疑有更多的特殊情況......所以我很好奇自己,如果有人提出更好的解決方案。 :-) – Tropper

+0

我正在做類似於處理@:'split(「@」)(0)'的事情。談談哈克,並且不夠... –

回答

2

看起來像org.apache.commons.lang3.LocaleUtils#toLocale不支持iOS語言環境的所有功能。蘋果有documentation describing the language and locale ID format。語言環境可以是下列格式之一:

  • [language designator]
  • [language designator]_[region designator]
  • [language designator]-[script designator]
  • [language designator]-[script designator]_[region designator]

哪裏[language designator]爲ISO 639,[region designator]是ISO 3166和[script designator]是ISO 15924這個文檔沒有定義@,但我認爲我們不需要它爲java.util.Locale

下面是用於匹配的iOS語言環境的java.util.regex.Pattern

public static final Pattern localePattern = Pattern.compile(
    "^(?<lang>\\p{Lower}{2,3})" + // always match lang 
    "(-(?<script>\\p{Upper}\\p{Lower}{3}))?" + // optional script 
    "(_(?<region>(\\p{Upper}{2}|\\p{Digit}{3})))?" + // optional region 
    "(_(?<variant>\\p{Alnum}+))?" + // optional variant 
    "(@.+)?$" // optional @ stuff 
); 

下面是從iOS區域構建java.util.Locale的方法。

public static Locale parse(String locale) { 
    final Matcher m = localePattern.matcher(locale); 
    if (m.find()) { 
     return new Locale.Builder() 
       .setLanguage(m.group("lang")) 
       .setScript(m.group("script")) 
       .setRegion(m.group("region")) 
       .setVariant(m.group("variant")) 
       .build(); 
    } else throw new IllegalArgumentException(locale); 
} 
相關問題