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 等价于不变文化的主要内容,如果未能解决你的问题,请参考以下文章

Java 等价于 Python repr()?

Java 等价于 Python 字典

JS 等价于 Java 的 Collections.unmodifiableCollection

等价于 C++ 中 Java 的 IllegalArgumentException

C++ 等价于 Java 的 BlockingQueue

Python 等价于 Java StringBuffer?