Подтвердить что ты не робот

Java-эквивалент инвариантной культуры

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

string upper = myString.ToUpperInvariant();

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

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

Ответ 1

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

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

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


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

EDIT: На самом деле, программа быстрого тестирования показывает, что в культуре инвариантов по-разному используются символы, отличные от .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 - это Турция, но я не знаю о других...

Ответ 2

Это выглядит наиболее инвариантным, который вы можете получить без использования любой локали. Если вам нужен расширенный 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);  
 }