【问题标题】:How to correctly uppercase Greek words in .NET?如何在 .NET 中正确大写希腊语单词?
【发布时间】:2010-01-07 13:15:05
【问题描述】:

我们有 ASP.NET 应用程序,它在世界各地运行不同的客户端。在这个应用程序中,我们有每种语言的字典。在字典中,我们有小写的单词,有时出于排版的原因我们在代码中使用大写。

var greek= new CultureInfo("el-GR");
string grrr = "Πόλη";
string GRRR = grrr.ToUpper(greek); // "ΠΌΛΗ"

问题是:

...如果您使用大写字母 那么它们必须像这样出现:f.e. ΠΟΛΗΠΌΛΗ 不同,对所有人都一样 其他用大写字母写的词

那么在 .NET 中一般可以正确地将希腊单词大写吗?还是我应该为希腊大写字母编写自己的自定义算法?

他们如何在希腊解决这个问题?

【问题讨论】:

  • 你从哪里引用规则?
  • @AakashM:来自与客户的沟通。
  • 您是否验证了他们的要求实际上对一般希腊语是正确的,或者只是对他们正确?
  • @Jon Seigel:我认为这个要求是合理的。我一直在希腊度假,我没有看到带有变音符号 IIRC 的大写字母。我也搜索了一些希腊网站,也没有找到反例。
  • 是的,这个要求是有效的,唯一的例外是元音字符上的¨ 变音符号,但大写单词中通常不包含它。

标签: asp.net .net localization


【解决方案1】:

我怀疑如果el-GR 不能满足您的要求,您将不得不编写自己的方法。如果这就是你所需要的,不要认为你需要去完整的creating a custom CultureInfo。这很好,因为这看起来很繁琐。

我建议您阅读 this Michael Kaplan blog post 以及您可以从他那里找到的任何其他相关内容 - 他多年来一直在研究和撰写有关 i18n 和语言问题的文章,他的评论是我呼吁任何Windows 上的此类问题。

【讨论】:

    【解决方案2】:

    我对 ASP.Net 了解不多,但我知道如何在 Java 中做到这一点。

    如果字符是 Unicode,我只需用一些简单的替换对 ToUpper 的输出进行后处理,其中之一是将 \u038C (Ό) 转换为 \u039F (Ο) 或 \u0386 ( Ά) 到 \u0391 (Α)。

    从希腊语/科普特语代码页(\u0370 到 \u03ff)的外观来看,您只需要更改几个字符(6 或 7 个)。

    【讨论】:

    • 那是邪恶的。如果有一天客户心甘情愿地输入这样一个字符呢?
    • 在 cmets 中已经表明,大写的希腊语单词除了 Ἢ 词外永远不会有变音符号:“当一个词完全用大写字母书写时,永远不会使用变音符号;单词 Ἢ (“或") 是这个规则的一个例外" (见statemaster.com/encyclopedia/Diacritics-%28Greek-alphabet%29)
    • 所以?我作为客户,希望程序不要改变我自己写的大写,即使它包含这样的变音符号。我想在文本字段中保存什么取决于我,如果您的程序更改了我明确编写的文本,我将说服您的支持部门,直到他们哭出公司大楼。 ;) 好吧,也许有点夸张,但我的观点是,这将是一个快速而肮脏的解决方案,永远不会出现在生产系统中。
    • @MM,我明白这一点,但您不是客户,Jakub 是,他已声明他们必须以这种方式出现。如果您想提出不同的问题,请务必这样做。
    【解决方案3】:
    【解决方案4】:

    用正确的字符替换错误的字符怎么样:

    /// <summary>
    /// Returns the string to uppercase using Greek uppercase rules.
    /// </summary>
    /// <param name="source">The string that will be converted to uppercase</param>
    public static string ToUpperGreek(this string source)
    {
        Dictionary<char, char> mappings = new Dictionary<char, char>(){
            {'Ά','Α'}, {'Έ','Ε'}, {'Ή','Η'}, {'Ί','Ι'}, {'Ό','Ο'}, {'Ύ','Υ'}, {'Ώ','Ω'}
        };
    
        source = source.ToUpper();
    
        char[] result = new char[source.Length];
        for (int i = 0; i < result.Length; i++)
        {
            result[i] = mappings.ContainsKey(source[i]) ? mappings[source[i]] : source[i];
        }
    
        return new string(result);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 2012-03-25
      相关资源
      最近更新 更多