使用非英语字符(unicode)将字符串转换为标题案例

时间:2011-12-11 21:16:51

标签: c# unicode

我试图将非英语字符串(希腊语)转换为标题字符串 我确实试过这个链接建议,但没有运气,所有的角色都得到了大写 Converting string to title case

我如何使用Unicode字符?

3 个答案:

答案 0 :(得分:1)

所有字符都是Unicode字符。我们说英语的人不使用来自另一个宇宙的魔法非Unicode字符,英语中使用的字符字符也不是那么模糊,以至于不是Unicode。

您没有准确详细说明使用TextInfo尝试的内容,并且您链接的答案不是很详细。当我尝试:

CurrentCulture.TextInfo.ToTitleCase("English here, then some Greek: Ποικιλόθρον', ἀθάνατ' ἀφρόδιτα, παῖ δίος, δολόπλοκε, λίσσομαί σε μή μ' ἄσαισι μήτ' ὀνίαισι δάμνα, πότνια, θῦμον·")

我回来了:

English Here, Then Some Greek: Ποικιλόθρον', Ἀθάνατ' Ἀφρόδιτα, Παῖ Δίος, Δολόπλοκε, Λίσσομαί Σε Μή Μ' Ἄσαισι Μήτ' Ὀνίαισι Δάμνα, Πότνια, Θῦμον·

但是,如果我从大写字母开始:

System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase("ENGLISH HERE, THEN SOME GREEK: ΠΟΙΚΙΛΌΘΡΟΝ', ἈΘΆΝΑΤ' ἈΦΡΌΔΙΤΑ, ΠΑῖ ΔΊΟΣ, ΔΟΛΌΠΛΟΚΕ, ΛΊΣΣΟΜΑΊ ΣΕ ΜΉ Μ' ἌΣΑΙΣΙ ΜΉΤ' ὈΝΊΑΙΣΙ ΔΆΜΝΑ, ΠΌΤΝΙΑ, ΘῦΜΟΝ·")

我像你描述的那样大写。你也是从大写开始的吗?

标题案例保留所有大写单词不变,以避免破坏缩写词如“.NET”,“NATO”,“ΙΧΘΥΣ”等。如果您需要处理此问题,请先执行ToLower:

var ti = System.Globalization.CultureInfo.CurrentCulture.TextInfo;
return ti.ToTitleCase(ti.ToLower("ENGLISH HERE, THEN SOME GREEK: ΠΟΙΚΙΛΌΘΡΟΝ', ἈΘΆΝΑΤ' ἈΦΡΌΔΙΤΑ, ΠΑῖ ΔΊΟΣ, ΔΟΛΌΠΛΟΚΕ, ΛΊΣΣΟΜΑΊ ΣΕ ΜΉ Μ' ἌΣΑΙΣΙ ΜΉΤ' ὈΝΊΑΙΣΙ ΔΆΜΝΑ, ΠΌΤΝΙΑ, ΘῦΜΟΝ·"));

答案 1 :(得分:1)

希腊语对于ToTitleCase来说并不是最简单的语言。

TextInfo ti = new CultureInfo("el-GR", false).TextInfo; 

实验1:

Console.WriteLine(ti.ToTitleCase("εθνικό χρέος"));

输出结果为:ΕθνικόΧρέος

实验2:

Console.WriteLine(ti.ToTitleCase("ΕΘΝΙΚΟ ΧΡΕΟΣ"));

输出结果为:ΕΘΝΙΚΟΧΡΕΟΣ

实验3:

Console.WriteLine(ti.ToTitleCase("ΕΘΝΙΚΟ ΧΡΕΟΣ".ToLower()));

输出结果为:ΕθνικοΧρεοσ

输出1和3不同。输出3缺少变音符号(希腊语中的tonos) 6 έ并且在单词的末尾使用σ而不是 ς(最终s - teliko sigma in Greek)。根据上面的结果,我建议你只对降低的案例短语进行标题,并保留大写字母,因为结果肯定会有许多错误,希腊观众不会喜欢这些错误。另外,你可以找到一个希腊人来帮助你提高结果的语言准确性。

对于记录,“εθνικόχρέος”意味着国家债务 - 与我的家人不仅仅是国家而是大陆的主要原因。

答案 2 :(得分:0)

我无法从问题中看出它是否总是在句子中出现,但是如果你需要除了Title case之外还要分割字符串,也许这种方法可能会帮助你开始。

private static string ToTitleCase(string example)
{
    var fromSnakeCase = example.Replace("_", " ");
    var lowerToUpper = Regex.Replace(fromSnakeCase, @"(\p{Ll})(\p{Lu})", "$1 $2");
    var sentenceCase = Regex.Replace(lowerToUpper, @"(\p{Lu}+)(\p{Lu}\p{Ll})", "$1 $2");
    return new CultureInfo("el-GR", false).TextInfo.ToTitleCase(sentenceCase);
}