Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中将unicode字符转换为单个十六进制值_C# - Fatal编程技术网

C# 在C语言中将unicode字符转换为单个十六进制值

C# 在C语言中将unicode字符转换为单个十六进制值,c#,C#,我使用Encoding.Unicode.GetString从emf记录中获取一个字符,结果字符串仅包含一个字符,但有两个字节。我对编码方案和多字节字符集一无所知。我想将该字符转换为等效的单个十六进制值。您能帮我解决这个问题吗?试试这个: System.Text.Encoding.Unicode.GetBytes(theChar.ToString()) .Aggregate("", (agg, val) => agg + val.ToString("X2")); 但是,由于没有确

我使用Encoding.Unicode.GetString从emf记录中获取一个字符,结果字符串仅包含一个字符,但有两个字节。我对编码方案和多字节字符集一无所知。我想将该字符转换为等效的单个十六进制值。您能帮我解决这个问题吗?

试试这个:

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类,例如:。我确信框架中有一些东西可以做到这一点,但我找不到它。我希望它是串起来的。