C# 使用非英文字符(unicode)将字符串转换为标题大小写

C# 使用非英文字符(unicode)将字符串转换为标题大小写,c#,unicode,C#,Unicode,我正在尝试将非英语字符串(希腊文)转换为标题字符串 我确实尝试了这个链接,但没有运气,所有字符都是大写的 如何使用Unicode字符?所有字符都是Unicode字符。我们说英语的人不会使用来自另一个世界的神奇的非Unicode字符,英语中使用的字符也不会因为太晦涩而不使用Unicode 你没有详细说明你用TextInfo做了什么,你链接到的答案也不是很详细。当我尝试时: CurrentCulture.TextInfo.ToTitleCase("English here, then some G

我正在尝试将非英语字符串(希腊文)转换为标题字符串 我确实尝试了这个链接,但没有运气,所有字符都是大写的


如何使用Unicode字符?

所有字符都是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”、“ΧΘΥ∑”等。如果需要处理此问题,请先执行以下操作:

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

从语言学角度来说,希腊语并不是托特莱科斯语最容易的例子

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),并在单词末尾使用σ,而不是ς(希腊语中最后的s-telikoσ)。根据以上结果,我建议你只给小写的短语加上标题,保留大写的,因为结果肯定会有很多你的希腊听众不喜欢的错误。或者,你可以找一个希腊小伙子来帮助你提高语言准确性。


根据记录,“εθνικόχρέος”意味着国债——这不仅是和我的家人搬到另一个国家,也是搬到另一个大陆的主要原因。

我无法从这个问题判断它是否总是出现在句子大小写中,但如果你需要在标题大小写之外拆分字符串,也许这个方法可以帮助你开始

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);
}

你有没有在希腊文化中使用TextInfo?我试着用的时候效果很好。当然,你可以发布一个小片段来说明这个问题?@mmix不管什么文化,如果希腊字母在英语或法语等非希腊语言中使用,那么∏仍然是π的大写形式,依此类推。其思想是处理比默认规则更多的规则,例如在en-US中,ijssel将TitleCase转换为ijssel,但在nl-nl中,它将TitleCase转换为ijssel。不幸的是,当前过于简单的实现忽略了这一点(文档指出这在语言上是不正确的,但速度很快,并保留将来更改为更精确算法的权利)。同时,不要使用爱尔兰形式的主祷文,因为它会将“Ár nAthair”(“我们的父亲”)变成“Ár Nathair”(“我们的蛇”),这可能与某些人口统计数据不符…!Ed,这个答案开始时发生了什么?你打算复制整个问题吗?@jwiscarson不确定那里发生了什么!我想复制粘贴的唯一一点是答案本身中复制的那一点。一定是错误地点击选择了整个页面。所以我只是dnt不明白解决方案是什么?在调用
ToTitleCase
之前,首先尝试转换成小写。如果你有任何以sigma结尾的大写单词,那么这将很糟糕,在这种情况下,你必须自己修复它。如果是这样,请放心,至少它不是反希腊的东西,
ToTitleCase
是一种对每种语言都有问题的过于简单的方法。实际上,在其他一些情况下,希腊语更容易解决这一问题。你的大写形式是ΕΝΝΚΧΡΕ∑(U+039F希腊语大写字母OMICRON),而不是ΕΝΠΧΡΈ∑(U+038C希腊语大写字母OMICRON和TONOS)当然,tonos通常不会用大写字母显示——在我的系统上,上面的代码看起来是一样的,但它在结果中出现在
ti.ToUpper(“ΕθικόΧρέος”)中
工作正常。中间和最后的符号的问题当然仍然存在。尽管如此,该代码处理希腊语、荷兰语或德语,并且比爱尔兰语更好——至少它不会改变意思!正确。但这是故意的,因为你永远不会在大写字母中找到一个希腊语词组,带有变音符号。是的。这就像Fr中的重音一样恩奇(有记录表明,法国作家在大写字母上使用重音,但这种风格非常罕见,很多法国人都会告诉你——我曾经遇到一位刚完成一项语言调查的人,他询问的每一位以法语为母语的人都说,大写字母上从来没有重音,在回家的路上,他看到了一张巨大的海报。)(大写字母带重音!)我知道这是个话题,但一直都是这样吗?我知道在一些语言中大写字母会失去重音,因为用这种方式进行老式打印和打字更容易。在希腊语中也是这样吗?总是这样。有一个笑话是关于一个希腊裔美国人,他多年后回到希腊,读了这句话。”ΜΚΕ∑-ΧΑ∧Α作为“μοκέτεςχάλια”而不是“μοκέτεςχαλιά”-的意思是“垃圾地毯”而不是“地毯”-κκκέάττττεεήχλλλάάάάά∧并“在爱尔兰语中,这种情况更糟,因为人类永远不会这样做,但计算机可能会这样做。你的笑话更接近于英语版波美报纸所引起的担忧,该报纸称波兰的暴风雪吹倒了数百个波兰人。