Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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#_.net_Character Encoding - Fatal编程技术网

C# 如何确定是否可以使用给定的编码来表示字符串

C# 如何确定是否可以使用给定的编码来表示字符串,c#,.net,character-encoding,C#,.net,Character Encoding,给定一个实例和一个字符串,如何以编程方式确定该字符串是否可以使用该编码表示 我正在处理序列化库,在编写字符串时,我需要知道字符串是否可以按原样编写,或者是否需要转义 我调查了该组织的成员,但似乎没有人提供这方面的信息。一种选择可能是以某种方式创建一个等价的编码实例,但是使用一个自定义的方法来捕获它是否被使用,然后尝试使用编码将字符串转换为字节。这似乎有点老套,但效率不高。好的,c中的字符串总是Unicode。在这种情况下,您可以循环检查字符串的每个字符,并检查其数值是否符合特定的编码。例如,准确

给定一个实例和一个字符串,如何以编程方式确定该字符串是否可以使用该编码表示

我正在处理序列化库,在编写字符串时,我需要知道字符串是否可以按原样编写,或者是否需要转义

我调查了该组织的成员,但似乎没有人提供这方面的信息。一种选择可能是以某种方式创建一个等价的编码实例,但是使用一个自定义的方法来捕获它是否被使用,然后尝试使用编码将字符串转换为字节。这似乎有点老套,但效率不高。

好的,c中的字符串总是Unicode。在这种情况下,您可以循环检查字符串的每个字符,并检查其数值是否符合特定的编码。例如,准确地说,带有0x1234的unicode字符不适合ASCII范围0x00-0xFF 0x7F

编辑 ASCII:7-8位。第8位字符取决于代码页,这意味着相同的数值将在不同的代码页中显示为不同的字符。没机会改变,阿福。 UTF7:应该非常罕见,根据维基百科的说法,这不是标准的一部分。 UTF8:8位,与上半部分的ASCII相同。 UTF16,32:16分别。32位。 好的,字符0x1234在UTF16和32中是相同的,但在UTF8中当然不存在。 不幸的是,我不知道有什么方法可以确定给定的字符0xAB是否以ASCII格式给出,以及在哪个代码页或UTF8中。事实上,我怀疑有没有办法…

好的,c中的字符串总是Unicode。在这种情况下,您可以循环检查字符串的每个字符,并检查其数值是否符合特定的编码。例如,准确地说,带有0x1234的unicode字符不适合ASCII范围0x00-0xFF 0x7F

编辑 ASCII:7-8位。第8位字符取决于代码页,这意味着相同的数值将在不同的代码页中显示为不同的字符。没机会改变,阿福。 UTF7:应该非常罕见,根据维基百科的说法,这不是标准的一部分。 UTF8:8位,与上半部分的ASCII相同。 UTF16,32:16分别。32位。 好的,字符0x1234在UTF16和32中是相同的,但在UTF8中当然不存在。
不幸的是,我不知道有什么方法可以确定给定的字符0xAB是否以ASCII格式给出,以及在哪个代码页或UTF8中。事实上,我怀疑有没有办法…

我通过对字符串进行编码、解码,然后与原始字符串进行比较来解决这个问题。但这似乎效率极低

Encoding targetEncoding = Encoding.GetEncoding(28595);
var text = "Гранит";

var encodedBytes = targetEncoding.GetBytes(text);
var decodedText = targetEncoding.GetString(encodedBytes);

var textCanBeRepresentedByTargetEncoding = decodedText.Equals(text);

我通过对字符串进行编码、解码,然后将其与原始字符串进行比较来解决这个问题。但这似乎效率极低

Encoding targetEncoding = Encoding.GetEncoding(28595);
var text = "Гранит";

var encodedBytes = targetEncoding.GetBytes(text);
var decodedText = targetEncoding.GetString(encodedBytes);

var textCanBeRepresentedByTargetEncoding = decodedText.Equals(text);

我真的不喜欢在控制流中使用异常,但此解决方案的简单性绝对胜过创建自定义编码器回调:

用法:

