C# ISO拉丁语1字节到字符

C# ISO拉丁语1字节到字符,c#,string,encoding,C#,String,Encoding,如果我有一个字节b编码为ISO拉丁语1(ISO 8859-1),这就足够了吗 char输出=(char)b这似乎有效,但我不知道是否还有其他方法。您可以使用该类,尤其是内置的从字节数组获取字符 特别是其中一个重载。我将使用。请记住,首先,.NET中的char在默认情况下是一个2字节的值-像这样简单的强制转换(即使它可以工作,也可能)并不是最好的主意。如果字节的值小于128,您就可以了。如果大于等于128,仅仅施放可能无法获得正确的角色 ISO代码页基本上都是ASCII,关键区别在于将代码页值的上

如果我有一个
字节b
编码为ISO拉丁语1(ISO 8859-1),这就足够了吗
char输出=(char)b这似乎有效,但我不知道是否还有其他方法。

您可以使用该类,尤其是内置的从字节数组获取字符


特别是其中一个重载。

我将使用。请记住,首先,.NET中的
char
在默认情况下是一个2字节的值-像这样简单的强制转换(即使它可以工作,也可能)并不是最好的主意。

如果字节的值小于128,您就可以了。如果大于等于128,仅仅施放可能无法获得正确的角色

ISO代码页基本上都是ASCII,关键区别在于将代码页值的上半部分(基本ASCII页上的IIRC主要是控制台应用程序中有用的线条艺术字符)替换为代码页语言中有用的字符


然而,快速查看一下Unicode代码页,就会发现Latin-1补充占据了80-FF值(128-255)。因此,在这个特定的例子中,您可能很好,但是如果出现了一些东西,例如西里尔语ISO代码页,您必须显式地转换为Unicode字符。

是的,这应该很好。如果您查看,8859-1和unicode之间存在一对一的映射。这意味着您可以将其强制转换为char


但是,并非所有代码页都是如此,因此一个更健壮的解决方案可能是一个好主意。

您可以使用
编码。Convert

        byte[] latin1 = new byte[]{}; // Your data goes here, obviously
        byte[] converted = Encoding.Convert(Encoding.GetEncoding("latin1"), Encoding.ASCII, latin1);

然后,您就可以使用新的字节数组,而不用担心拉丁语1是否会给您带来问题。

直接转换似乎适用于这种特定的编码。然而,最佳做法是使用适当转换的方法

private static readonly Encoding Iso88591 = Encoding.GetEncoding("ISO8859-1");

public static void Main() {
    var bytes = new Byte[] { 65 };
    var chars = Iso88591.GetChars(bytes);
}

我知道char是UTF-8,所以我不确定是否只是铸造它就可以工作。不正确。ASCII和UTF-8之间有一对一的映射。其他Unicode格式(如UTF-16)不以这种方式映射。这几乎是准确的。可惜不止一个8859-1标准。典型的ISO lossage.ISO-Latin-1是一个单字节,我是否用0填充它?