c# – 我们可以简化这个字符串编码代码

前端之家收集整理的这篇文章主要介绍了c# – 我们可以简化这个字符串编码代码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否可以将此代码简化为更干净/更快速的形式?
StringBuilder builder = new StringBuilder();
var encoding = Encoding.GetEncoding(936);

// convert the text into a byte array
byte[] source = Encoding.Unicode.GetBytes(text);

// convert that byte array to the new codepage. 
byte[] converted = Encoding.Convert(Encoding.Unicode,encoding,source);

// take multi-byte characters and encode them as separate ascii characters 
foreach (byte b in converted)
    builder.Append((char)b);

// return the result
string result = builder.ToString();

简单来说,它需要一个包含郓等汉字的字符串,并将其转换为ài.

例如,十进制中的汉字是十六进制的37126或0x9106.

http://unicodelookup.com/#0x9106/1

转换为字节数组,我们得到[145,6](145 * 256 6 = 37126).当用CodePage 936(简体中文)编码时,我们得到[224,105].如果我们将这个字节数组分解成单个字符,那么我们在unicode中的224 = e0 =à和105 = 69 = i.

http://unicodelookup.com/#0x00e0/1

http://unicodelookup.com/#0x0069/1

因此,我们正在进行编码转换,并确保输出Unicode字符串中的所有字符都可以使用最多两个字节来表示.

更新:我需要这个最终的代表,因为这是我的收据打印机接受的格式.让我永远弄清楚! :)由于我不是编码专家,我正在寻找更简单或更快的代码,但输出必须保持不变.

更新(清洁版):

return Encoding.GetEncoding("ISO-8859-1").GetString(Encoding.GetEncoding(936).GetBytes(text));

解决方法

那么对于一个,你不需要在调用Encoding.Convert之前将“内置”字符串表达式转换为字节数组.

你可以做:

byte[] converted = Encoding.GetEncoding(936).GetBytes(text);

然后,从该字节数组中重建一个字符串,由此char值直接映射到字节,您可以…

static string MangleTextForReceiptPrinter(string text) {
    return new string(
        Encoding.GetEncoding(936)
            .GetBytes(text)
            .Select(b => (char) b)
            .ToArray());
}

我不会太担心效率;无论如何,您要在收据打印机上打印多少MB /秒?

Joe指出,有一个编码直接将字节值0-255映射到代码点,并且它的旧版Latin1,这允许我们缩短功能到…

return Encoding.GetEncoding("Latin1").GetString(
           Encoding.GetEncoding(936).GetBytes(text)
       );

顺便说一句,如果这是一个bug的只有windows的API(它是它的外观),你可能会处理codepage 1252(几乎是相同的).您可以尝试使用reflector在通过电线发送之前,先查看System.String的功能.

原文链接:https://www.f2er.com/csharp/95703.html

猜你在找的C#相关文章