当前位置: 首页 > 编程语言 > C#

我们可以简化这个字符串编码代码吗

时间:2023-04-10 13:36:03 C#

我们可以简化这个字符串编码代码有没有可能将这段代码简化成更干净/更快的形式?StringBuilder构建器=newStringBuilder();varencoding=Encoding.GetEncoding(936);//将文本转换为字节数组byte[]source=Encoding.Unicode.GetBytes(text);//将该字节数组转换为新的代码页。byte[]converted=Encoding.Convert(Encoding.Unicode,encoding,source);//采用多字节字符并将它们编码为单独的ascii字符(转换后的字节b)builder.Append((char)b);//返回结果字符串result=builder.ToString();简单地说,它接受一个带有汉字的字符串,比如yun,并将它们转换为ài。例如,十进制的汉字是37126或十六进制的0x9106。请参阅http://unicodelookup.com/#0x9106/1转换为字节数组得到[145,6](145*256+6=37126)。在CodePage936(简体中文)中编码时,我们得到[224,105]。如果我们将这个字节数组分解成单独的字符,我们在unicode中有224=e0=à和105=69=i。请参阅http://unicodelookup.com/#0x00e0/1和http://unicodelookup.com/#0x0069/1所以我们正在进行编码转换并确保输出Unicode字符串中的所有字符最多可以使用两个字节来表示。更新:我需要这个最终表示,因为这是我的收据打印机接受的格式。需要我永远弄明白!:)因为我不是编码专家,所以我正在寻找更简单或更快的代码,但输出必须保持不变。更新(干净版):returnEncoding.GetEncoding("ISO-8859-1").GetString(Encoding.GetEncoding(936).GetBytes(text));好吧,首先,您不需要将“内置”字符串表示形式转换为字节数组。你可以这样做:byte[]converted=Encoding.GetEncoding(936).GetBytes(text);然后从该字节数组重建一个字符串,以便char值直接映射到字节,你可以这样做...Select(b=>(char)b).ToArray());我不会太担心效率;打印机每秒打印多少MB?Joe指出,有一种编码可以直接将字节值0-255映射到代码点,它就是古老的Latin1,它允许我们将函数缩短为...returnEncoding.GetEncoding("Latin1").GetString(编码。GetEncoding(936).GetBytes(文本));顺便说一句,如果这是一个有问题的特定于Windows的API(它看起来像什么,它看起来像什么),您可能正在处理代码页1252(几乎相同)。在通过网络发送之前,您可以尝试使用反射器来查看它对System.String的作用。几乎所有东西都比这更干净——你真的在滥用文字,IMO。您正在尝试将有效的不透明二进制数据(编码文本)表示为文本数据……因此您可能会得到诸如响铃字符、转义字符等内容。在文本中编码不透明二进制数据的正常方法是base64,因此您可以使用:returnConvert.ToBase64String(Encoding.GetEncoding(936).GetBytes(text));生成的文本将完全是ASCII,这不太可能给您带来麻烦。编辑:如果你需要那个输出,我强烈建议你将它表示为字节数组而不是字符串......从那时起将它作为字节数组传递,这样你就不必尝试对其进行字符串操作.您的收据打印机有接受字节数组而不是字符串的API吗?如果是这样,您可以使用收据打印机使用的编码,将代码减少到一次转换,从Unicode字符串到字节数组。另外,如果要将字节数组转换为字符值对应字节值字符串的字符串,可以使用代码页28591akaLatin1akaISO-8859-1。即下面的foreach(bytebinconverted)builder.Append((char)b);字符串结果=builder.ToString();可以替换为://以下所有三个都是等效的//stringresult=Encoding.GetEncoding(28591).GetString(converted);//字符串结果=Encoding.GetEncoding("ISO-8859-1").GetString(converted);字符串结果=Encoding.GetEncoding("Latin1").GetString(converted);当您想在字符串中对二进制数据进行编码时,Latin1是一种有用的编码,例如通过串行端口发送。以上就是C#学习教程:我们可以把这个字符串编码代码分享的所有内容都简化一下。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: