Java 相当于不变文化

2022-09-01 13:21:23

我正在将以下C#代码转换为Java。是否有与.NET不变文化概念等效的Java?

string upper = myString.ToUpperInvariant();

由于不变文化实际上只是美国文化,我可以在Java中做这样的事情,但我想知道是否有更好的方法:

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

答案 1

更新: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是土耳其,但我不知道其他人...


答案 2

这看起来是使用任何区域设置可以获得的最不变的 w/o。如果你关心扩展的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);  
 }

推荐