Java эквивалент инвариантной культуры - PullRequest
24 голосов
/ 15 марта 2011

Я конвертирую следующий код C # в Java. Есть ли Java-эквивалент концепции инвариантной культуры .NET?

string upper = myString.ToUpperInvariant();

Поскольку Invariant Culture - это на самом деле просто культура США, я мог бы просто сделать что-то подобное на Java, но мне интересно, есть ли лучший способ:

String upper = myString.toUpperCase(Locale.US);

Ответы [ 2 ]

21 голосов
/ 15 марта 2011

Обновление: Java 6 представлена ​​Locale.ROOT, которая описывается как:

Это рассматривается как базовый языковой стандарт для всех языковых стандартов и используется в качестве нейтрального языкового / странового языкового стандарта для чувствительных к региональным настройкам операций.

Это, вероятно, лучше, чем использование US, но я не проверял его по приведенному ниже коду.


Нет, это в основном правильный путь. В то время как есть различия между культурой США и инвариантной культурой с точки зрения форматирования, я не верю, что они влияют на правила оболочки.

РЕДАКТИРОВАТЬ: На самом деле, программа быстрого тестирования показывает, что это символов, которые в верхнем регистре в .NET в США отличаются от символов в инвариантной культуре:

using System;
using System.Globalization;

class Test
{
    static void Main()
    {
        CultureInfo us = new CultureInfo("en-US");
        for (int i = 0; i < 65536; i++)
        {
            char c = (char) i;
            string s = c.ToString();
            if (s.ToUpperInvariant() != s.ToUpper(us))
            {
                Console.WriteLine(i.ToString("x4"));
            }
        }
    }    
}

Выход:

00b5
0131
017f
01c5
01c8
01cb
01f2
0345
0390
03b0
03c2
03d0
03d1
03d5
03d6
03f0
03f1
03f5
1e9b
1fbe

У меня нет времени сейчас на это смотреть, но это стоит исследовать. Я не знаю, применимы ли такие же различия в Java - вы, вероятно, захотите взять их пример и выяснить, что вы хотите, чтобы ваш код делал.

РЕДАКТИРОВАТЬ: И чтобы быть полным, стоит упомянуть, что он проверяет только отдельные символы ... тогда как вы на самом деле целые строки в верхнем регистре, которые могут иметь значение.

Рассматривая Java код для прописных букв, который, как представляется, имеет специфичное для локали поведение только для стран tr, az и lt. Я знаю, что tr - это Турция, но я не знаю насчет остальных ...

0 голосов
/ 16 марта 2011

Это выглядит наиболее инвариантным, который вы можете получить без использования любой локали.Если вам нужен расширенный Unicode (ранее UTF16), вам нужно будет перейти на решение codePoint (если вы не знаете о кодовых точках, оно вам не нужно :))

 static String toUpperCase(String s){
    char[] c = s.toCharArray();
    for (int i=0;i<c.length;i++){
        c[i]=Character.toUpperCase(c[i]);
    }
    return String.copyValueOf(c);  
 }
...