C# 在C语言中将unicode字符转换为单个十六进制值
我使用Encoding.Unicode.GetString从emf记录中获取一个字符,结果字符串仅包含一个字符,但有两个字节。我对编码方案和多字节字符集一无所知。我想将该字符转换为等效的单个十六进制值。您能帮我解决这个问题吗?试试这个:C# 在C语言中将unicode字符转换为单个十六进制值,c#,C#,我使用Encoding.Unicode.GetString从emf记录中获取一个字符,结果字符串仅包含一个字符,但有两个字节。我对编码方案和多字节字符集一无所知。我想将该字符转换为等效的单个十六进制值。您能帮我解决这个问题吗?试试这个: System.Text.Encoding.Unicode.GetBytes(theChar.ToString()) .Aggregate("", (agg, val) => agg + val.ToString("X2")); 但是,由于没有确
System.Text.Encoding.Unicode.GetBytes(theChar.ToString())
.Aggregate("", (agg, val) => agg + val.ToString("X2"));
但是,由于没有确切指定字符的编码方式,因此可能会失败。此外,如果希望输出为十六进制字符或字节字符串,您还没有非常清楚。我猜是前者,因为我猜您想要生成HTML。如果有任何错误,请告诉我。试试以下方法:
System.Text.Encoding.Unicode.GetBytes(theChar.ToString())
.Aggregate("", (agg, val) => agg + val.ToString("X2"));
但是,由于没有确切指定字符的编码方式,因此可能会失败。此外,如果希望输出为十六进制字符或字节字符串,您还没有非常清楚。我猜是前者,因为我猜您想要生成HTML。如果有任何错误,请告诉我。请联系StringInfo: NET Framework支持文本元素。文本元素是显示为单个字符的文本单元,称为图示符。文本元素可以是基本字符、代理项对或组合字符序列。StringInfo类提供了一些方法,这些方法允许应用程序将字符串拆分为文本元素,并遍历文本元素。有关使用StringInfo类的示例,请参见字符串索引
请访问StringInfo: NET Framework支持文本元素。文本元素是显示为单个字符的文本单元,称为图示符。文本元素可以是基本字符、代理项对或组合字符序列。StringInfo类提供了一些方法,这些方法允许应用程序将字符串拆分为文本元素,并遍历文本元素。有关使用StringInfo类的示例,请参见字符串索引
不清楚你的意思。C中的字符是一个16位无符号值。如果您有一个二进制数据源,并且希望获得Unicode字符,那么应该使用编码将二进制数据解码为字符串,您可以将其作为字符值序列进行访问 您可以先将字符转换为整数,然后使用X格式说明符将其转换为十六进制字符串,如下所示:
char = '\u0123';
string hex = ((int)c).ToString("X4"); // Now hex = "0123"
现在,剩下一个问题:代理项对。不在基本多语言平面U+0000到U+FFFF中的值由两个UTF-16代码单元表示—一个高代理项和一个低代理项。您可以使用char.IsSurrogate*方法检查代理项对。。。尽管就我所知,将代理项对转换为UCS-4值比较困难。如果你幸运的话,你不需要处理这个。。。如果您乐于将二进制数据转换为UTF-16代码单元序列,而不是严格的UCS-4值,则无需担心
编辑:考虑到你的评论,你还不完全清楚要从什么开始。你说你有两个字节。。。它们是分开的,还是在字节数组中?它们代表什么?以特定编码的文本,大概。。。但是哪种编码?了解编码后,可以轻松地将字节数组转换为字符串:
byte[] bytes = ...;
// For example, if your binary data is UTF-8
string text = Encoding.UTF8.GetString(bytes);
char firstChar = text[0];
string hex = ((int)firstChar).ToString("X4");
如果您可以编辑您的问题,以提供有关您实际情况的更多详细信息,将更容易帮助您找到解决方案。如果您通常对编码以及文本和二进制数据之间的差异感到困惑,您可能需要阅读我的。不清楚您的意思。C中的字符是一个16位无符号值。如果您有一个二进制数据源,并且希望获得Unicode字符,那么应该使用编码将二进制数据解码为字符串,您可以将其作为字符值序列进行访问 您可以先将字符转换为整数,然后使用X格式说明符将其转换为十六进制字符串,如下所示:
char = '\u0123';
string hex = ((int)c).ToString("X4"); // Now hex = "0123"
现在,剩下一个问题:代理项对。不在基本多语言平面U+0000到U+FFFF中的值由两个UTF-16代码单元表示—一个高代理项和一个低代理项。您可以使用char.IsSurrogate*方法检查代理项对。。。尽管就我所知,将代理项对转换为UCS-4值比较困难。如果你幸运的话,你不需要处理这个。。。如果您乐于将二进制数据转换为UTF-16代码单元序列,而不是严格的UCS-4值,则无需担心
编辑:考虑到你的评论,你还不完全清楚要从什么开始。你说你有两个字节。。。它们是分开的,还是在字节数组中?它们代表什么?以特定编码的文本,大概。。。但是哪种编码?了解编码后,可以轻松地将字节数组转换为字符串:
byte[] bytes = ...;
// For example, if your binary data is UTF-8
string text = Encoding.UTF8.GetString(bytes);
char firstChar = text[0];
string hex = ((int)firstChar).ToString("X4");
如果你能编辑你的问题,提供更多关于你实际情况的细节,那将是一个错误
帮助您找到解决方案并不容易。如果您对编码以及文本和二进制数据之间的差异感到困惑,您可能需要阅读my。我创建了一个扩展方法,将unicode或非unicode字符串转换为十六进制字符串 我对谁也有同感
public static class StringHelper
{
public static string ToHexString(this string str)
{
byte[] bytes = str.IsUnicode() ? Encoding.UTF8.GetBytes(str) : Encoding.Default.GetBytes(str);
return BitConverter.ToString(bytes).Replace("-", string.Empty);
}
public static bool IsUnicode(this string input)
{
const int maxAnsiCode = 255;
return input.Any(c => c > maxAnsiCode);
}
}
我创建了一个扩展方法来将unicode或非unicode字符串转换为十六进制字符串 我对谁也有同感
public static class StringHelper
{
public static string ToHexString(this string str)
{
byte[] bytes = str.IsUnicode() ? Encoding.UTF8.GetBytes(str) : Encoding.Default.GetBytes(str);
return BitConverter.ToString(bytes).Replace("-", string.Empty);
}
public static bool IsUnicode(this string input)
{
const int maxAnsiCode = 255;
return input.Any(c => c > maxAnsiCode);
}
}
多字节字符是什么意思?一个UTF-8序列,或者仅仅是一个代码点?但在其他地方你说你有2个字节。您是否意识到并非所有Unicode字符(甚至整个BMP)都可以在UTF-8中以两个字节表示?您所说的多字节字符是什么意思?一个UTF-8序列,或者仅仅是一个代码点?但在其他地方你说你有2个字节。你意识到不是所有的Unicode字符——甚至不是整个BMP字符——都可以用UTF-8表示为两个字节吗?对我来说,这似乎是一种非常迂回的方式,当你把它转换成整数后就可以使用ToString了。通过在二进制流上执行此技术,我的观点发生了偏差。另一方面,cast-to-int方法是否适用于需要更多字符来表示它们的代码点?嗨,Kaizen,我无法编译它,它显示了一些错误消息,System.Array不包含Aggregate@Parthi27887-您需要使用C 3.0并导入System.Linq命名空间才能工作。试试John的解决方案,因为它更直截了当。我希望输出为string,这对我来说似乎是一种非常迂回的方式,当你将它转换为int…点后可以使用ToString。通过在二进制流上执行此技术,我的观点发生了偏差。另一方面,cast-to-int方法是否适用于需要更多字符来表示它们的代码点?嗨,Kaizen,我无法编译它,它显示了一些错误消息,System.Array不包含Aggregate@Parthi27887-您需要使用C 3.0并导入System.Linq命名空间才能工作。尝试John的解决方案,因为它更直接。我希望输出为字符串。是否有任何已知方法将代理项对转换为UCS-4值?@Parthi27887:您当然可以手动执行此操作-查看MiscUtil中的Utf32String类,例如:。我确信框架中有一些东西可以做到这一点,但我找不到它。我希望它是字符串。是否有任何已知的方法将代理项对转换为UCS-4值?@Parthi27887:您当然可以手动执行此操作-查看MiscUtil中的Utf32String类,例如:。我确信框架中有一些东西可以做到这一点,但我找不到它。我希望它是串起来的。