gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:15:33 25 4
gpt4 key购买 nike

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

示例 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com