C# 如何检查无效的UTF-8字符?

C# 如何检查无效的UTF-8字符?,c#,unicode,C#,Unicode,现在有很多受支持的十六进制(UTF-8)实体,从十进制值0到10175,是否有快速方法检查变量中包含的某个值是受支持的十六进制(UTF-8)实体的值之一 e、 十, 如何以最快的方式执行此检查?UTF8Encoding.GetString(byteArray)将在启用错误检测时引发ArgumentException 资料来源: 但是如果您正在测试已经是字符串的东西-据我所知-它几乎总是有效的UTF8。(见下文。)据我所知,所有C#字符串都是用UTF16编码的,UTF16是对所有Unicode字符

现在有很多受支持的十六进制(UTF-8)实体,从十进制值0到10175,是否有快速方法检查变量中包含的某个值是受支持的十六进制(UTF-8)实体的值之一

e、 十,

如何以最快的方式执行此检查?

UTF8Encoding.GetString(byteArray)将在启用错误检测时引发ArgumentException

资料来源:

但是如果您正在测试已经是字符串的东西-据我所知-它几乎总是有效的UTF8。(见下文。)据我所知,所有C#字符串都是用UTF16编码的,UTF16是对所有Unicode字符的编码。UTF8只是同一集合的不同编码。i、 e.用于所有Unicode字符

(这可能会排除一些新的Unicode字符等,但这些字符也不会出现在UTF16中,因此这在这里并不重要。)

正如有人所评论的,可能有“一半”的UTF16字符是有效字符串,但不是有效的UTF8值。因此,您可以
Encoding.Unicode.GetBytes()
然后
Encoding.UTF8.GetString()
进行验证。但这可能非常罕见。

UTF8Encoding.GetString(byteArray)将在启用错误检测时引发ArgumentException

资料来源:

但是如果您正在测试已经是字符串的东西-据我所知-它几乎总是有效的UTF8。(见下文。)据我所知,所有C#字符串都是用UTF16编码的,UTF16是对所有Unicode字符的编码。UTF8只是同一集合的不同编码。i、 e.用于所有Unicode字符

(这可能会排除一些新的Unicode字符等,但这些字符也不会出现在UTF16中,因此这在这里并不重要。)


正如有人所评论的,可能有“一半”的UTF16字符是有效字符串,但不是有效的UTF8值。因此,您可以
Encoding.Unicode.GetBytes()
然后
Encoding.UTF8.GetString()
进行验证。但是这些可能非常罕见。

这应该会返回您所要求的内容。它将检查是否存在未配对的高/低代理项以及是否存在未定义的代码点(是否“定义”取决于您使用的.NET版本中的unicode表以及操作系统版本)

静态布尔IsLegalUnicode(字符串str)
{
对于(int i=0;i//未配对的代理项,如“这应该会返回您要求的内容。它将检查是否存在未配对的高/低代理项以及是否存在未定义的代码点(是否“定义”取决于您使用的.NET版本中存在的unicode表以及操作系统的版本)

静态布尔IsLegalUnicode(字符串str)
{
对于(int i=0;i//未配对的代理,比如“不清楚你在问什么。
a
是utf-16,而不是utf-8。你说“无效”是什么意思?未配对的高/低代理?未分配的unicode代码点?@xanatos现在检查问题,
某个东西
只是一个随机值,我想检查该值是否为有效的utf-8代码之一。您重复了相同的单词,但您的单词没有唯一的含义。问题1(未配对代理)可以通过机械方式检测(基于字符的值)。问题2(哪些字符是用Unicode定义的)需要很大的Unicode字符表。在.NET中的是旧的,不包含较新的表情符号(和其他罕见的脚本)您想知道某个整数值是否表示有效的unicode码点,或者某个字节是否可用于UTF-8编码,或者(可能)当前字体是否会在屏幕上显示有用的内容吗?不清楚您在问什么。
a
是UTF-16,而不是UTF-8。您说“无效”是什么意思?未配对的高/低代理?未分配的unicode代码点?@xanatos现在检查问题,
某个东西
只是一个随机值,我想检查该值是否为有效的utf-8代码之一。您重复了相同的单词,但您的单词没有唯一的含义。问题1(未配对代理)可以通过机械方式检测(基于字符的值)。问题2(哪些字符是用Unicode定义的)需要很大的Unicode字符表。在.NET中的是旧的,不包含较新的表情符号(和其他罕见的脚本)您想知道某个整数值是否表示有效的unicode码点,或者某个字节是否可用于UTF-8编码,或者(可能)当前字体是否会在屏幕上显示有用的内容?@xanatos谢谢。我实际上觉得C#允许这些内容有点奇怪。虽然我能理解其背后的原因……但是,你可以无损地将所有C#字符串转换为。@dan04代理项对的一半如何?我认为它是“有效”字符串,尽管它不是真正的字符串Unicode字符。@xanatos谢谢。我真的觉得C#允许这些字符有点奇怪。虽然我能理解背后的原因…但是,你可以无损地将所有C#字符串转换为。@dan04代理项对的一半怎么样?我认为这是一个“有效”字符串,尽管它不是真正的Unicode字符。我真正想要的是,如果
IsLegalUnicode
方法中的值包含多个字符,它应自动为false,如果该值是单个字符,则应首先检查它是数字[0到9],还是字母字符[a到z]或标点符号[,;:等]如果不是他们中的任何一个,那么检查应该真的有效…我希望我能让它更清楚一点..正常的字母顺序字符,n
var something="some string value";
char[] validCharacter = new[] { All 10175 UTF-8 Hexadecimal characters };
if(validCharacter.Contains(something))
{ \\do something };