Console.WriteLine(CanBeEncoded(1252, "Grüß Gott!")); // Prints True
Console.WriteLine(CanBeEncoded(1252, "Привет"));     // Prints False

我真的不喜欢在控制流中使用异常,但此解决方案的简单性绝对胜过创建自定义编码器回调:

用法:

Console.WriteLine(CanBeEncoded(1252, "Grüß Gott!")); // Prints True
Console.WriteLine(CanBeEncoded(1252, "Привет"));     // Prints False

当然可以,但是我如何知道在给定的编码中哪些值是有效的呢?如果是ASCII码,这很简单,但我不知道会给出哪种奇怪的编码。那么ISO-8859-1和其他我甚至不知道的编码呢?我无法控制将接收哪些编码。c中的字符串始终是Unicode:是的,语言规范从一开始就说明了这一点。不要害怕C规范;根据需要阅读部件很容易。ISO 8859-1是扩展ASCII的代码页之一。如果您收到的ASCII文本数据没有任何编码信息,您可以将其解释为任何内容!事实上,您已经收到一组字节。为了正确的解释,你肯定需要额外的信息。这不是我的意思。我有一个字符串和一个文本编写器。我不控制编写器的编码。我可以选择转义非ascii字符,但我希望尽可能保持文件的可读性。这就是为什么在写入字符串之前,我想知道是否可以使用TextWriter的编码来表示字符串。当然可以,但是我如何知道在给定的编码中哪些值是有效的呢?如果是ASCII码,这很简单,但我不知道会给出哪种奇怪的编码。那么ISO-8859-1和其他我甚至不知道的编码呢?我无法控制将接收哪些编码。c中的字符串始终是Unicode:是的,语言规范从一开始就说明了这一点。不要害怕C规范;根据需要阅读部件很容易。ISO 8859-1是扩展ASCII的代码页之一。如果您收到的ASCII文本数据没有任何编码信息,您可以将其解释为任何内容!事实上,您已经收到一组字节。为了正确的解释,你肯定需要额外的信息。这不是我的意思。我有一个字符串和一个文本编写器。我不控制编写器的编码。我有选择权
n以转义非ascii字符,但我希望尽可能保持文件的可读性。这就是为什么我想知道在写入字符串之前,是否可以使用TextWriter的编码来表示字符串。虽然我理解你的问题,但我看不到与序列化的关系,我不明白你为什么需要这些信息。希望有很多系统能够序列化字符串,而不包含这些信息。虽然与序列化没有严格的关系,但我遇到的问题是,输出格式是人类可读的。因此,如果编码支持,我希望直接编写文本。否则,该格式支持转义字符以ASCII编码任何代码点。您可以获取其他字符集与Unicode之间的映射列表,如以下所示:。我没有遇到过任何非Unicode字符集有多个编码。没有那么多奇怪的编码类。编码具有可以检查的IsSingleByte属性。如果这是真的,它很有可能需要逃走。除此之外,其他大部分都是UTFxx或Unicode,因此它们不需要转义。虽然我理解你的问题,但我看不出与序列化的关系,我不明白你为什么需要这些信息。希望有很多系统能够序列化字符串,而不包含这些信息。虽然与序列化没有严格的关系,但我遇到的问题是,输出格式是人类可读的。因此,如果编码支持,我希望直接编写文本。否则,该格式支持转义字符以ASCII编码任何代码点。您可以获取其他字符集与Unicode之间的映射列表,如以下所示:。我没有遇到过任何非Unicode字符集有多个编码。没有那么多奇怪的编码类。编码具有可以检查的IsSingleByte属性。如果这是真的,它很有可能需要逃走。否则,其他的大部分都是UTFxx或Unicode,因此它们不需要转义。如果您关注性能,我肯定会使用这样一个事实,即UTFxx和Unicode都是正常的,所有单字节都不是。这表示.NET中所有实际定义的编码,并将此算法用作不完全适合这两个类别或派生类的编码的最后手段。如果您关注性能,我肯定会使用以下事实:UTFxx和Unicode都可以,并且所有单字节都不是。这表示.NET中所有实际定义的编码,并将此算法用作不完全适合这两个类别或派生类的编码的最后手段。