gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:35:30 25 4
gpt4 key购买 nike

是否可以将此代码简化为更清晰/更快的形式?

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]。如果我们将这个字节数组分解成单独的字符,我们 224=e0=à 和 105=69=i 在 unicode 中。

参见 http://unicodelookup.com/#0x00e0/1http://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)
);

顺便说一句,如果这是一个有缺陷的仅限 Windows 的 API(从外观上看确实如此),您可能正在处理 codepage 1252相反(这几乎是相同的)。你可以试试 reflector在通过网络发送之前查看它对您的 System.String 做了什么。

关于c# - 我们可以简化这个字符串编码代码吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2072273/

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