Java 等价于不变文化
Posted
技术标签:
【中文标题】Java 等价于不变文化【英文标题】:Java equivalent of Invariant Culture 【发布时间】:2011-03-15 18:49:12 【问题描述】:我正在将以下 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 是土耳其,但我不知道其他人......
【讨论】:
ouchy: az - 阿塞拜疆,它是立陶宛 Locale.ROOT 怎么样? (根据related question/answer here。) @AvPinzur:是的,这可能是最合适的。我会更新以提及它。【参考方案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);
【讨论】:
以上是关于Java 等价于不变文化的主要内容,如果未能解决你的问题,请参考以下文章
JS 等价于 Java 的 Collections.unmodifiableCollection