将两个ascii字符转换为它们的"对应"一个字符扩展ascii表示

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)

将两者合并成一个新的字符串。


Mik*_*son 1

除了使用查找表之外,我找不到简单的解决方案:

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)