c# - 如何修复带有变音符号并被转换为奇怪字符的字符串?

标签 c#

我需要从旧数据库导入数据,在此过程中我想修复一些字符串,如下所示:

示例 1:现有字符串 = "GraÅ£iela" 这是 "Graţiela" 我想将其保存为 "Gratiela"

示例 2:现有字符串 ="MÄ‚DÄ‚LINA" 就是这个 "Mădălina",我想将其保存为 "Madalina"

我能够删除变音符号,但由于转换不当,某些字符串(例如 exemple1 和 exexample2)具有一些奇怪的字符。

我的问题是:你知道修复这种琴弦的方法吗? (除了手册!)。

我有超过 50K 行,其中有很多单词,如上面的示例。

我尝试了以下内容:

var text = "Graţiela";
Console.WriteLine(text.Normalize());-->Graţiela
Console.WriteLine(Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(text))); ---> Graţiela
Console.WriteLine(Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(text))); ---> Gra??iela
Console.WriteLine(Encoding.UTF7.GetString(Encoding.UTF7.GetBytes(text))); ---> Graţiela
Console.WriteLine(Encoding.UTF32.GetString(Encoding.UTF32.GetBytes(text))); ---> Graţiela
Console.WriteLine(Encoding.Unicode.GetString(Encoding.Unicode.GetBytes(text))); ---> Graţiela
Console.WriteLine(Encoding.BigEndianUnicode.GetString(Encoding.BigEndianUnicode.GetBytes(text))); ---> Graţiela
Console.WriteLine(Encoding.Default.GetString(Encoding.Default.GetBytes(text))); ---> Graţiela

这些都不能解决我的问题,您有任何其他想法,还是我的方法有问题?

最佳答案

您的示例看起来像被解码为 ISO-8859-something (Encoding.Default) 的 UTF-8 字符串。要检索原始字符串,您可以将它们重新编码为 ISO-8859-x,然后将它们重新解码为 UTF-8:

string FixEncoding(string badString, Encoding bad, Encoding good)
{
    var bytes = bad.GetBytes(badString);
    return good.GetString(bytes);
}

...

string fixedString = FixEncoding("GraÅ£iela", Encoding.Default, Encoding.UTF8); // Graţiela

请注意,只有在使用错误编码解码字符串时没有信息丢失的情况下,它才会起作用。最安全的方法是始终使用正确的编码读取字符串;如果数据库包含正确的字符串,请确保您使用与数据库相同的编码来读取它们。

要删除变音符号,您可以使用:

string RemoveDiacritics(string s)
{
    var decomposed = s.Normalize(NormalizationForm.FormD);
    var sb = new StringBuilder();
    for (int i = 0; i < decomposed.Length; i++)
    {
        var category = CharUnicodeInfo.GetUnicodeCategory(decomposed, i);
        if (category != UnicodeCategory.NonSpacingMark)
            sb.Append(decomposed[i]);
    }
    return sb.ToString().Normalize(NormalizationForm.FormC);
}

关于c# - 如何修复带有变音符号并被转换为奇怪字符的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37823607/

相关文章:

c# - asp.net mvc 和 Controller 服务架构

c# - DateTime 将日期显示为 01/01/0001

c# - 有没有办法更改 C# 数组中的元组值?

C# 一个可以返回多条消息的验证方法

c# - Linq 在没有 .GroupBy() 的情况下获取不同的有序元素

c# - 如何将一组颜色 'shades' 替换为另一组颜色

c# - 创建全局对象?

c# - 使用 process.WorkingSet64 测量内存使用情况出现异常

c# - 令人费解......为什么我的大多数链接在 ASP.NET MVC 中都附加了 Length=4?

C# 从运行时使用 jQuery 更改的代码中获取元素的背景颜色