C# 如何将UTF-8阿拉伯字母转换为代码页1001?
我有一个支持代码页1001阿拉伯语的Star Micronics TSP,如何使用C#将UTF-8转换为特定的代码页 更新:我发现代码页864与打印机兼容,我尝试发送十六进制值,得到了正确的字符C# 如何将UTF-8阿拉伯字母转换为代码页1001?,c#,.net,encoding,character-encoding,codepages,C#,.net,Encoding,Character Encoding,Codepages,我有一个支持代码页1001阿拉伯语的Star Micronics TSP,如何使用C#将UTF-8转换为特定的代码页 更新:我发现代码页864与打印机兼容,我尝试发送十六进制值,得到了正确的字符 myPrinter.PrintNormal(PrinterStation.Receipt, "\xFE8D"); 我尝试了以下方法将字符串转换为代码页864: Encoding enc = Encoding.GetEncoding(864); byte[] arr = enc.GetBytes("الس
myPrinter.PrintNormal(PrinterStation.Receipt, "\xFE8D");
我尝试了以下方法将字符串转换为代码页864:
Encoding enc = Encoding.GetEncoding(864);
byte[] arr = enc.GetBytes("السلام");
我在编码后得到的字节arr值是{63,63,63,63,63,63}
,它的值是错误的,甚至字节计数也是错误的,因为它是双字节字符。未测试,但是:
String s = Encoding.UTF8.GetString(bytes);
Encoding enc = Encoding.GetEncoding(1001);
byte[] arr2 = enc.GetBytes(s);
当然,如果您实际上是以字符串开头,请跳过第一行,但是因为您提到UTF-8,所以我假设为二进制
显然,对于大数据量,您可能会使用
文本阅读器
/文本阅读器
(每个都带有编码),但想法是一样的。我不认为最初提出问题的人仍然需要答案,但这条线索似乎非常有名,我不希望任何人浪费时间来找到我在艰难的道路上发现的东西。
这个答案主要依赖于Star Micronics TSP打印机提供的应用程序
要点:
-参考“Interop.OposPOSPrinter_CCO.dll”
-打印机对象的类型应为oposposprinter.printer,并以稍微不同的方式初始化(与opos.net相比)
-字符代码作为字符串发送,并且有一个变量告诉打印机对象使用这些十进制数字作为字符代码
带有简单阿拉伯字母转换器的VB.net项目示例可在
注意:我没有时间讨论其余的字母/数字我遇到以下运行时错误,“没有数据可用于编码1001”@Asbi如果无法识别,您可能需要查看encoding.GetEncodings()以查看是否有“足够接近”(可能是10004?)。如果其他所有操作都失败,请找到1001的规范并手动编码。@Absi但这只是Unicode。你试过UTF-16吗(有两个,大端和小端)?好吧,我想我们太接近了,当我对输入进行编码时,每个字母有2个字节,比如说第二个字母有{06,46}。。现在,我如何将它改回字符串并作为一个字母发送到打印机?@Absi-switch-endianness;如果使用
.Unicode
切换到.bigendianencode
等。这将为您提供先前版本的0x0627等。然而,这仍然是一个字符。角色!=字节。您能指出哪一组字节对于您给定的输入是正确的吗?@Absi,代码页864是一种传统的8位基本阿拉伯语编码。这是行不通的。63是问号字符,这意味着编码器无法转换字符。另外,您能否在代码页1001上提供引文?你确定它存在并且你得到了正确的数字吗?@Marc在我能正确回答你之前,我需要一种方法来迭代十六进制值,并将它们发送给打印机,以查看每个十六进制产生的结果。一个非常接近该输入的字节集是{x0627,x0646,x0633,x0646,x0627,x0647}@bzlm它的打印机配置实用程序表示支持1001阿拉伯语和864阿拉伯语,所以当我将打印机设置为代码页864并向它们发送上面的十六进制值时,它会打印阿拉伯语,但我如何自动编码these@Absi“代码页”通常指在ASCII码上使用第8位;至少在“代码页”术语中,2字节映射是不寻常的。像bzlm一样,我正在努力寻找1001上的任何参考资料