C# 如何将阿拉伯语文本转换为十六进制
我正在处理c#上的收据申请。我有英文和阿拉伯文的收据示例,如下所示 我有json文本,我尝试将json文本转换为十六进制,并通过套接字消息以十六进制格式发送。 我的问题是我试图将文本转换为十六进制,但无法成功转换。下面是如何将文本转换为十六进制C# 如何将阿拉伯语文本转换为十六进制,c#,winforms,C#,Winforms,我正在处理c#上的收据申请。我有英文和阿拉伯文的收据示例,如下所示 我有json文本,我尝试将json文本转换为十六进制,并通过套接字消息以十六进制格式发送。 我的问题是我试图将文本转换为十六进制,但无法成功转换。下面是如何将文本转换为十六进制 string hexOutput = ""; byte[] ba = Encoding.Default.GetBytes(output); hexOutput = BitConverter.ToString(ba); hexOutp
string hexOutput = "";
byte[] ba = Encoding.Default.GetBytes(output);
hexOutput = BitConverter.ToString(ba);
hexOutput = hexOutput.Replace("-", "");
下面是我的json示例
"PaymentReceipt":[
{
"DocumentQualifier":"CustomerReceipt",
"OutputContent":{
"OutputFormat":"Text",
"OutputText":[
{
"Text":"------------------------------------------------------------"
},
{
"Text":"XXXXXXXXXX2345"
},
{
"Text":"Purchase Amount مبلغ الشراء"
},
{
"Text":"5.00"
},
{
"Text":""
},
{
"Text":"Thanks for your visit شكرا لزيارتكم"
}
]
如何将文本正确转换为十六进制?阿拉伯语字符位于UTF 8字符上,为此,您首先必须将其转换为字节数组,如下所示
byte[] bytes = Encoding.UTF8.GetBytes(output);
然后将其转换为base64字符串或任何需要转换的字符串
用于转换为base64字符串
string base64Str = Convert.ToBase64String(bytes);
byte originalByte = Convert.FromBase64String(base64Str);
用于从base64字符串获取原始字节
string base64Str = Convert.ToBase64String(bytes);
byte originalByte = Convert.FromBase64String(base64Str);
用于从字节数组获取UTF8原始输出
string originalResult = Encoding.UTF8.GetString(bytes);
在一行中,您可以获得base64字符串并按如下方式恢复
编码
string encodedStr = Convert.ToBase64String(Encoding.UTF8.GetBytes(output));
解码
string OriginalString = Encoding.UTF8.GetString(Convert.FromBase64String(encodedStr));
UTF-8是网络上使用最广泛的编码。检查 代码 HexManager静态类包含用于从/转换为十六进制的帮助程序扩展方法
using System;
using System.Text;
public static class HexManager
{
public static String ToHex(this byte[] data)
{
StringBuilder ret = new StringBuilder(String.Empty);
foreach (byte Value in data)
{
ret.Append(Value.ToString("x2"));
}
return ret.ToString();
}
public static byte[] FromHex(this string data)
{
int Pair = data.Length % 2;
byte[] ret = new byte[data.Length / 2];
if (Pair == 0)
{
for (int i = 0; i < data.Length / 2; i++)
{
ret[i] = Convert.ToByte(data.Substring(i * 2, 2), 16);
}
}
else
{
throw new SystemException("Invalid hex string.");
}
return ret;
}
public static byte[] ToByteArray(this string data)
{
return Encoding.UTF8.GetBytes(data);
}
public static string ToStr(this byte[] data)
{
return Encoding.UTF8.GetString(data);
}
}
public class Example
{
public static void Main()
{
Console.OutputEncoding = System.Text.Encoding.UTF8; //Use Windows Terminal for correct output of UTF-8. No problem on Linux or MacOS Default is UTF-8.
string data = "Purchase Amount مبلغ الشراء";
Console.WriteLine("Original: " + data);
data = data.ToByteArray().ToHex();
Console.WriteLine("Encoded: " + data);
data = data.FromHex().ToStr();
Console.WriteLine("Decoded: " + data);
Console.WriteLine();
Console.WriteLine();
data = "Thanks for your visit شكرا لزيارتكم";
Console.WriteLine("Original: " + data);
data = data.ToByteArray().ToHex();
Console.WriteLine("Encoded: " + data);
data = data.FromHex().ToStr();
Console.WriteLine("Decoded: " + data);
Console.ReadKey();
}
}
编码。默认值似乎不是个好主意。它在DocueMStation页面上显示:“不同的计算机可以使用不同的编码作为默认编码,并且默认编码可以在一台计算机上更改。如果使用默认编码对计算机之间的数据流进行编码和解码,或者在同一台计算机上的不同时间检索到的数据进行编码和解码,则可能会错误地转换该数据。”您会问如何正确地将其转换为十六进制,但这不是一个简单的问题。十六进制表示二进制数据,但首先需要将文本转换为二进制数据(byte[]
)。您可以使用文本编码器的GetBytes
方法来实现这一点,正如您在代码中尝试的那样。问题是:您没有提到应该使用什么编码。我猜是UTF8,但不同的人类语言可能有特定的编码,这些编码是为它们生成的,并且是您调用的服务所期望的。文档要求的编码是什么?您是否计划用编码要求更新问题?Hi@Llama抱歉,我之前无法检查,但我尝试了encoding.UTF8.GetBytes(),再次无法正确转换。因此,正确的编码是什么?你必须告诉我们。我们不能告诉您,因为这完全取决于您将数据传递给的服务的要求。为什么是UTF8?一般来说,Unicode是可以的,当然可以。但我真的不确定在处理阿拉伯语时UTF8是否更可取。@Fildor对于混合数据,使用UTF-8;对于纯阿拉伯语文本,使用UTF-16以获得最佳空间效率。UTF-8可以表示所有1M+。UTF-8在网络上被广泛使用。你能澄清一下“阿拉伯语字符是基于UTF 8字符的”是什么意思吗。谢谢@Joma。我的问题是,我尝试用UTF8编码是可以的,但当我从响应端解码时,我没有用UTF8解码,因为值看起来像?????而不是编码为任何json属性的十六进制,您可以:1。生成所有Json内容2。将所有json内容转换为十六进制3。在服务器中,将十六进制字符串解码为原始字符串(json内容)@saulyasar您的意思是说,在将字符串从十六进制转换回控制台窗口后,在控制台窗口中呈现该字符串是一个问题吗?在Windows上,默认编码为UTF-16。Classic cmd.exe或powershell无法正确显示输出。Windows终端解决了这个问题,它可以管理UTF-8或UTF-16以正确打印字符。最初的想法是用十六进制编码所有生成的JSON内容,而不是将JSON内容的特定属性编码为十六进制,管理起来更复杂。