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填充它?