2015-05-08 20 views
2

我使用this answer中的方法從單詞中刪除特殊字符並將其更改爲簡單形式。這對於許多基本的口音來說非常合適,例如爲什麼不把一些變音符刪除?

Malmö becomes "Malmo" 
München becomes "Munchen" 
Åge becomes "Age" 

然而,這並不能在一些其他人物工作,例如:

Strømsgodset remains "Strømsgodset" 
Kulħadd remains "Kulħadd" 

是否有任何理由爲什麼這些字符不轉換的其他人一樣?

也就是有什麼辦法可以轉換成類似「組合拳」的字符,如:

æ -> ae 
ẞ -> ss 
+0

因爲Unicode聯盟的語言學家和官僚們決定這樣做。 – xanatos

+0

根據你的第二個問題,如何將它們映射到一對其他字符,使用'Dictionary '。然後很簡單:'foreach(var kv in dict)text = text.Replace(kv.Key.ToString(),kv.Value)' –

+2

如果你知道世界上每種語言的所有特殊字符,那麼這將起作用。 – Gigi

回答

1

因爲由Unicode協會編寫的Normalization chart沒有你想要的分解,以及Microsoft使用的圖表(或更可能是該圖表的文本版本,或者該圖表的舊版本,但這些是詳細信息)。

我不知道原因,因爲我不是語言學家,但我確實希望Unicode Consortium中有足夠的優秀語言學家來做正確的選擇。

注意覈對表是從規格化表分開的,所以你可以有:

int res = string.Compare("æ", "ae", CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace); 

0 ...所以æ == aeħ == h

你甚至可以IndexOf,使用歸類:

int ix = CultureInfo.CurrentCulture.CompareInfo.IndexOf(
    "Ad aeternitatem", 
    "æter", 
    CompareOptions.IgnoreNonSpace); // 3 

和忽略大小寫:

int ix = CultureInfo.CurrentCulture.CompareInfo.IndexOf(
    "Ad Aeternitatem", 
    "æter", 
    CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase); // 3 
+0

對於這些「雙重人物」是有道理的,但這也適用於其他人(例如ħ)嗎? – Gigi

+0

@gigi它與圖形相似的事實並不意味着它是'h'。你想把'$'simbol分解成一個'S'加一個'|'嗎? :-) – xanatos

+0

是嗎? :)開玩笑說,爲什麼利用圖形(而不是語義)相似性有利於實際的原因,例如,搜索。 – Gigi

相關問題