Mar*_*ten 6 c# ascii localization extended-ascii
问题:我有两个来自外部系统的固定宽度字符串.第一个包含基本字符(如az),第二个(MAY)包含要附加到第一个字符串以创建实际字符的变音符号.
string asciibase = "Dutch has funny chars: a,e,u";
string diacrits = " ' \" \"";
//no clue what to do
string result = "Dutch has funny chars: á,ë,ü";
Run Code Online (Sandbox Code Playgroud)
我可以写一个大规模的搜索并替换所有字符+不同的变音符号,但希望更优雅的东西.
有人知道如何解决这个问题吗?尝试计算小数值,使用string.Normalize(c#),但没有结果.谷歌也没有真正想出办法.
小智 5
将变音符号转换为Unicode结合变音符号范围的合适unicode值:
http://www.unicode.org/charts/PDF/U0300.pdf
然后将字符及其变音符号拍打在一起,例如,对于e-急性,U + 0065 =“ e”和U + 0301 =急性。
String s = "\u0065\u0301";
Run Code Online (Sandbox Code Playgroud)
然后:
string normalisedString = s.Normalize();
Run Code Online (Sandbox Code Playgroud)
将两者合并成一个新的字符串。
除了使用查找表之外,我找不到简单的解决方案:
public void TestMethod1()
{
string asciibase = "Dutch has funny chars: a,e,u";
string diacrits = " ' \" \"";
var merged = DiacritMerger.Merge(asciibase, diacrits);
}
Run Code Online (Sandbox Code Playgroud)
[编辑:根据 @JonB 和 @Oliver 的答案中的建议简化了代码]
public class DiacritMerger
{
static readonly Dictionary<char, char> _lookup = new Dictionary<char, char>
{
{'\'', '\u0301'},
{'"', '\u0308'}
};
public static string Merge(string asciiBase, string diacrits)
{
var combined = asciiBase.Zip(diacrits, (ascii, diacrit) => DiacritVersion(diacrit, ascii));
return new string(combined.ToArray());
}
private static char DiacritVersion(char diacrit, char character)
{
char combine;
return _lookup.TryGetValue(diacrit, out combine) ? new string(new [] {character, combine}).Normalize()[0] : character;
}
}
Run Code Online (Sandbox Code Playgroud)