C# Unicode到ASCII的转换/映射

C# Unicode到ASCII的转换/映射,c#,encoding,ascii,C#,Encoding,Ascii,我需要某种转换/映射,例如,由CLCL剪贴板管理器完成 它是这样做的: 我复制以下Unicode文本:ūī CLCL将其转换为:ui 有什么技术可以进行这样的转换吗?或者可能有一些映射表可以用来转换,比如说,符号ū映射到u 更新 谢谢大家的帮助。以下是我带来的(两种解决方案的混合),一种是Erik Schierboom发布的,另一种是从 public静态字符串ConvertUnicodeToAscii(字符串Unicodest,bool skipNonConvertibleChars=false

我需要某种转换/映射,例如,由CLCL剪贴板管理器完成

它是这样做的:

我复制以下Unicode文本:ūī
CLCL将其转换为:ui

有什么技术可以进行这样的转换吗?或者可能有一些映射表可以用来转换,比如说,符号ū映射到u

更新

谢谢大家的帮助。以下是我带来的(两种解决方案的混合),一种是Erik Schierboom发布的,另一种是从

public静态字符串ConvertUnicodeToAscii(字符串Unicodest,bool skipNonConvertibleChars=false)
{
if(string.IsNullOrWhiteSpace(unicodest))
{
返回Unicode dest;
}
var normalizedStr=unicodeStr.Normalize(NormalizationForm.FormD);
如果(skipNonConvertibleChars)
{
返回新字符串(normalizedStr.ToCharArray()。其中(c=>(int)c
{
UnicodeCategory category=CharUnicodeInfo.GetUnicodeCategory(c);
退货类别!=UnicodeCegory.NonSpacingMark;
}).ToArray());
}

通常,无法将Unicode转换为ASCII,因为ASCII是Unicode的子集

也就是说,可以将Unicode的ASCII子集中的字符转换为Unicode

在C#中,通常不需要进行转换,因为默认情况下所有字符串都是Unicode,并且所有组件都支持Unicode,但是如果必须进行转换,请使用以下方法:

 string myString = "SomeString";
 byte[] asciiString = System.Text.Encoding.ASCII.GetBytes(myString);

我使用以下代码已有一段时间了:

private static string NormalizeDiacriticalCharacters(string value)
{
    if (value == null)
    {
        throw new ArgumentNullException("value");
    }

    var normalised = value.Normalize(NormalizationForm.FormD).ToCharArray();

    return new string(normalised.Where(c => (int)c <= 127).ToArray());
}
private静态字符串NormalizeDiacriticalCharacters(字符串值)
{
如果(值==null)
{
抛出新的ArgumentNullException(“值”);
}
var normalized=value.Normalize(NormalizationForm.FormD).ToCharArray();

返回新字符串(归一化。其中(c=>(int)什么,有几个问题说这是不可能的?哪些是这些问题?它们是错误的,需要正确的答案。还有几个问题说明了这是如何工作的。创建自己的映射如何?Unicode是指UTF16吗?这可能是重复的不是OP的意思。@Davidtroon:你能想到任何ASCII字符吗例如,UTF-8中没有包含的字符?我可以想到UTF-8中有许多字符不是ASCII格式的。例如字 无法用US-ASCII表示。是的,但说它是子集是不正确的。UTF-8(只有一种unicode格式)被显式创建为“向后兼容”使用ASCII。@davintroon:您使用的子集的定义是什么?ASCII中的每个代码点都包含在Unicode中。因此,ASCII完全包含在Unicode中,或者换句话说,ASCII是Unicode的子集。这并不是说Unicode早于ASCII,只是它包含ASCII中的每个元素(毕竟,这就是子集的含义).我不喜欢
c,否则您可能会返回一个包含ASCII范围以外字符的字符串,对吗?请看我将此问题标记为重复的问题。.右方法是查看Unicode类别,只保留非空格/非组合的变音字符。但老实说,这可能是效率较低的方法,而且在我看来(公认有限)理解Unicode,你的答案总是会得到正确的结果。对不起,我错过了重复的问题部分。你当然是对的。它是有效的,但有一点是,无法映射的字符被忽略了。例如,“Łukasz”变成了“ukasz”。在“的重复”中使用的方法问题会在输出中留下这样的字符。所以,可能最好将这两种方法结合起来,并设置一个bool参数来决定是离开还是跳过。
private static string NormalizeDiacriticalCharacters(string value)
{
    if (value == null)
    {
        throw new ArgumentNullException("value");
    }

    var normalised = value.Normalize(NormalizationForm.FormD).ToCharArray();

    return new string(normalised.Where(c => (int)c <= 127).ToArray());
}