我正在将以下C#代码转换为Java。是否存在与Invariant Culture的.NET概念相当的Java?
string upper = myString.ToUpperInvariant();
由于Invariant Culture实际上只是美国文化,我可以在Java中做这样的事情,但我想知道是否有更好的方法:
String upper = myString.toUpperCase(Locale.US);
答案 0 :(得分:21)
更新:Java 6引入了Locale.ROOT
,其描述为:
这被视为所有语言环境的基本语言环境,并用作语言环境敏感操作的语言/国家/地区中性语言环境。
这可能比使用US更好,但我没有根据下面的代码检查它。
不,这基本上是正确的方法。虽然在格式方面美国文化和不变文化之间存在 差异,但我认为它们不会影响套管规则。
编辑:实际上,一个快速测试程序显示 字符在美国文化中以不同文化的方式在不变文化中以不同的方式表现出来:
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中是否会存在相同的差异 - 您可能希望对它们进行抽样并找出您希望代码执行的操作。
编辑:只是为了成为completist,值得一提的是,只检查单个字符......而你真的是整个字符串,这可以产生影响。
查看上层大小的 Java 代码,看起来只有tr,az和lt国家/地区的特定于语言环境的行为。我知道tr是土耳其,但我不知道其他人......
答案 1 :(得分:0)
这看起来是你使用任何Locale无法获得的最不变的。 如果您关心扩展的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);
}