【问题标题】:Convert To Unicode from CP1251 in C#在 C# 中从 CP1251 转换为 Unicode
【发布时间】:2016-02-22 08:55:53
【问题描述】:

我有包含俄语文本的大数据

"Ìèíàñÿí Ðóäèê Ñàðêèñîâ"

我需要在 C# 中将其转换为 UNICODE

“Минасян Рудик Саркисов”

如何转换?

【问题讨论】:

    标签: c# .net unicode encoding cyrillic


    【解决方案1】:

    如果真的是1251,那么代码是:

    var enc1251 = Encoding.GetEncoding(1251);
    var enc8859 = Encoding.GetEncoding("iso-8859-1");
    string str = "Ìèíàñÿí Ðóäèê Ñàðêèñîâ";
    byte[] bytes = enc8859.GetBytes(str);
    string str2 = enc1251.GetString(bytes);
    

    Encoding.GetEncoding("iso-8859-1").GetBytes(str) 返回“原始”(未处理)byte[] 数组,然后我使用 CP1251 对其进行解码。

    我正在添加一个小程序来“解决”这类问题。请注意,这是一个 .NET Framework 程序,而不是 .NET Core 程序,因为 .NET Core 存在 Encoding.GetEncodings 的问题。该程序将搜索可用于修复错误编码文本问题的编码。它将显示可以对给定全文进行编码/解码的候选编码列表,然后尝试匹配它们。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    class Program
    {
        static void Main(string[] args)
        {
            Console.OutputEncoding = System.Text.Encoding.UTF8;
    
            var encodings = Encoding.GetEncodings();
    
            Console.WriteLine($"Testing {encodings.Length} encodings");
            Console.WriteLine();
    
            string from = "Ìèíàñÿí Ðóäèê Ñàðêèñîâ"; // "Єюээ";
            string to = "Минасян Рудик Саркисов"; // "тонн";
    
            var encodingsFrom = new List<(string Hex, Encoding Encoding)>();
            var encodingsTo = new List<(string Hex, Encoding Encoding)>();
    
            var stringPlusEncodings = new[]
            {
                new { Str = from, Encodings = encodingsFrom },
                new { Str = to, Encodings = encodingsTo },
            };
    
            foreach (var stringPlusEncoding in stringPlusEncodings)
            {
                Console.WriteLine(stringPlusEncoding.Str);
    
                foreach (var info in encodings)
                {
                    var enc = info.GetEncoding();
    
                    bool unicodeEncoding = enc.BodyName.StartsWith("utf-");
    
                    if (!enc.IsSingleByte && !unicodeEncoding)
                    {
                        Console.WriteLine($"Skipped {enc.BodyName}");
                        continue;
                    }
    
                    enc = (Encoding)enc.Clone();
    
                    // We replace unknown characters with easy-to-find code 0
                    // Note that this is useless for encodings that map all the characters
                    // and use the 0 for something else (like utf-16 and utf-32)
                    enc.EncoderFallback = new EncoderReplacementFallback("\0");
    
                    var bytes = enc.GetBytes(stringPlusEncoding.Str);
    
                    if (!unicodeEncoding && (bytes.Length == 0 || bytes.Any(x => x == 0)))
                    {
                        continue;
                    }
    
                    // Write in hex format
                    string encodedHex = string.Join(" ", bytes.Select(x => x.ToString("x2")));
    
                    Console.WriteLine($"{encodedHex} {enc.HeaderName}");
    
                    stringPlusEncoding.Encodings.Add((encodedHex, enc));
                }
    
                Console.WriteLine(string.Empty);
            }
    
            Console.WriteLine("Candidates:");
    
            foreach (var encodingFrom in encodingsFrom)
            {
                var encodingsTo2 = encodingsTo.Where(x => encodingFrom.Hex == x.Hex).ToArray();
    
                foreach (var encodingTo in encodingsTo2)
                {
                    Console.WriteLine($"{encodingFrom.Encoding.HeaderName} -> {encodingTo.Encoding.HeaderName}");
                }
            }
        }
    }
    

    【讨论】:

    • 嘿@xanatos!您是如何找到第一个编码为“iso-8859-1”的?我可以将“Єюээ”转换为“тонн”吗?
    • @SoyuzbekOrozbekUulu iso-8859-1 编码是一种“作弊”:它将 unicode (0-255) 的前 256 个代码点映射到字节 0-255。所以“A”变成了 65。
    • 感谢您的回复!但无论如何我不能从“Єюээ”中得到“тонн”。
    • @SoyuzbekOrozbekUulu 好的,找到了...您已在 DOS cp866 代码页中对文本进行了编码。使用 Encoding.GetEncoding("windows-1251").GetString(Encoding.GetEncoding("cp866").GetBytes("Єюээ"))
    • @SoyuzbekOrozbekUulu 如果您看一下我的旧回复,您会发现现在有一堵代码墙。那堵代码是我编写和使用的。
    猜你喜欢
    • 2016-01-12
    • 2018-07-24
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多